GitHub Actions の Composite run steps action を使った Action を作る

この夏に登場してたのを見逃してました。

github.blog

以前は GitHub Actions のワークフローで再利用できる Action は Docker Container Action と JavaScript Action でした。

blog.kondoumh.com

Docker Container Action は手軽に作れますが、コンテナで実行するため揮発性で step 毎に docker build が実行されるとか、コンテナイメージをビルドする Action を作るにはベースイメージを docker にする必要があるなどやや不便なところもあります。JavaScript Action は JavaScript のスキルとGitHub 提供ライブラリの習得が必要でやや敷居が高いです。

GitHub Actions のワークフローで使われるシンタックスで Action が記述できればいいのにと思った人は多いのではないでしょうか。それが、Composite run steps action です。

これは、ワークフローで使う run step を Action 定義に埋め込むもので、Dockerfile や JavaScript の記述なしに action.yaml だけで Action が作れてしまうというものです。

docs.github.com

公式ドキュメントのサンプルはこんな感じです。

name: 'Hello World'
description: 'Greet someone'
inputs:
  who-to-greet:  # id of input
    description: 'Who to greet'
    required: true
    default: 'World'
outputs:
  random-number: 
    description: "Random number"
    value: ${{ steps.random-number-generator.outputs.random-id }}
runs:
  using: "composite"
  steps: 
    - run: echo Hello ${{ inputs.who-to-greet }}.
      shell: bash
    - id: random-number-generator
      run: echo "::set-output name=random-id::$(echo $RANDOM)"
      shell: bash
    - run: ${{ github.action_path }}/goodbye.sh
      shell: bash

runs: セクションに using: "composite" を書いて steps セクション配下に、run step を書き連ねて行けば実行してくれます。まさに欲しかったものです。このサンプルでは、別のシェルを作って起動していますが、複数コマンドを直接 yaml に書いても OK。ソフトウェアをダウンロードしてインストールするような処理も簡単に書けます。

    - run: |
        curl -LO https://github.com/roboll/helmfile/releases/download/v0.135.0/helmfile_linux_amd64
        mv helmfile_linux_amd64 helmfile
        chmod +x helmfile
        mkdir -p $HOME/bin
        mv helmfile $HOME/bin
        echo "$HOME/bin" >> $GITHUB_PATH
      shell: bash

shell 属性は必須のようです。

Composite run steps action は GitHub Actions でワークフローを書いた経験があれば作成できるため、Action を作る障壁はかなり下がったと言えると思います。

利用できるのは run のみで、uses で他の Action を呼び出したりすることはできません。複雑なワークフローをまるっと Action にして再利用することはできませんがシェルスクリプトと併用すれば相当複雑なこともできそうです。ただし Action 自体はシンプルな機能にとどめた方が開発も利用も楽ですので、高機能すぎる Action を作るのはやめた方がよいです。

ただ、ワークフロー自体を organization などの単位で共有して色々なリポジトリから利用したいという要求はあって、そのために Organization and enterprise workflows というフィーチャーが予定されています。

github.com

残念ながら現時点では提供時期未定ですが。