コンテンツにスキップ

GitHub Actions のあれこれ

GitHub Actions を使ううえで知っておくと便利な設定をまとめる。

実行ブランチの取得とrun-name

  • workflow_dispatch の実行ブランチをgithub.ref_nameで取得できる
  • run-nameで Web 上の表示を動的にする

実行結果

input.yaml
name: foo
run-name: Deploy to ${{ inputs.application }} by @${{ github.actor }}

on:
  workflow_dispatch:
    inputs:
      application:
        type: choice
        description: Application
        options:
          - foo
          - bar

jobs:
  example:
    runs-on: ubuntu-latest
    steps:
      - name: echo branch
        run: echo ${{ github.ref_name }}

workflow_run

workflow_runは workflow が終わった後に発火するもの。キャッシュや通知、後処理に使われる。

  • workflow_run のon.workflow_run.workflowsでは workflow のnameを指定する必要がある
    • run-nameは指定できない
    • fo*のような曖昧な文字列も対応
workflow_run.yaml
name: workflow_run
on:
  workflow_run:
    workflows:
      - foo
      - fo*
    types: [completed]

jobs:
  on-requested:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == '' }}
    steps:
      - run: echo 'requested'
  on-success:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
      - run: echo 'success'
  on-failure:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    steps:
      - run: echo 'failure'

直前の workflow の inputs は取得できなかった

workflow_run で直前の workflow の inputs の情報を取得しようとしたができなかった。github-scriptとGitHub REST APIを見てみたがそれらしい情報はなかった。

name: workflow_run2
on:
  workflow_run:
    workflows:
      - foo
      - fo*
    types: [completed]
jobs:
  echo-workflow-info:
    name: echo-workflow-info
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/github-script@v6
        with:
          script: |
            core.info(JSON.stringify(context.payload))

artifact へ書き出せば workflow 間で値を共有できそうだ。ただ、そのために artifact を使うより、composite actionやworkflow_callで明示的に値を渡す構成のほうがよいと感じた。

DB や nginx をサービスコンテナで起動する

servicesに DB や nginx などを定義すると、ジョブから接続して利用できる。

services:
  nginx:
    image: nginx
    # Map port 8080 on the Docker host to port 80 on the nginx container
    ports:
      - 8080:80
  redis:
    image: redis
    # Map TCP port 6379 on Docker host to a random free port on the Redis container
    ports:
      - 6379/tcp

Workflow syntax for GitHub Actions - jobs..services