Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add working directory to deployment in GitHub actions

I recently moved into GitHub actions, so what I'm trying to do is host my react project in firebase when a push is done. And I used GitHub actions to this CI/CD process. And this is the main.yml that I have right now.

name: Build and Deploy
on:
  push:
    branches:
      - master

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@master
      - name: Install Dependencies
        working-directory: ./my-app
        run: npm install
      - name: Build
        working-directory: ./my-app
        run: npm run build

  deploy:
    name: Deploy
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@master      
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

And I somehow manage to set the working directory when npm installation and project building. But in deployment I'm keep getting this error,

enter image description here

So what I have understood is, this error occurs due to the working directory problem. So my current project structure looks like this.

. (root of my GitHub repository)
└── my-app
    ├── firebase.json   <-- Git Hub action must point to this sub-dir
└── my-app-mobile
    ├── packages.json

So how should I do this within my firebase deployment process? If I'm wrong with the problem, What would be the problem and the answer? It seems I can't use working-directory: ./my-app with uses:

like image 379
Shehan Dhaleesha Avatar asked Oct 12 '19 08:10

Shehan Dhaleesha


1 Answers

I looked at the documentation for the firebase CLI and didn't see any way to set the path to your firebase.json via a CLI parameter. There is, however, an environment variable that stores the root directory. It's in the context of predeploy and postdeploy hooks though, so I'm not sure if the CLI will respect it.

$PROJECT_DIR — The root directory containing firebase.json

https://firebase.google.com/docs/cli#environment_variables

The w9jds/firebase-action you are using is just a wrapper around the CLI. I'm not sure if this will work but you could try setting the project directory as follows. The reason the variable is set in a separate step is because you cannot evaluate expressions in env sections. See this answer for more detail. Container actions like w9jds/firebase-action will have access to the variable without passing it directly via env.

      - name: Set project dir environment var
        run: echo ::set-env name=PROJECT_DIR::"$GITHUB_WORKSPACE/my-app"
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

If that doesn't work, an alternative is to fork w9jds/firebase-action and add a PROJECT_PATH parameter to the entrypoint.sh script here: https://github.com/w9jds/firebase-action/blob/master/entrypoint.sh

Update: I raised a PR to add a PROJECT_PATH parameter to w9jds/firebase-action. You can now use the action as follows.

      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
          PROJECT_PATH: ./my-app
like image 120
peterevans Avatar answered Nov 02 '22 09:11

peterevans