MylesK
MylesK

Reputation: 4429

Running actions in another directory

I've just started exploring Github actions however I've found myself placing a command in multiple places.

I have a PHP project where the composer.json is not in the root, my structure looks like:

my-project:
    readme.md
    app:
        composer.json

Obviously there is more to it and there is a reason why, but my composer.json sits in a subdirectory called 'app'. As a result in my workflow, I have to cd into that folder every time to run a command:

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Setup Symfony
        run: |
          cd app
          cp .env.dev .env
      - name: Install Composer Dependencies
        run: |
          cd app
          composer install --prefer-dist
      - name: Run Tests
        run: |
          cd app
          php bin/phpunit

How can I remove the cd app in every stage?

Upvotes: 377

Views: 370952

Answers (4)

scipper
scipper

Reputation: 3153

Not directly related to the question, but @JoKr comment seems also really helpful, as I land here with the question to a different working directory for uses actions:

For the FirebaseHosting push, you can add to with: following field entryPoint: "./someDirectory – JoKr CommentedFeb 16, 2023 at 8:47

Upvotes: 0

Vlad R
Vlad R

Reputation: 2634

Hope this will help somebody

name: CI

on:
 ...

defaults:
 run:
  working-directory: ./app

jobs:
 ...

Upvotes: 119

peterevans
peterevans

Reputation: 42260

Update: It's now possible to set a working-directory default for a job. See this answer.

There is an option to set a working-directory on a step, but not for multiple steps or a whole job. I'm fairly sure this option only works for script steps, not action steps with uses.

https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsrun

Using working-directory, your workflow would look like this. It's still quite verbose but maybe a bit cleaner.

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Setup Symfony
        working-directory: ./app
        run: cp .env.dev .env
      - name: Install Composer Dependencies
        working-directory: ./app
        run: composer install --prefer-dist
      - name: Run Tests
        working-directory: ./app
        run: php bin/phpunit

Alternatively, you can run it all in one step so that you only need to specify working-directory once.

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Setup and run tests
        working-directory: ./app
        run: |
          cp .env.dev .env
          composer install --prefer-dist
          php bin/phpunit

Upvotes: 510

Tomas
Tomas

Reputation: 4256

You can now add a default working directory for all steps in a job: docs

For the example here, this would be:

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./app
    steps:
      - uses: actions/checkout@v1
      - name: Setup Symfony
        run: .env.dev .env
      - name: Install Composer Dependencies
        run: composer install --prefer-dist
      - name: Run Tests
        run: php bin/phpunit

Caveat: this only applies to run steps; eg you'll still need to add the subdirectory to with parameters of uses steps, if required.

Upvotes: 398

Related Questions