'How to set environment variable in node.js process when deploying with github action

I am trying to build an CI pipeline for my node.js server using github actions.

I just need to solve one issue. I need to set environment variable, so that my node.js server can access the env variable via process.env

Below is the github action workflow file.

name: Build and Deploy to GKE

on:
  pull_request:
    branches:
      - master

# Environment variables available to all jobs and steps in this workflow
env:
  ENGINE_API_KEY: ${{ secrets.ENGINE_API_KEY }}

jobs:
  setup-build-publish-deploy:
    name: Setup, Build, Publish, and Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Apollo Schema Update
        env:
          ENGINE_API_KEY: ${{ secrets.ENGINE_API_KEY }}
        run: |
          sudo npm install
          sudo npm install -g apollo
          sudo npm run dev &
          sleep 3
          sudo apollo service:push --serviceURL=http://auth-cluster-ip-service --serviceName=auth --tag=master --endpoint=http://localhost:3051

I have tried declaring environment variable both workflow level and job's level, but when I console.log(process.env.ENGINE_API_KEY), it returns undefined.

I also tried ENGINE_API_KEY=$ENGINE_API_KEY npm run dev & instead of npm run dev &. This works on my macbook, but with github action, it still returns undefined.

(I did store ENGINE_API_KEY in settings -> secret. worked fine for other variables)



Solution 1:[1]

Create an .env file that can be read by your node server and pass in your repository secret that way. This should be done after your checkout step:

    - name: create env file
      run: |
        touch .env
        echo ENGINE_API_KEY=${{ secrets.ENGINE_API_KEY }} >> .env

Solution 2:[2]

To run a Node.js script that accesses variables from process.env in your Github Action, use the following syntax:

- name: Create .env with Github Secrets and run script
  run: |
    touch .env
    echo ENV_VAR_1=$ENV_VAR_1 >> .env
    echo ENV_VAR_2=$ENV_VAR_2 >> .env
    npm run script-that-accesses-env-vars
  env:
    ENV_VAR_1: ${{ secrets.ENV_VAR_1 }}
    ENV_VAR_2: ${{ secrets.ENV_VAR_2 }}

Echoing the ${{ secrets.ENV_VAR_1 }} directly to the .env file, instead of declaring the variables with the env key, didn't copy the correct value for me.

Solution 3:[3]

  - name: Create and populate .env file
    env:
      ...
      AWS_HOST: ${{ secrets.AWS_HOST }}
      DBNAME: ${{ secrets.DBNAME }}
      ...
    run: |
      touch .env
      ...
      echo aws_host="$AWS_HOST" >> .Renviron
      echo dbname="$DBNAME" >> .Renviron
      ...

      echo "cat .env"
      cat .env

      echo "ls -a ."
      ls -a .

      echo "ls -a ${{ github.workspace }}"
      ls -a ${{ github.workspace }}
    shell: bash

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 yoeri walstra
Solution 3 Anderson Laverde