diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 35713bd8..a0cd0856 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -92,6 +92,8 @@ jobs: ./gradlew :core:nodejs18Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT ./gradlew :core:nodejs20Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly ./gradlew :core:nodejs20Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT + ./gradlew :core:nodejs24Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly + ./gradlew :core:nodejs24Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT - name: Push Release Images if: ${{ env.PUSH_RELEASE == 'true' }} working-directory: runtime diff --git a/README.md b/README.md index 515e2333..993cc602 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ The following Node.js runtime versions (with kind & image labels) are generated - Node.js 18 (`nodejs:18` & `openwhisk/action-nodejs-v18`) - Node.js 20 (`nodejs:20` & `openwhisk/action-nodejs-v20`) +- Node.js 24 (`nodejs:24` & `openwhisk/action-nodejs-v24`) This README documents the build, customisation and testing of these runtime images. diff --git a/core/nodejs24Action/.dockerignore b/core/nodejs24Action/.dockerignore new file mode 100644 index 00000000..a1d03cb9 --- /dev/null +++ b/core/nodejs24Action/.dockerignore @@ -0,0 +1,13 @@ +*.*~ +*.yaml +*.tmpl +*.gradle +.dockerignore +.project +.settings +build.xml +Dockerfile +logs +node_modules +package-lock.json +test.js diff --git a/core/nodejs24Action/CHANGELOG.md b/core/nodejs24Action/CHANGELOG.md new file mode 100644 index 00000000..649df581 --- /dev/null +++ b/core/nodejs24Action/CHANGELOG.md @@ -0,0 +1,24 @@ + + +# NodeJS 24 OpenWhisk Runtime Container + + +Node.js version = [24.5.0](https://nodejs.org/en/blog/release/v24.5.0) +OpenWhisk version = [OpenWhisk v3.21.8](https://www.npmjs.com/package/openwhisk) diff --git a/core/nodejs24Action/Dockerfile b/core/nodejs24Action/Dockerfile new file mode 100644 index 00000000..f309a461 --- /dev/null +++ b/core/nodejs24Action/Dockerfile @@ -0,0 +1,44 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +FROM node:24-bullseye + +# Initial update and some basics. +# +RUN apt-get update && apt-get install -y \ + imagemagick \ + graphicsmagick \ + zip \ + unzip \ + && rm -rf /var/lib/apt/lists/* + +# Add sources and copy the package.json to root container, +# so npm packages from user functions take precedence. +# +WORKDIR /nodejsAction +ADD . /nodejsAction/ +COPY package.json / + +# Customize runtime with additional packages. +# Install package globally so user packages can override. +# +RUN cd / && npm install --no-package-lock --production \ + && npm cache clean --force + +EXPOSE 8080 + +CMD node --expose-gc app.js diff --git a/core/nodejs24Action/build.gradle b/core/nodejs24Action/build.gradle new file mode 100644 index 00000000..71d79621 --- /dev/null +++ b/core/nodejs24Action/build.gradle @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +apply plugin: 'eclipse' +eclipse { + project { + natures 'org.eclipse.wst.jsdt.core.jsNature' + buildCommand 'org.eclipse.wst.jsdt.core.javascriptValidator' + } +} + +ext.dockerImageName = 'action-nodejs-v24' +apply from: '../../gradle/docker.gradle' + +distDocker.dependsOn 'copyPackageJson' +distDocker.dependsOn 'copyProxy' +distDocker.dependsOn 'copyRunner' +distDocker.dependsOn 'copyService' +distDocker.dependsOn 'copyPlatform' +distDocker.dependsOn 'copyOpenWhisk' +distDocker.dependsOn 'copyKnative' +distDocker.dependsOn 'copyBuildTemplate' +distDocker.finalizedBy('cleanup') + +task copyPackageJson(type: Copy) { + from '../nodejsActionBase/package.json' + into '.' +} + +task copyProxy(type: Copy) { + from '../nodejsActionBase/app.js' + into '.' +} + +task copyRunner(type: Copy) { + from '../nodejsActionBase/runner.js' + into '.' +} + +task copyService(type: Copy) { + from '../nodejsActionBase/src/service.js' + into './src' +} + +task copyPlatform(type: Copy) { + from '../nodejsActionBase/platform/platform.js' + into './platform' +} + +task copyOpenWhisk(type: Copy) { + from '../nodejsActionBase/platform/openwhisk.js' + into './platform' +} + +task copyKnative(type: Copy) { + from '../nodejsActionBase/platform/knative.js' + into './platform' +} + +task copyBuildTemplate(type: Copy) { + from '../nodejsActionBase/buildtemplate.yaml' + into '.' +} + +task cleanup(type: Delete) { + delete 'package.json' + delete 'app.js' + delete 'runner.js' + delete 'src' + delete 'platform' + delete 'buildtemplate.yaml' +} diff --git a/settings.gradle b/settings.gradle index 4d476cd8..09aaeb8c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,8 +20,10 @@ include 'tests' include 'core:nodejsActionBase' include 'core:nodejs18Action' include 'core:nodejs20Action' +include 'core:nodejs24Action' include 'tests:dat:docker:nodejs18docker' include 'tests:dat:docker:nodejs20docker' +include 'tests:dat:docker:nodejs24docker' rootProject.name = 'runtime-nodejs' diff --git a/tests/src/test/scala/runtime/actionContainers/NodeJs24ActionContainerTest.scala b/tests/src/test/scala/runtime/actionContainers/NodeJs24ActionContainerTest.scala new file mode 100644 index 00000000..88d9038c --- /dev/null +++ b/tests/src/test/scala/runtime/actionContainers/NodeJs24ActionContainerTest.scala @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package runtime.actionContainers + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner + +@RunWith(classOf[JUnitRunner]) +class NodeJs24ActionContainerTests extends NodeJsActionContainerTests { + override lazy val nodejsContainerImageName = "action-nodejs-v24" + override lazy val nodejsTestDockerImageName = "nodejs24docker" +} diff --git a/tests/src/test/scala/runtime/actionContainers/NodeJs24ConcurrentTests.scala b/tests/src/test/scala/runtime/actionContainers/NodeJs24ConcurrentTests.scala new file mode 100644 index 00000000..9970f2c7 --- /dev/null +++ b/tests/src/test/scala/runtime/actionContainers/NodeJs24ConcurrentTests.scala @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package runtime.actionContainers + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner + +@RunWith(classOf[JUnitRunner]) +class NodeJs24ConcurrentTests extends NodeJsConcurrentTests { + override lazy val nodejsContainerImageName = "action-nodejs-v24" + override lazy val nodejsTestDockerImageName = "nodejs24docker" +}