GitHub Actions - 再利用可能ワークフローと手動トリガーで入力値の扱いを統一

| 4 min read
Author: masahiro-kondo masahiro-kondoの画像

これまで、GitHub Actions の手動トリガー(workflow_dispatch)では、入力値を扱う際、github.event.inputs.foo のように event コンテキストから値を取り出す必要がありました。
以前紹介した再利用可能ワークフロー(workflow_call)では、入力値を inputs.foo のように inputs コンテキストから取得します。

このようにトリガーの種類によって入力値の扱いが異なると、両方のトリガーで起動するワークフローが書きづらい問題があります。

先日この問題を解消するリリースが行われ、手動トリガーと再利用可能ワークフローの入力値の扱いが統一されました。

GitHub Actions: Inputs unified across manual and reusable workflows | GitHub Changelog

現在では workflow_dispatch の入力値も inputs コンテキストから取得可能です。

Information

event コンテキストからの取得も互換性のため残されています。

では、以前の書き方の手動トリガーのジョブを動かしてみます。inputs の logLevel や tags などを github.event.inputs から取得してログに出力するワークフローです。

on: 
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'     
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'

jobs:
  printInputs:
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "Log level: ${{ github.event.inputs.logLevel }}"
        echo "Tags: ${{ github.event.inputs.tags }}" 

Run workflow で入力値を指定して実行。

実行結果。この書き方でも入力値が取得できることがわかります。

このワークフローを入力値を inputs コンテキストから取得するように書き換えます。

    - run: |
-       echo "Log level: ${{ github.event.inputs.logLevel }}"
-       echo "Tags: ${{ github.event.inputs.tags }}" 
+       echo "Log level: ${{ inputs.logLevel }}"
+       echo "Tags: ${{ inputs.tags }}" 

実行します。

実行結果。この書き方でも入力値が正しく取得できました。

それでは、workflow_dispatch と workflow_call の両方をトリガーに持つワークフローを書いてみます。2つのトリガーでそれぞれほぼ同じ inputs を定義し、ジョブでは、inputs コンテキストから取り出した入力値を echo 出力しています。

name: Manual and Callee

on:
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'
        required: true
        default: 'warning'
        type: choice
        options:
        - info
        - warning
        - debug
      tags:
        description: 'Test scenario tags'
        required: false
        type: boolean

  workflow_call:
    inputs:
      logLevel:
        description: 'Log level'
        required: true
        default: 'warning'
        type: string
      tags:
        description: 'Test scenario tags'
        required: false
        type: boolean

jobs:
  log-the-inputs:
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "Log level: $LEVEL"
          echo "Tags: $TAGS"
        env:
          LEVEL: ${{ inputs.logLevel }}
          TAGS: ${{ inputs.tags }}

workflow_dispatch は入力フォームが使用できるため、logLevel を選択できるよう type: choice を指定し、options で選択肢を列挙しています。

workflow_call の方は、値を呼び出し側ジョブのコードで渡すため、logLevel は type: string にしています。

Information

type: choice を指定すると invalid value としてエラーになります。

まず、手動トリガーで実行します。

実行結果。

次に、呼び出し用のワークフローを作成します。上記のワークフローファイルを指定し、with で入力値を渡します。

name: Caller Job
on: [workflow_dispatch]

jobs:
  Reuse:
    uses: ./.github/workflows/dispatch_and_call_inputs.yml
    with:
      loglevel: info
      tags: false

呼び出し側のワークフローを手動実行します。入力値はコードで渡すため、実行するだけです。

実行結果。

以上、入力値の扱いが統一されたため、再利用可能ワークフローを単体で動かすことが簡単になり、複数のトリガーから同じジョブを実行できるようになりました。

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み(2022-12-08)
  2. 直感が理性に大反抗!「モンティ・ホール問題」(2022-07-04)
  3. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する(2022-10-28)
  4. Nuxt3入門(第4回) - Nuxtのルーティングを理解する(2022-10-09)
  5. OpenAIのAssistants API(ベータ版)を試す(2023-11-08)
  6. RAGを利用して国会会議録に基づいて質問に回答するLLMを作る方法(2023-09-27)
  7. GitHub Actions - 構成変数(環境変数)が外部設定できるようになったので用途を整理する(2023-01-16)
  8. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する(2022-09-25)
  9. Pytestを使ってみる(その2:VSCode拡張機能編)(2023-03-05)
  10. WSL2上にUbuntu-22.04LTSを導入し、Dockerをインストールしようとしたら、いろいろとハマった件(2023-09-09)