Diary

Diary

日々学んだことをアウトプットする場として初めてみました

GitHub Actions 個人用チートシート

GitHub Actions ハロワの記事も書いているので、よかったらご覧ください。

基本的にはドキュメントがしっかりしているのでそちらで足りるかと思うのですが、個人的に何度も調べてるものはこちらにまとめておきます。

[目次]

注: 以下は 2022/10/22 現在の情報となります。
うまくいかない場合は、公式のドキュメントをご覧ください。

トリガー

何を契機に jobs を走らせるかを指定します。
Events that trigger workflows

手動実行できるようにする

onworkflow_dispatch: を追加する。

on:
  # 手動実行できるようにする!
  workflow_dispatch:

定期実行

スケジュール実行(定期実行)を行う方法について。
(schedule について)

onschedule: を追加する。
デフォルトでは UTC なので注意(日本は UTC+9)。

また、正確な時間ではないのでその辺許してあげてください。
(そのため、12 時ぴったりに処理が走らないと困る、という場合には適してないです。)

on:
  schedule:
    # 日本時間23時00分ごろの指定
    # 毎日 23 時 17-20 分ごろに
    - cron: "0 14 * * *"

特定のパス/拡張子の時は実行させない

マッチパターンの意味

on:
  pull_request:
    paths-ignore:
      # docs フォルダ配下の、全ファイル。
      - "docs/**"
      # 全ディレクトリの md ファイル。
      - "**.md"

複数条件実行

基本的には matrix をうまく使います。

複数バージョンで走らせる

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go: ["1.16", "1.18"]
    steps:
      - name: Setup go
        uses: actions/setup-go@v3
        with:
          go-version: ${{ matrix.go }}
      - name: checkout
        uses: actions/checkout@v3
      - name: Testing
        run: go test ./...

複数マシン(OS)で走らせる

runs-on に指定します

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macOS-latest
          - windows-latest
    steps: ...

CI ファイルを分割する

jobs 部分が長くなってくると、各ステップでやってることが把握しにくくなり、保守性が下がってくるという問題が発生します。

そういう時は、ファイルを分割しメインファイルから呼んであげることができます。
また、他リポジトリにあるファイルも呼び出せるため、使い回しが可能になります。

reusable-workflows を使います。

reusable 側(呼び出される側)

呼び出し条件 (on:) を workflow_call で定義します。

name: Local test

on:
  workflow_call:
    secrets:
      ENCODED_RELEASE_KEYSTORE:
        required: true

jobs:
  deploy:
    runs-on: ubuntu-20.04
    timeout-minutes: 10

    environment: production
    steps:
      - ...

使う側(呼び出す側)

marketplace から job を使うように uses で使用できます。

jobs:
  call-workflow-passing-data:
    uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main
    with:
      username: mona
    secrets:
      envPAT: ${{ secrets.envPAT }}

そのほか

job の実行順序を制御

基本的には job は並列で進んでいくのですが、『リントやビルドが通った場合のみ単体テストを走らせたい』など、順番を調整したい場合があります。

そんな時は need を使います。

jobs:
  build:
    uses: kokoichi206/xxx

  lint:
    uses: kokoichi206/yyy

  local-test:
    # この job を走らせるには、build, lint の終了が必要
    needs: [build, lint]
    uses: kokoichi206/zzz

  android-emulator-test:
    # この job を走らせるには、build, lint の終了が必要
    needs: [version-check, build, lint]
    uses: kokoichi206/xyz

step 間で値を共有する [非推奨]

: set-output非推奨になったようです!!

jobs:
  checker:
    runs-on: ubuntu-20.04
    steps:
      - name: Get version of BASE_REF
        id: id-version
        run: |
          echo "::set-output name=version::1.0.0"
      - name: Get version of HEAD_REF
        run: |
          base="${{ steps.id-version.outputs.version }}"
          echo "${base}"

step や job の間で値を共有する

上の方法は 2022/10/18 に非推奨になっているので、今後は『Passing values between steps and jobs in a workflow』に従って値を共有することになります。

step 間
実行例

steps:
  - name: Set the value
    run: |
      echo "test_value=pien" >> $GITHUB_ENV

  - name: Use the value
    run: |
      # This will output 'pien'
      echo "${{ env.test_value }}"

job 間
実行例

jobs:
  # outputs で共有
  Between-jobs-1:
    runs-on: ubuntu-latest
    # Map a step output to a job output
    outputs:
      output1: ${{ steps.step1.outputs.test_value }}
    steps:
      - id: step1
        run: |
          echo "test_value=hello" >> $GITHUB_OUTPUT
  Between-jobs-2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - run: echo ${{needs.Between-jobs-1.outputs.output1}}

おわりに

随時便利そうなものがあれば追加いたします。