注目イベント!
アドベントカレンダー2024開催します(12/1~12/25)!
一年を締めくくる特別なイベント、アドベントカレンダーを今年も開催します!
初心者からベテランまで楽しめる内容で、毎日新しい技術トピックをお届けします。
詳細はこちらから!
event banner

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

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

実行結果。

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

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。