1

TLDR: Sorry for the longest question in history, but I hope this is comprehensive for any users having a similar problem. My app deploys successfully from cloud shell to my domain; however, when I try cloud build, I get Cannot find module '/workspace/server.js' The error likely has to due with my build handlers in the app.yaml, or something to do with my cloudbuild.yaml.

Solution: use the right handlers in app.yaml standard and properly set up your cloudbuild.yaml

I am having trouble using App Engine and Cloud Build together. I am using Cloud Build to set up CICD with my Github repo. I think the issue is due to the fact that I have been not been deploying the production build to app engine. I was able to successfully deploy manually (dev version) with:

gcloud app deploy

Now, I am having trouble with my Cloud Build. In particular, I am trying to run flex environment, but I keep getting "Neither "start" in the "scripts" section of "package.json" nor the "server.js" file were found." But my package.json has a startup script?

I also tried standard environment instead of flex, but I couldn't get the handlers figured out. I tried dozens of examples. I have included the standard environment app.yaml so you can see it.

Here's my package.json:

{
  "name": "flier-mapper",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@firebase/storage": "^0.8.4",
    "@parcel/transformer-sass": "^2.0.0",
    "@react-google-maps/api": "^2.7.0",
    "@testing-library/jest-dom": "^5.11.4",
    "@testing-library/react": "^11.1.0",
    "@testing-library/user-event": "^12.1.10",
    "bootstrap": "^5.1.3",
    "cors": "^2.8.5",
    "emailjs-com": "^3.2.0",
    "firebase": "^9.2.0",
    "firebase-admin": "^10.0.0",
    "firebase-functions": "^3.16.0",
    "react": "^17.0.2",
    "react-bootstrap": "^2.0.2",
    "react-dom": "^17.0.2",
    "react-ga": "^3.3.0",
    "react-helmet": "^6.1.0",
    "react-icons": "^4.3.1",
    "react-pricing-table": "^0.3.0",
    "react-router-dom": "^5.3.0",
    "react-scripts": "4.0.3",
    "react-tabs": "^3.2.3",
    "stripe": "^8.188.0",
    "web-vitals": "^1.0.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

Here's my cloudbuild.yaml. I also tried deleting the dir line:

steps:

- name: "gcr.io/cloud-builders/npm"
  dir: 'frontend'
  args: ['install']
  timeout: "5m"

- name: "gcr.io/cloud-builders/npm"
  dir: 'frontend'
  args: ["run", "build"]
  timeout: "5m"

- name: "gcr.io/cloud-builders/gcloud"
  entrypoint: bash
  args: 
    - "-c"
    - |
        cp app.yaml ./build
        cd build
        gcloud app deploy
  timeout: "1600s"

timeout: 60m

Here's my flex app.yaml:

runtime: nodejs
env: flex

# This sample incurs costs to run on the App Engine flexible environment.
  # The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

And here's one of the many handlers I tried with a standard environemnt:

runtime: nodejs14

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 1

handlers:
  # Serve all static files with url ending with a file extension
  - url: /(.*\..+)$
    static_files: build/\1
    upload: build/(.*\..+)$
  # Catch all handler to index.html
  - url: /.*
    static_files: build/index.html
    upload: build/index.html

  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

EDIT

So, I got it to run on standard environment, which is useful for https requests. Here's my app.yaml that I got working:

runtime: nodejs14

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 2

handlers:

- url: /.*
  secure: always
  redirect_http_response_code: 301
  script: auto

However, now my problem is this:

Error: Cannot find module '/workspace/server.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:889:15)
    at Function.Module._load (internal/modules/cjs/loader.js:745:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
    at internal/main/run_main_module.js:17:47 {

Which is essentially the same issue as above.

500 Server Error on GCP App Engine

EDIT 2

I'm wondering if it is because now that I am running a production build I need to add the correct handlers. But as mentioned above, I have tried dozens of combinations of various answers on the internet to no avail.

Here's another standard app.yaml I tried:

runtime: nodejs16

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 2

handlers:
  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

  - url: /
    static_files: build/index.html
    upload: build/index.html

  - url: /
    static_dir: build

Is it something to do with one of my packages? If so, which one? There aren't any specials ones that I know of...

I also added this to my package.json, but it didn't do anything either:

"start": "PORT=8080 react-scripts start",

EDIT 3 I have tried these posts: Error: Cannot find module '/workspace/server.js' could not find module workspace/server.js Error: Cannot find module '/workspace/server.js' upon node js deploy on google app engine https://medium.com/@calebmackdaven/so-you-want-to-start-using-google-cloud-ce9054e84fa8

This app.yaml built on cloud build; however, I now get a new error "The requested URL / was not found on this server.":

runtime: nodejs16

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 2

handlers:
  - url: /static/js/(.*)
    static_files: build/static/js/\1
    upload: build/static/js/(.*)
  - url: /static/css/(.*)
    static_files: build/static/css/\1
    upload: build/static/css/(.*)
  - url: /static/media/(.*)
    static_files: build/static/media/\1
    upload: build/static/media/(.*)
  - url: /(.*\.(json|ico))$
    static_files: build/\1
    upload: build/.*\.(json|ico)$
  - url: /
    static_files: build/index.html
    upload: build/index.html
  - url: /.*
    static_files: build/index.html
    upload: build/index.html
  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

My logs say:

Static file referenced by handler not found: build/index.html

EDIT 4 I tried a different cloudbuild.yaml:

steps:

- name: node
  entrypoint: npm
  args: ['install']

- name: node
  entrypoint: npm
  args: ['run', 'build']

- name: 'bash'
  args: ['gcloud app deploy']

However, now the error I get in my npm run build stage is :

Error message "error:0308010C:digital envelope routines::unsupported"

I checked out this answer, so I tried a different node version 14 and still got the same issue. I tried the following, but got the same error:

"start": "react-scripts --openssl-legacy-provider start"

Here's my error:

Step #1: Error: error:0308010C:digital envelope routines::unsupported
Step #1:     at new Hash (node:internal/crypto/hash:67:19)
Step #1:     at Object.createHash (node:crypto:130:10)
Step #1:     at module.exports (/workspace/node_modules/webpack/lib/util/createHash.js:135:53)
Step #1:     at NormalModule._initBuildHash (/workspace/node_modules/webpack/lib/NormalModule.js:417:16)
Step #1:     at /workspace/node_modules/webpack/lib/NormalModule.js:452:10
Step #1:     at /workspace/node_modules/webpack/lib/NormalModule.js:323:13
Step #1:     at /workspace/node_modules/loader-runner/lib/LoaderRunner.js:367:11
Step #1:     at /workspace/node_modules/loader-runner/lib/LoaderRunner.js:233:18
Step #1:     at context.callback (/workspace/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
Step #1:     at /workspace/node_modules/babel-loader/lib/index.js:59:103 {
Step #1:   opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
Step #1:   library: 'digital envelope routines',
Step #1:   reason: 'unsupported',
Step #1:   code: 'ERR_OSSL_EVP_UNSUPPORTED'
Step #1: }
Step #1: 
Step #1: Node.js v17.1.0
Finished Step #1
ERROR
ERROR: build step 1 "node" failed: step exited with non-zero status: 1

Why is it attempting to use Node.js v17.1.0 when I specified v16 in the app.yaml?

EDIT 5

I tried specifying Node v16.13.0:

steps:
- name: node: "16.13.0"
  entrypoint: npm
  args: ['install']

- name: node: "16.13.0"
  entrypoint: npm
  args: ['run', 'build']

- name: "gcr.io/cloud-builders/gcloud"
  entrypoint: bash
  args: [gcloud app deploy]

However, it didn't build at all:

Your build failed to run: failed unmarshalling build config cloudbuild.yaml: yaml: line 2: mapping values are not allowed in this context

So I tried adding a substitution:

--- 
steps: 
  - 
    args: 
      - install
    entrypoint: npm
    name: "node= $_NODE_VERSION"
  - 
    args: 
      - run
      - build
    entrypoint: npm
    name: "node= $_NODE_VERSION"
  - 
    args: 
      - "gcloud app deploy"
    entrypoint: bash
    name: gcr.io/cloud-builders/gcloud
substitutions: 
  $_NODE_VERSION: v16.13.0

But I got:

Your build failed to run: generic::invalid_argument: invalid build: invalid build step name "node= ": could not parse reference: node=

And if I try node: "16.13.0", the error is similar:

Your build failed to run: failed unmarshalling build config cloudbuild.yaml: yaml: line 2: mapping values are not allowed in this context

Okay, that error was just due to spacing. I tried updating my cloudbuild.yaml as follows:

steps:
- name: node:16.13.0
  entrypoint: npm
  args: ['install']

- name: node:16.13.0
  entrypoint: npm
  args: ['run', 'build']

- name: "gcr.io/cloud-builders/gcloud"
  entrypoint: bash
  args: [gcloud app deploy]

Now I am able to build. However, now I get an issue with the gcloud command:

Step #2: bash: gcloud app deploy: No such file or directory

EDIT 6

I'm going in circles. My new error is the original one:

Error: Not Found
The requested URL / was not found on this server.

But at least I got the cloud build to build. So it must be my app.yaml or cloudbuild.yaml.

steps:
- name: node:16.13.0
  entrypoint: npm
  args: ['install']

- name: node:16.13.0
  entrypoint: npm
  args: ['run', 'build']

- name: "gcr.io/cloud-builders/gcloud"
  entrypoint: bash
  args: 
    - "-c"
    - |
        cp app.yaml ./build
        cd build
        gcloud app deploy
Step #2: bash: gcloud app deploy: No such file or directory

Solution I finally got it working! I was changing directory to build, but shouldn't have been. So here are my working cloudbuild.yaml and app.yaml files:

cloudbuild.yaml

steps:
- name: node:16.13.0
  entrypoint: npm
  args: ['install']

- name: node:16.13.0
  entrypoint: npm
  args: ['run', 'build']

- name: "gcr.io/cloud-builders/gcloud"
  entrypoint: bash
  args: 
    - "-c"
    - |
        cp app.yaml ./build
        gcloud app deploy

app.yaml

--- 
handlers: 
  - 
    secure: always
    static_dir: build/static
    url: /static
  - 
    secure: always
    static_files: build/\1
    upload: build/.*\.(json|ico|js)$
    url: /(.*\.(json|ico|js))$
  - 
    secure: always
    static_files: build/index.html
    upload: build/index.html
    url: .*
manual_scaling: 
  instances: 1
runtime: nodejs16

2
  • You may refer to the similar Stackoverflow case with the same error as you are getting. Google App Engine Error Deploying app to GAE Let me know if it helps! Commented Nov 29, 2021 at 9:44
  • Thanks for your response! Regarding the first post, the user uses flex engine which doesn't support handlers, and I couldn't get flex running for create react app on cloud build. And regarding the second post, I'm not even using any server, just the frontend create react app, so I have my package.json in the directory from which I deploy and it has a startup script. Commented Nov 29, 2021 at 15:04

1 Answer 1

1

Solution I finally got it working! I was changing directory to build, but shouldn't have been. So here are my working cloudbuild.yaml and app.yaml files:

cloudbuild.yaml

steps:
- name: node:16.13.0
  entrypoint: npm
  args: ['install']

- name: node:16.13.0
  entrypoint: npm
  args: ['run', 'build']

- name: "gcr.io/cloud-builders/gcloud"
  entrypoint: bash
  args: 
    - "-c"
    - |
        cp app.yaml ./build #not sure if this is necessary
        gcloud app deploy

app.yaml

--- 
handlers: 
  - 
    secure: always
    static_dir: build/static
    url: /static
  - 
    secure: always
    static_files: build/\1
    upload: build/.*\.(json|ico|js)$
    url: /(.*\.(json|ico|js))$
  - 
    secure: always
    static_files: build/index.html
    upload: build/index.html
    url: .*
manual_scaling: 
  instances: 1
runtime: nodejs16

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.