From b9fd0dc58b9a01a51eb2f355a77b9b8b5972e015 Mon Sep 17 00:00:00 2001 From: Saravanesh Selvaraj Date: Thu, 19 Feb 2026 14:39:41 -0700 Subject: [PATCH 1/6] FEATURE-RELEASE: ASSETS-63714 - Added support for Node.js 24 in actionrunner and corresponding tests. Updated actionrunner.js to include Node.js 24 runtime and enhanced test coverage in actionrunner.test.js and test-worker.test.js to validate functionality with the new version. --- src/lib/actionrunner.js | 1 + test-projects/node24/.gitignore | 2 ++ test-projects/node24/manifest.yml | 9 ++++++++ test-projects/node24/package.json | 8 +++++++ .../test/asset-compute/worker/simple/file.jpg | Bin 0 -> 6484 bytes .../asset-compute/worker/simple/rendition.jpg | Bin 0 -> 6484 bytes test-projects/node24/worker.js | 20 +++++++++++++++++ test/commands/test-worker.test.js | 16 +++++++++++++ test/lib/actionrunner.test.js | 21 ++++++++++++++++++ 9 files changed, 77 insertions(+) create mode 100644 test-projects/node24/.gitignore create mode 100644 test-projects/node24/manifest.yml create mode 100644 test-projects/node24/package.json create mode 100644 test-projects/node24/test/asset-compute/worker/simple/file.jpg create mode 100644 test-projects/node24/test/asset-compute/worker/simple/rendition.jpg create mode 100644 test-projects/node24/worker.js diff --git a/src/lib/actionrunner.js b/src/lib/actionrunner.js index 62b97e2..1eea7ed 100644 --- a/src/lib/actionrunner.js +++ b/src/lib/actionrunner.js @@ -38,6 +38,7 @@ const OPENWHISK_DEFAULTS = { // "nodejs:12" : removed - Node.js 12 is end-of-life and incompatible with modern dependencies "nodejs:14" : "adobeapiplatform/adobe-action-nodejs-v14:3.0.43", // see: https://hub.docker.com/r/adobeapiplatform/adobe-action-nodejs-v14/tags "nodejs:16" : "adobeapiplatform/adobe-action-nodejs-v16:3.0.43", // see: https://hub.docker.com/r/adobeapiplatform/adobe-action-nodejs-v16/tags + "nodejs:24" : "adobeapiplatform/adobe-action-nodejs-v24:3.0.44", // see: https://hub.docker.com/r/adobeapiplatform/adobe-action-nodejs-v24/tags // "python" : "openwhisk/python2action:latest", // "python:2" : "openwhisk/python2action:latest", // "python:3" : "openwhisk/python3action:latest", diff --git a/test-projects/node24/.gitignore b/test-projects/node24/.gitignore new file mode 100644 index 0000000..4df65d4 --- /dev/null +++ b/test-projects/node24/.gitignore @@ -0,0 +1,2 @@ +rendition* +!test/**/rendition* \ No newline at end of file diff --git a/test-projects/node24/manifest.yml b/test-projects/node24/manifest.yml new file mode 100644 index 0000000..308e049 --- /dev/null +++ b/test-projects/node24/manifest.yml @@ -0,0 +1,9 @@ +packages: + __APP_PACKAGE__: + actions: + worker: + function: 'worker.js' + runtime: 'nodejs:24' + web: true + annotations: + require-adobe-auth: true diff --git a/test-projects/node24/package.json b/test-projects/node24/package.json new file mode 100644 index 0000000..030cadd --- /dev/null +++ b/test-projects/node24/package.json @@ -0,0 +1,8 @@ +{ + "name": "worker", + "version": "1.0.0", + "dependencies": { + "@adobe/asset-compute-sdk": "^4.6.2" + }, + "private": true +} diff --git a/test-projects/node24/test/asset-compute/worker/simple/file.jpg b/test-projects/node24/test/asset-compute/worker/simple/file.jpg new file mode 100644 index 0000000000000000000000000000000000000000..530b5e41cc62dd56d0cd92c1cdb0fe418e02c0dd GIT binary patch literal 6484 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 { + // copy source to rendition to transfer 1:1 + await fs.copyFile(source.path, rendition.path); +}); diff --git a/test/commands/test-worker.test.js b/test/commands/test-worker.test.js index f17bc2b..48728a9 100644 --- a/test/commands/test-worker.test.js +++ b/test/commands/test-worker.test.js @@ -253,6 +253,22 @@ describe("test-worker command", function() { assertTestResults("worker"); }); + testCommand("test-projects/node24", "asset-compute:test-worker") + .it("runs tests in a project using kind nodejs:24", function(ctx) { + assertExitCode(undefined); + assert(ctx.stdout.includes(" - simple")); + assert(ctx.stdout.includes("✔ Succeeded.")); + assert(ctx.stdout.includes("✔︎ All tests were successful.")); + assert(ctx.stdout.includes("- Tests run : 1")); + assert(ctx.stdout.includes("- Failures : 0")); + assert(ctx.stdout.includes("- Errors : 0")); + + assert(!fs.existsSync(".nui")); + assert(!fs.existsSync(path.join("actions", "worker", "build"))); + assertMissingOrEmptyDirectory("build", "test-worker"); + assertTestResults("worker"); + }); + testCommand("test-projects/test-hidden-file", "asset-compute:test-worker") .it("runs tests for a single worker with a hidden file in the test cases", function(ctx) { assertExitCode(undefined); diff --git a/test/lib/actionrunner.test.js b/test/lib/actionrunner.test.js index 8f1f897..f34bf0c 100644 --- a/test/lib/actionrunner.test.js +++ b/test/lib/actionrunner.test.js @@ -52,5 +52,26 @@ describe("actionrunner tests", function() { assert.strictEqual(error.message, 'Could not init action on container (POST http://0.0.0.0:2435\n::::2345/init: responded with error: 400'); } }); + it("failure during action initalization with nodejs:24 kind, body is empty", async function() { + const actionRunner = new OpenwhiskActionRunner({ + action: { + exec: { + kind: 'nodejs:24', + binary: true, + code: '2435' + } + } + }); + const containerHost = '0.0.0.0:2435\n::::2345'; + nock(`http://${containerHost}`).post("/init").reply(400); + + actionRunner._docker = () => {}; + actionRunner.containerHost = containerHost; + try { + await actionRunner._initAction(); + } catch (error) { + assert.strictEqual(error.message, 'Could not init action on container (POST http://0.0.0.0:2435\n::::2345/init: responded with error: 400'); + } + }); }); From c72dc1c2cedd8f1d972aebced2ac4e4ceb56188b Mon Sep 17 00:00:00 2001 From: Saravanesh Selvaraj Date: Thu, 19 Feb 2026 15:23:34 -0700 Subject: [PATCH 2/6] Update GitHub Actions workflow to use Node.js 24 and upgrade action versions to v4. Adjusted Node.js version in build steps and updated coverage report action. --- .github/workflows/node.js.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 1994a74..21dc201 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,12 +16,12 @@ jobs: if: "!contains(github.event.head_commit.message, '[ci skip]')" strategy: matrix: - node-version: [14.18, 16.13, 18] + node-version: [14.18, 16.13, 18, 24] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Docker login @@ -33,7 +33,7 @@ jobs: - run: npm test - run: npm run generate-coverage - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: file: ./coverage.lcov flags: unittests @@ -44,7 +44,7 @@ jobs: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, '[ci skip]')" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: npx @adobe/sizewatcher env: GITHUB_TOKEN: ${{ secrets.ADOBE_BOT_GITHUB_TOKEN }} @@ -54,13 +54,13 @@ jobs: needs: [build] if: ${{ !contains(github.event.head_commit.message, '[ci skip]') && github.ref == 'refs/heads/master' }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: persist-credentials: false - - name: Use Node.js 16 - uses: actions/setup-node@v3 + - name: Use Node.js 18 + uses: actions/setup-node@v4 with: - node-version: '16.13' + node-version: '18' - run: npm install - run: npm run semantic-release env: From 2e49ee330dc0027239da26ae2be57bad652b8da9 Mon Sep 17 00:00:00 2001 From: Saravanesh Selvaraj Date: Thu, 19 Feb 2026 16:03:54 -0700 Subject: [PATCH 3/6] Fix error handling in devtool command test to account for ECONNREFUSED code for Node 24 --- test/commands/devtool.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/commands/devtool.test.js b/test/commands/devtool.test.js index 59c405c..292b69d 100644 --- a/test/commands/devtool.test.js +++ b/test/commands/devtool.test.js @@ -108,7 +108,7 @@ describe("devtool command", function() { await fetch(url); assert.fail('Should have failed'); } catch (error) { - assert.ok(error.message.includes('ECONNREFUSED')); // should fail because server is no longer running + assert.ok(error.message.includes('ECONNREFUSED') || error.code === 'ECONNREFUSED'); } }); From 51d44aadc994d7df2772437ede45b7b5aa415234 Mon Sep 17 00:00:00 2001 From: Saravanesh Selvaraj Date: Fri, 20 Feb 2026 10:25:43 -0700 Subject: [PATCH 4/6] BREAKING-RELEASE: Remove Node.js 14 support and related files due to end-of-life status. Updated GitHub Actions workflow to exclude Node.js 14 from the matrix. Adjusted actionrunner.js and test-worker.test.js to reflect the removal of Node.js 14. Deleted associated test project files for Node.js 14. --- .github/workflows/node.js.yml | 2 +- src/lib/actionrunner.js | 2 +- test-projects/node14/.gitignore | 2 -- test-projects/node14/manifest.yml | 9 -------- test-projects/node14/package.json | 8 ------- .../test/asset-compute/worker/simple/file.jpg | Bin 6484 -> 0 bytes .../asset-compute/worker/simple/rendition.jpg | Bin 6484 -> 0 bytes test-projects/node14/worker.js | 20 ------------------ test/commands/test-worker.test.js | 16 +------------- 9 files changed, 3 insertions(+), 56 deletions(-) delete mode 100644 test-projects/node14/.gitignore delete mode 100644 test-projects/node14/manifest.yml delete mode 100644 test-projects/node14/package.json delete mode 100644 test-projects/node14/test/asset-compute/worker/simple/file.jpg delete mode 100644 test-projects/node14/test/asset-compute/worker/simple/rendition.jpg delete mode 100644 test-projects/node14/worker.js diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 21dc201..84d5a23 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: if: "!contains(github.event.head_commit.message, '[ci skip]')" strategy: matrix: - node-version: [14.18, 16.13, 18, 24] + node-version: [16.13, 18, 24] steps: - uses: actions/checkout@v4 diff --git a/src/lib/actionrunner.js b/src/lib/actionrunner.js index 1eea7ed..af14419 100644 --- a/src/lib/actionrunner.js +++ b/src/lib/actionrunner.js @@ -36,7 +36,7 @@ const OPENWHISK_DEFAULTS = { // "nodejs:8" : "openwhisk/action-nodejs-v8:latest", // "nodejs:10" : "adobeapiplatform/adobe-action-nodejs-v10:3.0.27", // see: https://hub.docker.com/r/adobeapiplatform/adobe-action-nodejs-v10/tags // "nodejs:12" : removed - Node.js 12 is end-of-life and incompatible with modern dependencies - "nodejs:14" : "adobeapiplatform/adobe-action-nodejs-v14:3.0.43", // see: https://hub.docker.com/r/adobeapiplatform/adobe-action-nodejs-v14/tags + // "nodejs:14" : removed - Node.js 14 is end-of-life and incompatible with modern dependencies "nodejs:16" : "adobeapiplatform/adobe-action-nodejs-v16:3.0.43", // see: https://hub.docker.com/r/adobeapiplatform/adobe-action-nodejs-v16/tags "nodejs:24" : "adobeapiplatform/adobe-action-nodejs-v24:3.0.44", // see: https://hub.docker.com/r/adobeapiplatform/adobe-action-nodejs-v24/tags // "python" : "openwhisk/python2action:latest", diff --git a/test-projects/node14/.gitignore b/test-projects/node14/.gitignore deleted file mode 100644 index 4df65d4..0000000 --- a/test-projects/node14/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -rendition* -!test/**/rendition* \ No newline at end of file diff --git a/test-projects/node14/manifest.yml b/test-projects/node14/manifest.yml deleted file mode 100644 index 5e6bef2..0000000 --- a/test-projects/node14/manifest.yml +++ /dev/null @@ -1,9 +0,0 @@ -packages: - __APP_PACKAGE__: - actions: - worker: - function: 'worker.js' - runtime: 'nodejs:14' - web: true - annotations: - require-adobe-auth: true diff --git a/test-projects/node14/package.json b/test-projects/node14/package.json deleted file mode 100644 index 027ba63..0000000 --- a/test-projects/node14/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "worker", - "version": "1.0.0", - "dependencies": { - "@adobe/asset-compute-sdk": "^2.10.6" - }, - "private": true -} diff --git a/test-projects/node14/test/asset-compute/worker/simple/file.jpg b/test-projects/node14/test/asset-compute/worker/simple/file.jpg deleted file mode 100644 index 530b5e41cc62dd56d0cd92c1cdb0fe418e02c0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6484 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 { - // copy source to rendition to transfer 1:1 - await fs.copyFile(source.path, rendition.path); -}); diff --git a/test/commands/test-worker.test.js b/test/commands/test-worker.test.js index 48728a9..f3e47eb 100644 --- a/test/commands/test-worker.test.js +++ b/test/commands/test-worker.test.js @@ -237,21 +237,7 @@ describe("test-worker command", function() { }); // nodejs:12 test removed - Node.js 12 is end-of-life and incompatible with modern dependencies - testCommand("test-projects/node14", "asset-compute:test-worker") - .it("runs tests in a project using kind nodejs:14", function(ctx) { - assertExitCode(undefined); - assert(ctx.stdout.includes(" - simple")); - assert(ctx.stdout.includes("✔ Succeeded.")); - assert(ctx.stdout.includes("✔︎ All tests were successful.")); - assert(ctx.stdout.includes("- Tests run : 1")); - assert(ctx.stdout.includes("- Failures : 0")); - assert(ctx.stdout.includes("- Errors : 0")); - - assert(!fs.existsSync(".nui")); - assert(!fs.existsSync(path.join("actions", "worker", "build"))); - assertMissingOrEmptyDirectory("build", "test-worker"); - assertTestResults("worker"); - }); + // nodejs:14 test removed - Node.js 14 is end-of-life and incompatible with modern dependencies testCommand("test-projects/node24", "asset-compute:test-worker") .it("runs tests in a project using kind nodejs:24", function(ctx) { From 8880f3ddd27979e57030dde2d48572f664337813 Mon Sep 17 00:00:00 2001 From: Saravanesh Selvaraj Date: Fri, 20 Feb 2026 11:58:35 -0700 Subject: [PATCH 5/6] Update GitHub Actions workflow to remove Node.js 24 from the matrix, maintaining support for Node.js 16.13 and 18. --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 84d5a23..48dc441 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: if: "!contains(github.event.head_commit.message, '[ci skip]')" strategy: matrix: - node-version: [16.13, 18, 24] + node-version: [16.13, 18] steps: - uses: actions/checkout@v4 From 1899a6393914b19eef0c9799cd2af714d03ba988 Mon Sep 17 00:00:00 2001 From: Saravanesh Selvaraj Date: Fri, 20 Feb 2026 12:34:58 -0700 Subject: [PATCH 6/6] Update GitHub Actions workflow to include Node.js 24 in the matrix. Modify test utility to handle process.exitCode assignment for Node.js 24 compatibility. Refactor actionrunner tests to improve error message assertions and remove unnecessary characters from containerHost. --- .github/workflows/node.js.yml | 2 +- test/commands/testutil.js | 6 ++++-- test/lib/actionrunner.test.js | 14 ++++++++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 48dc441..84d5a23 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: if: "!contains(github.event.head_commit.message, '[ci skip]')" strategy: matrix: - node-version: [16.13, 18] + node-version: [16.13, 18, 24] steps: - uses: actions/checkout@v4 diff --git a/test/commands/testutil.js b/test/commands/testutil.js index 1e81efb..f2fda84 100644 --- a/test/commands/testutil.js +++ b/test/commands/testutil.js @@ -72,7 +72,9 @@ function testCommand(dir, command, args=[]) { }) .finally(ctx => { // reset any exit code set by failing tests - delete process.exitCode; + // Note: `delete process.exitCode` does not work in Node.js 24+, + // must assign undefined instead + process.exitCode = undefined; delete process.env.AIO_ASSET_COMPUTE_LOG_DELAY; @@ -144,4 +146,4 @@ module.exports = { assertExitCode, assertOccurrences, assertMissingOrEmptyDirectory -}; \ No newline at end of file +}; diff --git a/test/lib/actionrunner.test.js b/test/lib/actionrunner.test.js index f34bf0c..b4f1e69 100644 --- a/test/lib/actionrunner.test.js +++ b/test/lib/actionrunner.test.js @@ -39,7 +39,7 @@ describe("actionrunner tests", function() { } } }); - const containerHost = '0.0.0.0:2435\n::::2345'; + const containerHost = '0.0.0.0:2435'; nock(`http://${containerHost}`).post("/init").reply(400); // mock docker to avoid errors with trying to get logs @@ -48,8 +48,11 @@ describe("actionrunner tests", function() { actionRunner.containerHost = containerHost; try { await actionRunner._initAction(); + assert.fail('should have thrown'); } catch (error) { - assert.strictEqual(error.message, 'Could not init action on container (POST http://0.0.0.0:2435\n::::2345/init: responded with error: 400'); + assert.ok(error.message.includes('Could not init action on container')); + assert.ok(error.message.includes('/init')); + assert.ok(error.message.includes('400')); } }); it("failure during action initalization with nodejs:24 kind, body is empty", async function() { @@ -62,15 +65,18 @@ describe("actionrunner tests", function() { } } }); - const containerHost = '0.0.0.0:2435\n::::2345'; + const containerHost = '0.0.0.0:2435'; nock(`http://${containerHost}`).post("/init").reply(400); actionRunner._docker = () => {}; actionRunner.containerHost = containerHost; try { await actionRunner._initAction(); + assert.fail('should have thrown'); } catch (error) { - assert.strictEqual(error.message, 'Could not init action on container (POST http://0.0.0.0:2435\n::::2345/init: responded with error: 400'); + assert.ok(error.message.includes('Could not init action on container')); + assert.ok(error.message.includes('/init')); + assert.ok(error.message.includes('400')); } });