You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ja...@apache.org on 2019/05/07 12:17:52 UTC

[incubator-openwhisk-runtime-nodejs] branch master updated: Adding Node.js v12 runtime. (#126)

This is an automated email from the ASF dual-hosted git repository.

jamesthomas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-runtime-nodejs.git


The following commit(s) were added to refs/heads/master by this push:
     new 386b13d  Adding Node.js v12 runtime. (#126)
386b13d is described below

commit 386b13d5642e7e8d9dee00913fc97d529c9637ef
Author: James Thomas <ja...@jamesthom.as>
AuthorDate: Tue May 7 13:17:47 2019 +0100

    Adding Node.js v12 runtime. (#126)
    
    - Re-used nodejs10Action directory for new v12 runtime.
    - Re-wrote the README to be contain instructions which actually work!
---
 README.md                                          | 159 +++++++++------------
 core/nodejs10Action/package.json                   |   2 +-
 core/nodejs12Action/.dockerignore                  |   8 ++
 core/nodejs12Action/CHANGELOG.md                   |  27 ++++
 core/nodejs12Action/Dockerfile                     |  32 +++++
 core/nodejs12Action/build.gradle                   |  79 ++++++++++
 .../package.json                                   |   2 +-
 settings.gradle                                    |   2 +
 tests/dat/docker/nodejs12docker/Dockerfile         |   3 +
 .../dat/docker/nodejs12docker/build.gradle         |  27 +---
 tests/dat/docker/nodejs12docker/package.json       |   8 ++
 .../NodeJs12ActionContainerTests.scala             |  31 ++--
 .../actionContainers/NodeJs12ConcurrentTests.scala |  31 ++--
 tools/travis/publish.sh                            |   2 +
 14 files changed, 250 insertions(+), 163 deletions(-)

diff --git a/README.md b/README.md
index 3e10d0b..5a21d5f 100644
--- a/README.md
+++ b/README.md
@@ -17,141 +17,120 @@
 #
 -->
 
-# Apache OpenWhisk runtimes for nodejs
+# Apache OpenWhisk runtimes for Node.js
 
 [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0)
 [![Build Status](https://travis-ci.org/apache/incubator-openwhisk-runtime-nodejs.svg?branch=master)](https://travis-ci.org/apache/incubator-openwhisk-runtime-nodejs)
 
+This repository contains sources files needed to build the Node.js runtimes for Apache OpenWhisk. The build system will produce a series of docker images for each runtime version. These images are used in the platform to execute Node.js actions.
 
-### Give it a try today
-To use as a docker action for Node.js 6
-```
-wsk action update myAction myAction.js --docker openwhisk/nodejs6action
-```
-To use as a docker action for Node.js 8
-```
-wsk action update myAction myAction.js --docker openwhisk/action-nodejs-v8
-```
-This works on any deployment of Apache OpenWhisk
+The following Node.js runtime versions (with kind & image labels) are generated by the build system:
+
+- Node.js 6.17.0 (`nodejs:6  ` & `openwhisk/nodejs6action`)
+- Node.js 8.15.1 (`nodejs:8` & `openwhisk/action-nodejs-v8`)
+- Node.js 10.15.2 (`nodejs:10` &  `openwhisk/action-nodejs-v10`)
+- Node.js 12.0.0 (`nodejs:12` & `openwhisk/action-nodejs-v12`)
+
+This README documents the build, customisation and testing of these runtime images.
+
+**Do you want to learn more about using Node.js actions to build serverless applications?** Please see the main project documentation [here](https://github.com/apache/incubator-openwhisk/blob/master/docs/actions-nodejs.md) for that information.
+
+## Usage
+
+If the deployment of Apache OpenWhisk includes these images in the runtime manifest, use the `--kind` parameter to select the Node.js runtime version.
+
+### Node.js v6
 
-### To use on deployment that contains the runtime as a kind
-To use as a kind action using Node.js 6
 ```
 wsk action update myAction myAction.js --kind nodejs:6
 ```
-To use as a kind action using Node.js 8
+
+### Node.js v8
+
 ```
 wsk action update myAction myAction.js --kind nodejs:8
 ```
 
-### Local development
-For Node.js 6
-```
-./gradlew core:nodejs6Action:distDocker
-```
-This will produce the image `whisk/nodejs6action`
+### Node.js v10
 
-For Node.js 8
 ```
-./gradlew core:nodejs8Action:distDocker
+wsk action update myAction myAction.js --kind nodejs:10
 ```
-This will produce the image `whisk/action-nodejs-v8`
 
-For Node.js 10
+### Node.js v12
+
 ```
-./gradlew core:nodejs10Action:distDocker
+wsk action update myAction myAction.js --kind nodejs:12
 ```
-This will produce the image `whisk/action-nodejs-v10`
 
+## Images
 
-Build and Push image for Node.js 6
-```
-docker login
-./gradlew core:nodejs6Action:distDocker -PdockerImagePrefix=$prefix-user -PdockerRegistry=docker.io
-```
+All the runtime images are published by the project to Docker Hub @ [https://hub.docker.com/u/openwhisk](https://hub.docker.com/u/openwhisk)
+
+- [https://hub.docker.com/r/openwhisk/nodejs6action](https://hub.docker.com/r/openwhisk/nodejs6action)
+- [https://hub.docker.com/r/openwhisk/action-nodejs-v8](https://hub.docker.com/r/openwhisk/action-nodejs-v8)
+- [https://hub.docker.com/r/openwhisk/action-nodejs-v10](https://hub.docker.com/r/openwhisk/action-nodejs-v10)
+- [https://hub.docker.com/r/openwhisk/action-nodejs-v12](https://hub.docker.com/r/openwhisk/action-nodejs-v12)
+
+These images can be used to execute Node.js actions on any deployment of Apache OpenWhisk, even those without those images defined the in runtime manifest, using the `--docker` action parameter.
 
-Build and Push image for Node.js 8
-```
-docker login
-./gradlew core:nodejs8Action:distDocker -PdockerImagePrefix=$prefix-user -PdockerRegistry=docker.io
-```
-Then create the action using your image from dockerhub
 ```
-wsk action update myAction myAction.js --docker $user_prefix/nodejs6action
+wsk action update myAction myAction.js --docker openwhisk/action-nodejs-v12
 ```
-The `$user_prefix` is usually your dockerhub user id.
 
-Deploy OpenWhisk using ansible environment that contains the kind `nodejs:6` and `nodejs:8`
-Assuming you have OpenWhisk already deployed locally and `OPENWHISK_HOME` pointing to root directory of OpenWhisk core repository.
+If you build a custom version of the images, pushing those an external Docker Hub repository will allow you to use those on the Apache OpenWhisk deployment.
 
-Set `ROOTDIR` to the root directory of this repository.
+### Runtimes Manifest
 
-Redeploy OpenWhisk
-```
-cd $OPENWHISK_HOME/ansible
-ANSIBLE_CMD="ansible-playbook -i ${ROOTDIR}/ansible/environments/local"
-$ANSIBLE_CMD setup.yml
-$ANSIBLE_CMD couchdb.yml
-$ANSIBLE_CMD initdb.yml
-$ANSIBLE_CMD wipe.yml
-$ANSIBLE_CMD openwhisk.yml
-```
+Available runtimes in Apache OpenWhisk are defined using the runtimes manifest in this file: [runtimes.json](https://github.com/apache/incubator-openwhisk/blob/9dacce433cfdd64aa1e4f5c8eab6db31df8c4eae/ansible/files/runtimes.json#L3-L52)
+
+Modify the manifest and re-deploy the platform to pick up local images changes.
+
+## Development
+
+Dockerfiles for runtime images are defined in the `core` directory. Each runtime version folder has a custom `Dockerfile` and `package.json`. If you need to add extra dependencies to a runtime version - modify these files.
+
+The `core/nodejsActionBase` folder contains the Node.js app server used to implement the [action interface](https://github.com/apache/incubator-openwhisk/blob/master/docs/actions-new.md#action-interface), used by the platform to inject action code into the runtime and fire invocation requests. This common code is used in all runtime versions.
+
+### Build
+
+- Run the `distDocker` command to generate local Docker images for the different runtime versions.
 
-Or you can use `wskdev` and create a soft link to the target ansible environment, for example:
 ```
-ln -s ${ROOTDIR}/ansible/environments/local ${OPENWHISK_HOME}/ansible/environments/local-nodejs
-wskdev fresh -t local-nodejs
+./gradlew core:nodejs6Action:distDocker
+./gradlew core:nodejs8Action:distDocker
+./gradlew core:nodejs10Action:distDocker
+./gradlew core:nodejs12Action:distDocker
 ```
 
+This will return the following runtime images with the following names: `nodejs6action`,  `action-nodejs-v8`, `action-nodejs-v10` and `action-nodejs-v12`.
+
 ### Testing
-Install dependencies from the root directory on $OPENWHISK_HOME repository
-```
-./gradlew install
-```
 
-Using gradle for the ActionContainer tests you need to use a proxy if running on Mac, if Linux then don't use proxy options
-You can pass the flags `-Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128` directly in gradle command.
-Or save in your `$HOME/.gradle/gradle.properties`
-```
-systemProp.http.proxyHost=localhost
-systemProp.http.proxyPort=3128
-```
-Using gradle to run all tests
-```
-./gradlew :tests:test
-```
-Using gradle to run some tests
-```
-./gradlew :tests:test --tests *ActionContainerTests*
-```
-Using IntelliJ:
-- Import project as gradle project.
-- Make sure working directory is root of the project/repo
-- Add the following Java VM properties in ScalaTests Run Configuration, easiest is to change the Defaults for all ScalaTests to use this VM properties
+- Install project dependencies from the top-level Apache OpenWhisk [project](https://github.com/apache/incubator-openwhisk), which ensures correct versions of dependent libraries are available in the Maven cache.
+
 ```
--Dhttp.proxyHost=localhost
--Dhttp.proxyPort=3128
+./gradlew install
 ```
 
-### How to use ESLint?
+*This command **MUST BE** run from the directory containing the main Apache OpenWhisk [repository](https://github.com/apache/incubator-openwhisk), not this repository's directory.*
 
-ESLint can fix syntactic errors automatically by running:
+- Build the local Docker images for the runtime versions (see the instructions above).
+- Build the custom Docker images used in local testing.
 
 ```
-git clone https://github.com/apache/incubator-openwhisk-runtime-nodejs.git
-cd core/nodejsActionBase
-npm install
-./node_modules/.bin/eslint --fix --ignore-path .gitignore .
+./gradlew tests:dat:docker:nodejs6docker:distDocker
+./gradlew tests:dat:docker:nodejs8docker:distDocker
+./gradlew tests:dat:docker:nodejs10docker:distDocker
+./gradlew tests:dat:docker:nodejs12docker:distDocker
 ```
 
-`eslint` might produce few errors/warnings along with auto fixing syntax errors:
+- Run the project tests.
 
 ```
-✖ 3 problems (3 errors, 0 warnings)
+./gradlew :tests:test
 ```
 
-ESLint configuration file is located at (.eslintrc.json)[core/nodejsActionBase/.eslintrc.json] which can be updated if needed.
-
 # Disclaimer
 
 Apache OpenWhisk Runtime Node.js is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicat [...]
diff --git a/core/nodejs10Action/package.json b/core/nodejs10Action/package.json
index a28200a..baaf0ff 100644
--- a/core/nodejs10Action/package.json
+++ b/core/nodejs10Action/package.json
@@ -1,5 +1,5 @@
 {
-  "name": "action-nodejs-v8",
+  "name": "action-nodejs-v10",
   "version": "1.0.0",
   "description": "Apache OpenWhisk NodeJS Runtime",
   "repository": {
diff --git a/core/nodejs12Action/.dockerignore b/core/nodejs12Action/.dockerignore
new file mode 100644
index 0000000..3081e3e
--- /dev/null
+++ b/core/nodejs12Action/.dockerignore
@@ -0,0 +1,8 @@
+node_modules
+package-lock.json
+Dockerfile
+build.gradle
+.project
+.settings
+build.xml
+logs
\ No newline at end of file
diff --git a/core/nodejs12Action/CHANGELOG.md b/core/nodejs12Action/CHANGELOG.md
new file mode 100644
index 0000000..809c13c
--- /dev/null
+++ b/core/nodejs12Action/CHANGELOG.md
@@ -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.
+#
+-->
+
+# NodeJS 12 OpenWhisk Runtime Container
+
+## Apache 1.14 (next release)
+Changes:
+- Adding Nodejs version 12
+- [openwhisk v3.18.0](https://www.npmjs.com/package/openwhisk) - JavaScript client library for the OpenWhisk platform. Provides a wrapper around the OpenWhisk APIs.
+
+Node.js version = [12.1.0](https://nodejs.org/en/blog/release/v12.1.0/)
diff --git a/core/nodejs12Action/Dockerfile b/core/nodejs12Action/Dockerfile
new file mode 100644
index 0000000..ebbf54f
--- /dev/null
+++ b/core/nodejs12Action/Dockerfile
@@ -0,0 +1,32 @@
+#
+# 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:12.0.0-stretch
+RUN apt-get update && apt-get install -y \
+    imagemagick \
+    graphicsmagick \
+    unzip \
+    && rm -rf /var/lib/apt/lists/*
+WORKDIR /nodejsAction
+COPY . .
+# COPY the package.json to root container, so we can install npm packages a level up from user's packages, so user's packages take precedence
+COPY ./package.json /
+RUN cd / && npm install --no-package-lock \
+    && npm cache clean --force
+EXPOSE 8080
+
+CMD node --expose-gc app.js
diff --git a/core/nodejs12Action/build.gradle b/core/nodejs12Action/build.gradle
new file mode 100644
index 0000000..203a5c1
--- /dev/null
+++ b/core/nodejs12Action/build.gradle
@@ -0,0 +1,79 @@
+/*
+ * 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-v12'
+apply from: '../../gradle/docker.gradle'
+
+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 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 'app.js'
+    delete 'runner.js'
+    delete 'src'
+    delete 'platform'
+    delete 'buildtemplate.yaml'
+}
diff --git a/core/nodejs10Action/package.json b/core/nodejs12Action/package.json
similarity index 92%
copy from core/nodejs10Action/package.json
copy to core/nodejs12Action/package.json
index a28200a..734d271 100644
--- a/core/nodejs10Action/package.json
+++ b/core/nodejs12Action/package.json
@@ -1,5 +1,5 @@
 {
-  "name": "action-nodejs-v8",
+  "name": "action-nodejs-v12",
   "version": "1.0.0",
   "description": "Apache OpenWhisk NodeJS Runtime",
   "repository": {
diff --git a/settings.gradle b/settings.gradle
index 20728ed..563a83e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -21,9 +21,11 @@ include 'core:nodejsActionBase'
 include 'core:nodejs6Action'
 include 'core:nodejs8Action'
 include 'core:nodejs10Action'
+include 'core:nodejs12Action'
 include 'tests:dat:docker:nodejs6docker'
 include 'tests:dat:docker:nodejs8docker'
 include 'tests:dat:docker:nodejs10docker'
+include 'tests:dat:docker:nodejs12docker'
 
 rootProject.name = 'runtime-nodejs'
 
diff --git a/tests/dat/docker/nodejs12docker/Dockerfile b/tests/dat/docker/nodejs12docker/Dockerfile
new file mode 100644
index 0000000..c586748
--- /dev/null
+++ b/tests/dat/docker/nodejs12docker/Dockerfile
@@ -0,0 +1,3 @@
+FROM action-nodejs-v12
+COPY package.json .
+RUN npm install --production
diff --git a/settings.gradle b/tests/dat/docker/nodejs12docker/build.gradle
similarity index 56%
copy from settings.gradle
copy to tests/dat/docker/nodejs12docker/build.gradle
index 20728ed..aa867c8 100644
--- a/settings.gradle
+++ b/tests/dat/docker/nodejs12docker/build.gradle
@@ -15,28 +15,5 @@
  * limitations under the License.
  */
 
-include 'tests'
-
-include 'core:nodejsActionBase'
-include 'core:nodejs6Action'
-include 'core:nodejs8Action'
-include 'core:nodejs10Action'
-include 'tests:dat:docker:nodejs6docker'
-include 'tests:dat:docker:nodejs8docker'
-include 'tests:dat:docker:nodejs10docker'
-
-rootProject.name = 'runtime-nodejs'
-
-gradle.ext.openwhisk = [
-        version: '1.0.0-SNAPSHOT'
-]
-
-gradle.ext.scala = [
-    version: '2.12.7',
-    compileFlags: ['-feature', '-unchecked', '-deprecation', '-Xfatal-warnings', '-Ywarn-unused-import']
-]
-
-gradle.ext.scalafmt = [
-    version: '1.5.0',
-    config: new File(rootProject.projectDir, '.scalafmt.conf')
-]
+ext.dockerImageName = 'nodejs12docker'
+apply from: '../../../../gradle/docker.gradle'
diff --git a/tests/dat/docker/nodejs12docker/package.json b/tests/dat/docker/nodejs12docker/package.json
new file mode 100644
index 0000000..6822c09
--- /dev/null
+++ b/tests/dat/docker/nodejs12docker/package.json
@@ -0,0 +1,8 @@
+{
+  "name": "testdocker",
+  "version": "1.0.0",
+  "main": "index.js",
+  "dependencies": {
+    "openwhisk": "2.0.0"
+  }
+}
diff --git a/settings.gradle b/tests/src/test/scala/runtime/actionContainers/NodeJs12ActionContainerTests.scala
similarity index 56%
copy from settings.gradle
copy to tests/src/test/scala/runtime/actionContainers/NodeJs12ActionContainerTests.scala
index 20728ed..d04fb0b 100644
--- a/settings.gradle
+++ b/tests/src/test/scala/runtime/actionContainers/NodeJs12ActionContainerTests.scala
@@ -15,28 +15,13 @@
  * limitations under the License.
  */
 
-include 'tests'
+package runtime.actionContainers
 
-include 'core:nodejsActionBase'
-include 'core:nodejs6Action'
-include 'core:nodejs8Action'
-include 'core:nodejs10Action'
-include 'tests:dat:docker:nodejs6docker'
-include 'tests:dat:docker:nodejs8docker'
-include 'tests:dat:docker:nodejs10docker'
+import org.junit.runner.RunWith
+import org.scalatest.junit.JUnitRunner
 
-rootProject.name = 'runtime-nodejs'
-
-gradle.ext.openwhisk = [
-        version: '1.0.0-SNAPSHOT'
-]
-
-gradle.ext.scala = [
-    version: '2.12.7',
-    compileFlags: ['-feature', '-unchecked', '-deprecation', '-Xfatal-warnings', '-Ywarn-unused-import']
-]
-
-gradle.ext.scalafmt = [
-    version: '1.5.0',
-    config: new File(rootProject.projectDir, '.scalafmt.conf')
-]
+@RunWith(classOf[JUnitRunner])
+class NodeJs12ActionContainerTests extends NodeJs8ActionContainerTests {
+  override lazy val nodejsContainerImageName = "action-nodejs-v12"
+  override lazy val nodejsTestDockerImageName = "nodejs12docker"
+}
diff --git a/settings.gradle b/tests/src/test/scala/runtime/actionContainers/NodeJs12ConcurrentTests.scala
similarity index 56%
copy from settings.gradle
copy to tests/src/test/scala/runtime/actionContainers/NodeJs12ConcurrentTests.scala
index 20728ed..a49972c 100644
--- a/settings.gradle
+++ b/tests/src/test/scala/runtime/actionContainers/NodeJs12ConcurrentTests.scala
@@ -15,28 +15,13 @@
  * limitations under the License.
  */
 
-include 'tests'
+package runtime.actionContainers
 
-include 'core:nodejsActionBase'
-include 'core:nodejs6Action'
-include 'core:nodejs8Action'
-include 'core:nodejs10Action'
-include 'tests:dat:docker:nodejs6docker'
-include 'tests:dat:docker:nodejs8docker'
-include 'tests:dat:docker:nodejs10docker'
+import org.junit.runner.RunWith
+import org.scalatest.junit.JUnitRunner
 
-rootProject.name = 'runtime-nodejs'
-
-gradle.ext.openwhisk = [
-        version: '1.0.0-SNAPSHOT'
-]
-
-gradle.ext.scala = [
-    version: '2.12.7',
-    compileFlags: ['-feature', '-unchecked', '-deprecation', '-Xfatal-warnings', '-Ywarn-unused-import']
-]
-
-gradle.ext.scalafmt = [
-    version: '1.5.0',
-    config: new File(rootProject.projectDir, '.scalafmt.conf')
-]
+@RunWith(classOf[JUnitRunner])
+class NodeJs12ConcurrentTests extends NodeJsConcurrentTests {
+  override lazy val nodejsContainerImageName = "action-nodejs-v12"
+  override lazy val nodejsTestDockerImageName = "nodejs8docker"
+}
diff --git a/tools/travis/publish.sh b/tools/travis/publish.sh
index 4b53bb5..e2ca1c3 100755
--- a/tools/travis/publish.sh
+++ b/tools/travis/publish.sh
@@ -36,6 +36,8 @@ elif [ ${RUNTIME_VERSION} == "8" ]; then
   RUNTIME="nodejs8Action"
 elif [ ${RUNTIME_VERSION} == "10" ]; then
   RUNTIME="nodejs10Action"
+elif [ ${RUNTIME_VERSION} == "12" ]; then
+  RUNTIME="nodejs12Action"
 fi
 
 if [[ ! -z ${DOCKER_USER} ]] && [[ ! -z ${DOCKER_PASSWORD} ]]; then