🌊

GitHub Actions を使うなら、気にしたほうがいいこと

2024/06/25に公開

最近、GitHub Actionsを触る機会が増えていますが、つい適当にワークフローを作成しがちです。
そこで、ワークフローを作成する時に気にしておいた方がいい点を自分用にまとめました。

実装編

タイムアウト

タイムアウトを設定していないと、ワークフローが無限に実行され続ける可能性があります。

何が原因かもわからず止まってくれないワークフローがたまに出没するので、適切なタイムアウトを設定しておきましょう。

最初は短めにタイムアウトを設定しておくと良いと思います。

例えば自動テストをCIで実行していたときにタイムアウトで止まったら、なぜこのテストは実行時間が長くなっているのか・・・とチューニングをするきっかけになります。

name: Workflow Template

on:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
        
jobs:
  example:
    runs-on: ubuntu-latest
    timeout-minutes: 5 # ←コレ!
    steps:
      - name: echo example
        run: echo "example"

同一ワークフローが動いたらキャンセルさせる

同一のワークフローが同時に動くのを避けるために、ワークフローのグループ化を行い、同一ワークフローの実行をキャンセルする設定をしておくと良いです。

基本、設定例の通りでいいのですが、
PR単位で動作させたいものは${{ github.workflow }}-${{ github.ref }}
mainブランチにマージされたときに動作させたいものは${{ github.workflow }}
というように使い分けるのが良さそうです。

name: Workflow Template

on:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }} # ←コレ! グループの設定
  cancel-in-progress: true # ←コレ! ワークフローのキャンセルの設定
        
jobs:
  example:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: echo example
        run: echo "example"

パーミッションの設定

パーミッションを設定しない場合、ブランチのソースコードの読み取りがデフォルトで許可されます。
そのため、特にパーミッションを設定しなくてもソースコードを読み取ることができています。

パーミッションを設定する場合は、明示的にブランチのソースコードの読み取りを許可する必要があります。
これはデフォルトの設定が破棄され、明示的に指定されたパーミッションが優先されるからです。

name: Example Workflow with Permissions

on:
  workflow_dispatch:

permissions: # ←コレ!
  contents: read # ←コレ!
  actions: none # ←コレ!

jobs:
  example:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Run a script with specific permissions
      run: echo This job only has read access to the contents

中間環境変数

githubコンテキスト
などを直接、コマンドに使用するのは避けましょう。
意図しないコマンドが実行される可能性があります。

環境変数に設定してから、環境変数経由でコマンドに使用しましょう。
これは中間環境変数と言って、こちらでも紹介されています。

name: Workflow Template

on:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
        
jobs:
  example:
    runs-on: ubuntu-latest
    timeout-minutes: 5
        env:
      GITHUB_PR_TITLE: ${{ github.event.pull_request.title }} # ←コレ!
    steps:
      - name: echo github.event.pull_request.title
        run: echo ${{ github.event.pull_request.title }} # ←コレはNG!
      - name: Using an intermediate environment variable
        run: echo "${GITHUB_PR_TITLE}" # ←コレ!

運用編

ワークフローのテンプレートをmainブランチに含めておく

ワークフローのテンプレートをリポジトリのmainブランチに含めておくと、何かと便利です。

ワークフローをトリガーするイベントはこちらの説明にある通り、

ワークフローファイルがデフォルトブランチにある場合にのみワークフローの実行をトリガーします。

となっているトリガーが多いです。

そのため、mainブランチに先に含めておけば、各自でテンプレートファイルを書き換えてワークフローをお試しで動かすことができます。

また、ワークフローを決まったルールで作成したい(例:タイムアウトの処理は必ず実装すること)ので、プロジェクトに適切なテンプレートファイルは作成しておくと、なにかと便利だと思います。

name: Workflow Template

on:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
        
jobs:
  example:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: echo example
        run: echo "example"
SMARTCAMP Engineer Blog

Discussion