remove Node.js v14 runtime

1. Node.js v14 is EOL as of 4/30/2023
2. Our runtime uses a Debian stretch-based base image,
   which is long past its extended EOL data and security
   updates are no longer available.
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 9ea0255..75f48bd 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -88,8 +88,6 @@
         working-directory: runtime
         run: |
           SHORT_COMMIT=$(git rev-parse --short "$GITHUB_SHA")
-          ./gradlew :core:nodejs14Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly
-          ./gradlew :core:nodejs14Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT
           ./gradlew :core:nodejs16Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly
           ./gradlew :core:nodejs16Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT
           ./gradlew :core:nodejs18Action:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly
diff --git a/README.md b/README.md
index 09c936a..cae9511 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,6 @@
 
 The following Node.js runtime versions (with kind & image labels) are generated by the build system:
 
-- Node.js 14.19 (`nodejs:14` & `openwhisk/action-nodejs-v14`)
 - Node.js 16 (`nodejs:16` & `openwhisk/action-nodejs-v16`)
 - Node.js 18 (`nodejs:18` & `openwhisk/action-nodejs-v18`)
 
@@ -38,12 +37,6 @@
 
 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 v14
-
-```
-wsk action update myAction myAction.js --kind nodejs:14
-```
-
 ### Node.js v16
 
 ```
@@ -54,7 +47,6 @@
 
 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/action-nodejs-v14](https://hub.docker.com/r/openwhisk/action-nodejs-v14)
 - [https://hub.docker.com/r/openwhisk/action-nodejs-v16](https://hub.docker.com/r/openwhisk/action-nodejs-v16)
 - [https://hub.docker.com/r/openwhisk/action-nodejs-v18](https://hub.docker.com/r/openwhisk/action-nodejs-v18)
 
@@ -83,12 +75,11 @@
 - Run the `distDocker` command to generate local Docker images for the different runtime versions.
 
 ```
-./gradlew core:nodejs14Action:distDocker
 ./gradlew core:nodejs16Action:distDocker
 ./gradlew core:nodejs18Action:distDocker
 ```
 
-This will return the following runtime images with the following names: `action-nodejs-v14`, `action-nodejs-v16`, and `action-nodejs-v18`.
+This will return the following runtime images with the following names: `action-nodejs-v16`, and `action-nodejs-v18`.
 
 ### Testing
 
@@ -104,7 +95,6 @@
 - Build the custom Docker images used in local testing.
 
 ```
-./gradlew tests:dat:docker:nodejs14docker:distDocker
 ./gradlew tests:dat:docker:nodejs16docker:distDocker
 ./gradlew tests:dat:docker:nodejs18docker:distDocker
 ```
diff --git a/core/nodejs14Action/.dockerignore b/core/nodejs14Action/.dockerignore
deleted file mode 100644
index a1d03cb..0000000
--- a/core/nodejs14Action/.dockerignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.*~
-*.yaml
-*.tmpl
-*.gradle
-.dockerignore
-.project
-.settings
-build.xml
-Dockerfile
-logs
-node_modules
-package-lock.json
-test.js
diff --git a/core/nodejs14Action/CHANGELOG.md b/core/nodejs14Action/CHANGELOG.md
deleted file mode 100644
index 95d4e6b..0000000
--- a/core/nodejs14Action/CHANGELOG.md
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-#
-# 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 14 OpenWhisk Runtime Container
-
-# Apache 1.20
-- Update Node to 14.19.x
-Node.js version = [14.19.1](https://nodejs.org/en/blog/release/v14.19.1/)
-OpenWhisk version = [OpenWhisk v3.21.6](https://www.npmjs.com/package/openwhisk)
-
-# Apache 1.19
-  - Remove Node.js 10 support
-  - Update Node to 14.17.2 and 12.22.2 (#197)
-  - Resolve akka versions explicitly. (#198)
-
-Node.js version = [14.17.2](https://nodejs.org/en/blog/release/v14.17.2/)
-OpenWhisk version = [OpenWhisk v3.21.4](https://www.npmjs.com/package/openwhisk)
-
-# Apache 1.18
-  - Update to openwhisk-client-js 3.21.4 (#194)
-  - Constraint all transitive akka-* dependencies (#195)
-  - Update NodeJs to gather fixes (#192)
-  - Update NodeJs to gather fixes (#188)
-  - Update from source build. (#187)
-  - Update NodeJs to gather fixes (#186)
-
-Node.js version = [14.16.1](https://nodejs.org/en/blog/release/v14.16.1/)
-OpenWhisk version = [OpenWhisk v3.21.4](https://www.npmjs.com/package/openwhisk)
-
-## Apache 1.17
-  - Update Node.js and OpenWhisk versions.
-
-Node.js version = [14.15.1](https://nodejs.org/en/blog/release/v14.15.1/)
-OpenWhisk version = [OpenWhisk v3.21.3](https://www.npmjs.com/package/openwhisk)
-
-## Apache 1.16
-Changes:
-  - Initial release with support for Node.js v1.14
-
-Node.js version = [14.4.0](https://nodejs.org/en/blog/release/v14.4.0/)
-OpenWhisk version = [OpenWhisk v3.21.2](https://www.npmjs.com/package/openwhisk)
diff --git a/core/nodejs14Action/Dockerfile b/core/nodejs14Action/Dockerfile
deleted file mode 100644
index 534df58..0000000
--- a/core/nodejs14Action/Dockerfile
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# 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:14.19-stretch
-
-# Initial update and some basics.
-#
-RUN apt-get update && apt-get install -y \
-    imagemagick \
-    graphicsmagick \
-    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/nodejs14Action/build.gradle b/core/nodejs14Action/build.gradle
deleted file mode 100644
index 85e0796..0000000
--- a/core/nodejs14Action/build.gradle
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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-v14'
-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 4d7cca6..43e6aad 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -18,11 +18,9 @@
 include 'tests'
 
 include 'core:nodejsActionBase'
-include 'core:nodejs14Action'
 include 'core:nodejs16Action'
 include 'core:nodejs18Action'
 include 'core:typescript37Action'
-include 'tests:dat:docker:nodejs14docker'
 include 'tests:dat:docker:nodejs16docker'
 include 'tests:dat:docker:nodejs18docker'
 include 'tests:dat:docker:typescript37docker'
diff --git a/tests/dat/docker/nodejs14docker/Dockerfile b/tests/dat/docker/nodejs14docker/Dockerfile
deleted file mode 100644
index a679436..0000000
--- a/tests/dat/docker/nodejs14docker/Dockerfile
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# 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 action-nodejs-v14
-COPY package.json .
-RUN npm install --production
diff --git a/tests/dat/docker/nodejs14docker/build.gradle b/tests/dat/docker/nodejs14docker/build.gradle
deleted file mode 100644
index 222f81b..0000000
--- a/tests/dat/docker/nodejs14docker/build.gradle
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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.
- */
-
-ext.dockerImageName = 'nodejs14docker'
-apply from: '../../../../gradle/docker.gradle'
diff --git a/tests/dat/docker/nodejs14docker/package.json b/tests/dat/docker/nodejs14docker/package.json
deleted file mode 100644
index 6822c09..0000000
--- a/tests/dat/docker/nodejs14docker/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "testdocker",
-  "version": "1.0.0",
-  "main": "index.js",
-  "dependencies": {
-    "openwhisk": "2.0.0"
-  }
-}
diff --git a/tests/src/test/scala/runtime/actionContainers/NodeJs14ActionContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/NodeJs14ActionContainerTests.scala
deleted file mode 100644
index ec386c8..0000000
--- a/tests/src/test/scala/runtime/actionContainers/NodeJs14ActionContainerTests.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 NodeJs14ActionContainerTests extends NodeJsActionContainerTests {
-  override lazy val nodejsContainerImageName = "action-nodejs-v14"
-  override lazy val nodejsTestDockerImageName = "nodejs14docker"
-}
diff --git a/tests/src/test/scala/runtime/actionContainers/NodeJs14ConcurrentTests.scala b/tests/src/test/scala/runtime/actionContainers/NodeJs14ConcurrentTests.scala
deleted file mode 100644
index bc61f39..0000000
--- a/tests/src/test/scala/runtime/actionContainers/NodeJs14ConcurrentTests.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 NodeJs14ConcurrentTests extends NodeJsConcurrentTests {
-  override lazy val nodejsContainerImageName = "action-nodejs-v14"
-  override lazy val nodejsTestDockerImageName = "nodejs14docker"
-}