Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Implement script runner microservice - #7896

Merged
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter
Jan 24, 2025
Merged

Implement script runner microservice#7896
ryancooley merged 9 commits into
release-2025-winterfrom
rest-script-runner-2025-winter

Conversation

@gusys

Copy link
Copy Markdown
Contributor

Change class name of script microservice runner

Add config for microservice ruuner

Add callback route

Remove send first response in TestScript

Add version script in env file

Move callback to api

Implement script microservice in runscripttask.php

Remove config of script-runners

Adding type column to script executor table

Change int for bool to sync variable

fix composer.json file

Fix api environment variables

Fix script language capitalize

Fix null version field

Change output name in json callback

Remove json_decode in output response

Add script executor enabled flag

Rollback _fonts.scss file

Issue & Reproduction Steps

Describe the issue this ticket solves and describe how to reproduce the issue (please attach any fixtures used to reproduce the issue).

Solution

  • List the changes you've introduced to solve the issue.

How to Test

Describe how to test that this solution works.

Related Tickets & Packages

  • Link to any related FOUR tickets, PRDs, or packages

Code Review Checklist

  • I have pulled this code locally and tested it on my instance, along with any associated packages.
  • This code adheres to ProcessMaker Coding Guidelines.
  • This code includes a unit test or an E2E test that tests its functionality, or is covered by an existing test.
  • This solution fixes the bug reported in the original ticket.
  • This solution does not alter the expected output of a component in a way that would break existing Processes.
  • This solution does not implement any breaking changes that would invalidate documentation or cause existing Processes to fail.
  • This solution has been tested with enterprise packages that rely on its functionality and does not introduce bugs in those packages.
  • This code does not duplicate functionality that already exists in the framework or in ProcessMaker.
  • This ticket conforms to the PRD associated with this part of ProcessMaker.

Change class name of script microservice runner
Add config for microservice ruuner
Add callback route
Remove send first response in TestScript
Add version script in env file
Move callback to api
Implement script microservice in runscripttask.php
Remove config of script-runners
Adding type column to script executor table
Change int for bool to sync variable
fix composer.json file
Fix api environment variables
Fix script language capitalize
Fix null version field
Change output name in json callback
Remove json_decode in output response
Add script executor enabled flag
Rollback _fonts.scss file
{
$scriptMicroserviceService = new ScriptMicroserviceService();
$scriptMicroserviceService->handle($request);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @gusys should we add error handling to catch any potential exceptions from the microservice execution?

Comment threadProcessMaker/ScriptRunners/ScriptRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php Outdated

@nolanpronolanpro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys Looks good, please see my comments.

There are a few failing unit tests that need to be fixed.

I think we should have clear instructions in the README for how developers can use the service.

For most day-to-day development, the engineer’s local environment should connect to the hosted microservice development cluster.

However, when changes need to be made to microservice or custom executors, the engineer should be able to switch use their local cluster (environment variable) and easily build and execute images locally. The local development cluster should closely resemble the production instance. This could be done through Minikube, k3s, docker compose, etc. Whichever one you choose, I think the local configuration file and instructions should be included in core.

* @param array $config
*/
public function runScript(array $data, array $config, $tokenId = '', $timeout = null)
public function runScript(array $data, array $config, $tokenId = '', $timeout = null, $sync = 1, $metadata = [])

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys could you change $sync = 1 to bool $sync = true? You can change it in ScriptMicroserviceRunner if you need to send it as an integer 'sync' => $sync ? 1 : 0,

There are a few other places we call runScript, like RunServiceTask.php. Do those need to be updated?

Comment threadconfig/script-runner-microservice.php
'token_id' => $this->tokenId,
],
];
$response = $script->runScript($data, $configuration, $token->getId(), $errorHandling->timeout(), 0, $metadata);

@nolanpronolanproJan 15, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys if this is an asynchronous execution, what endpoint are we using for the callback? Is it /scripts/microservice/execution? Is that also the callback when executed from TestScript.php?

Comment threadroutes/api.php Outdated
});
});

Route::prefix('api')->name('api.')->group(function () {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gusys looks like this endpoint has no security. How will this be protected?

Comment threadProcessMaker/ScriptRunners/ScriptMicroserviceRunner.php Outdated
Comment threadProcessMaker/Services/ScriptMicroserviceService.php
@processmaker-sonarqube

Copy link
Copy Markdown

Quality Gate passedQuality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
No data about Duplication

See analysis details on SonarQube

@ryancooley
ryancooley merged commit fefe5f4 into release-2025-winterJan 24, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@gusys@ryancooley@nolanpro@epdl@sanjacornelius