Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deploying Nx workspace to Google App Engine

My Nx app works fine locally but when deployed to GAE it fails with this error:

sh: 1: exec: nx: not found

It can't find nx which is listed under dependencies (not devDependencies) since GAE doesn't install those.

My package.json has this in it:

  "scripts": {
    "start": "nx serve api",

so when GAE runs npm run start it fails. I tried specifying the path directly to nx but trying to refer to it using node_modules/nx/bin/nx but that fails too.

I'm wondering how I can get GAE to use nx to serve the app.

This is such a simple and basic used case that I'm confounded that it doesn't have a straightforward solution. I must be missing something very simple.

like image 831
Nightwolf Avatar asked Feb 13 '26 16:02

Nightwolf


1 Answers

I am using Nx@13, here are steps to deploy to GAE:

  1. Add "generatePackageJson": true, to production executor, it will generate a package.json in dist/apps/serviceA/package.json

  2. GAE will look for scripts:{"start:"your way to start nodejs app "} or server.js if the start script not found. You will have to write a script to add scripts:{"start:"node main.js"} into the generated package.json in #1

  3. In cloudbuild we will have to execute GAE deploy command in dist/apps/serviceA folder, luckily cloudbuild step supports dir

cloudbuild.yaml

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

  - name: node:16-bullseye
    entrypoint: npm
    args: ['run', 'lint', '${_SERVICE_NAME}']

  - name: node:16-bullseye
    entrypoint: npm
    args: ['run', 'test', '${_SERVICE_NAME}']

  - name: node:16-bullseye
    entrypoint: npm
    args:
      ['run', 'build', '${_SERVICE_NAME}', '--', '--configuration=production']

  - name: node:16-bullseye
    entrypoint: bash
    args:
      [
        '-c',
        'node tools/prepare-gcp-app-engine.js --serviceName=${_SERVICE_NAME}',
      ]

  - name: gcr.io/google.com/cloudsdktool/cloud-sdk:376.0.0-slim
    dir: dist/apps/${_SERVICE_NAME}
    entrypoint: gcloud
    args:
      - app
      - deploy
      - app-engine.yaml
      - --version=$SHORT_SHA
      - --promote
      - --stop-previous-version
      - --quiet

substitutions:
  _SERVICE_NAME: game-api

Source code demo

like image 130
vanduc1102 Avatar answered Feb 15 '26 11:02

vanduc1102



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!