全力で怠けたい

怠けるために全力を尽くしたいブログ。

GitHub Actions で作業ディレクトリを変更する方法。

はじめに

モノレポで開発をしていると、GitHub Actions のワークフローで作業ディレクトリを変更したり、デフォルトの作業ディレクトリを変更することが増えた。 作業ディレクトリを変更する方法、デフォルトの作業ディレクトリを変更する方法をメモしておく。

cd コマンドで作業ディレクトリを変更する

GitHub Actions では cd コマンドで作業ディレクトリを変更できる。

たとえば、こんなワークフローを実行した場合は、

name: Working Directory
on:
  workflow_dispatch:

jobs:
  print-working-directory:
    runs-on: ubuntu-latest

    steps:
      - name: step1
        run: |
          pwd
          cd subdir
          pwd

出力結果は以下のようになる。

/path/to/repo
/path/to/repo/subdir

ただし、作業ディレクトリの変更はステップ内だけにとどまり、ステップが変わると作業ディレクトリは元に戻る。

      - name: step1
        run: |
          cd subdir
          pwd

      - name: step2
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo        # step2

working-directory を指定

working-directory を指定すると、スコープに応じてデフォルトの作業ディレクトリを変更できる。

ステップのデフォルトの作業ディレクトリを変更

ステップで working-directory を指定すると、ステップ内のデフォルトの作業ディレクトリを変更できる。

作業ディレクトリの変更はステップ内だけにとどまり、別のステップには適用されない。

      - name: step1
        working-directory: subdir
        run: |
          pwd

      - name: step2
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo        # step2

ジョブのデフォルトの作業ディレクトリを変更

ジョブで defaults.run.working-directory を指定すると、ジョブ内のデフォルトの作業ディレクトリを変更できる。

作業ディレクトリの変更はジョブ内のすべてのステップに適用されるが、別のジョブには適用されない。 また、任意のステップで作業ディレクトリを変更しても、別のステップの開始時には working-directory で指定したデフォルトの作業ディレクトリが適用される。

name: Working Directory
on:
  workflow_dispatch:

jobs:
  print-working-directory:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: subdir

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: step1
        run: |
          pwd
          cd ..
          pwd

      - name: step2
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo        # step1
/path/to/repo/subdir # step2

ワークフロー全体のデフォルトの作業ディレクトリを変更

ワークフローで defaults.run.working-directory を指定すると、ワークフロー全体のデフォルトの作業ディレクトリを変更できる。

name: Working Directory
on:
  workflow_dispatch:

defaults:
  run:
    working-directory: subdir

jobs:
  print-working-directory:
    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: step
        run: |
          pwd

  print-working-directory-2:
    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: step
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo/subdir # step2

working-directory の指定は、より小さいスコープでの指定が優先される

working-directory の指定は、より小さいスコープでの指定が優先される。

  • ステップとジョブのそれぞれで working-directory を指定した場合は、ステップでの指定が優先される
  • ジョブとワークフロー全体のそれぞれで working-directory を指定した場合は、ジョブでの指定が優先される

参考サイト