Search code examples
amazon-elastic-beanstalkgithub-actions

Elastic Beanstalk cannot find the server.js file


I'm trying to deploy my Angular application through GitHub Actions to Elastic Beanstalk. I'm using this GitHub actions for the deploying to ELB.

My problem is, the deployment is failing as the ELB cannot find the server.js file. I have tried adding server.js file into the deploy.zip file, but then it throws a different error.

I get it, it needs server.js to run, but when I download the build for the same application which is pushed to ELB using Travis CI. It doesn't throw such error and CI/CD is working just fine.

Here is the error logged by ELB (when server.js is not added to deploy.zip):

throw err;
    ^

Error: Cannot find module '/var/app/current/server.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! climber-mentee-fe@1.0.1 aws: `node server.js && npm run serve`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the climber-mentee-fe@1.0.1 aws script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

> climber-mentee-fe@1.0.1 aws /var/app/current
> node server.js && npm run serve

I'm also attaching my package.json and main.yml(for CI) files.

package.json:

"name": "climber-mentee-fe",
"version": "1.0.1",
  "scripts": {
    "ng": "ng",
    "start": "node server.js",
    "serve": "ng serve --configuration=dev",
    "start:staging": "gulp set --env=staging && concurrently --kill-others \"node server.js\" \"npm run serve\"",
    "start:prod": "gulp set --env=prod && concurrently --kill-others \"node server.js\" \"npm run serve\"",
    "build": "ng build --configuration=production",
    "test": "ng test",
    "aws": "node server.js && npm run serve",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  ...
  ...
 }

main.yml:

name: My application CI

on:
  push:
    branches:
    - dry-run-actions

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [10.x]

    steps:
    - uses: actions/checkout@v1

    - name: Node ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}

    - name: Installing NPM
      run: npm install

    - name: Building application and copying package.json to dist
      run: npm run build && cp package.json dist/

    - name: Generate deployment package
      run: cd dist && zip -r ../deploy.zip ./*

    - name: Beanstalk Deploy for App
      uses: einaregilsson/beanstalk-deploy@v3
      with:
        aws_access_key: ${{secrets.AWS_ACCESS_KEY}}
        aws_secret_key: ${{secrets.AWS_SECRET_KEY}}
        application_name: my-app
        environment_name: my-app-env
        region: ap-south-1
        version_label: 455
        deployment_package: deploy.zip

Screen of var/app/current enter image description here


Solution

  • I figured it out finally.

    We need to zip the complete root folder excluding the node_modules folder. So, in that case, I won't need any server.js and package.json included inside the dist folder.

    Updated yml snippet

    - name: Building application
      run: npm run build
    
    - name: Generate deployment package
      run: zip -r deploy.zip * -x ./node_modules