【GitHub Actions】Composite Actionの作成方法

GitHub Actions

GitHub ActionsでComposite Actionを作成する

GitHub Actionsで色々と便利なComposite Actionについて、日本語の情報がまだまだ少なく、わかりやすい物がなかったためまとめておきました!

GitHub Actionsでは、CircleCIでは使えたYAMLのアンカーやエイリアスも使えないので、ただ単に同じような処理をまとめて共通化するような場合だけでも便利でしたので、是非既存の処理のリファクタなどにも使ってみてください。

また実際に動くサンプルも検証し、GitHubへあげておきました!

ドキュメント

参考になるドキュメントはここら辺です。

サンプルレポジトリ

こちら今回作成したコードは、以下レポジトリにあげています。

注意点

プライベートレポジトリで使用する場合

自レポジトリ内の「composite action」をチェックアウトして実行する形なので、プライベートレポジトリでもいけます

GHESで使用する場合

記事作成時点では、GHES(GitHub Enterprise Server)で使用する場合は「composite action」自体は使用できましたが、「composite action」内で「uses」を使用することができなかったです。(GHES自体のバージョンにも依ると思いますが)

またドキュメントを漁ってもGHESでは「composite action」内の「uses」をサポートしていないという文言は見つけられず・・。(でも使うとエラーが出たのでやっぱダメそう。)

なのでGHESで使う場合は、「uses」を使用して複数のActionをまとめることはできず、「run」で動作するShellなどはまとめることができたような感じでした。

なお通常のGitHubのActionsでは、問題なく「composite action」内で「uses」を使えるので大丈夫です。

Composite Actionの作成方法

まずは、呼び出される側の「composite action」を作成して、その後、呼び出す側である全体のワークフローの方を作成しています。

composite action

common

「Hello, World」するだけのシンプルなcomposite actionを作成しています。
こちらはこの後作成する二つのワークフロー(main, sub)両方から呼び出されます。

また「composite action」を作成する際は、「action.yml」という名前にしないとエラーになるので注意。

.github/actions/common/action.yml

name: Common Action
description: Call Common Hello World
runs:
  using: "composite"
  steps:
    - name: Call Hello World From Common Action
      uses: docker://alpine:latest
      with:
        entrypoint: /bin/echo
        args: Hello, World From Common Action!

common_with_input

引数を受け取り、引数に応じた結果を返すcomposite actionです。
こちらもこの後作成する二つのワークフロー(main, sub)両方から呼び出されますが、それぞれ違う引数を渡して使用します。

こちらも注意点としては、「composite action」を作成する際は、「action.yml」という名前にしないとエラーになるので注意。

.github/actions/common_with_input/action.yml

name: Common Action With Input
description: Call Common Hello World With Input
inputs:
  who:
    description: 'Who'
    required: true
    default: 'Me'
outputs:
  hello-world:
    description: "Hello World With Input"
    value: ${{ steps.hello-world-output.outputs.hello-output }}
runs:
  using: "composite"
  steps:
    - id: hello-world-generator
      run: |
        HELLO_ENV="Hello, World From ${{ inputs.who }}!"
        echo "::set-output name=hello-env-output::$(echo $HELLO_ENV)"
      shell: bash

    - name: test
      run: echo ${{ steps.hello-world-generator.outputs.hello-env-output }}
      shell: bash

    - id: hello-world-output
      run: |
        HELLO_OUTPUT="${{ steps.hello-world-generator.outputs.hello-env-output }}"
        echo "::set-output name=hello-output::$(echo $HELLO_OUTPUT)"
      shell: bash

workflows

今度は、先ほど作成した「composite action」を呼び出す側である全体のワークフローを作成していきます。

main.yml, sub.ymlを作成し、「composite action」を呼び出しています。
それぞれ引数は異なる物を渡し、出力する結果を変化させています。

注意点としては、「composite action」を実行するのに、チェックアウトが必要なので、忘れずにactions/checkoutを実行するようにしてください。

main

.github/workflows/main.yml

name: Main Action
on: workflow_dispatch

jobs:
  main:
    name: Hello World
    runs-on: ubuntu-latest
    steps:
      - name: Call Hello World
        uses: docker://alpine:latest
        with:
          entrypoint: /bin/echo
          args: Hello, World!

      - name: Checkout
        uses: actions/checkout@v2

      - name: Call Hello World From Common
        uses: ./.github/actions/common

      - name: Call Hello World From Common With Input
        id: hello-world-with-input-result
        uses: ./.github/actions/common_with_input
        with:
          who: 'Kou'
      - name: Output Hello World From Common With Input
        run: echo ${{ steps.hello-world-with-input-result.outputs.hello-world }}
        shell: bash

実行結果はこんな感じ。

  • 「Hello, World From Common Action!」
  • 「Hello, World From Kou!」

と出力されているのがわかるかと思います。

sub

.github/workflows/sub.yml

name: Sub Action
on: workflow_dispatch

jobs:
  sub:
    name: Hello World
    runs-on: ubuntu-latest
    steps:
      - name: Call Hello World
        uses: docker://alpine:latest
        with:
          entrypoint: /bin/echo
          args: Hello, World!

      - name: Checkout
        uses: actions/checkout@v2

      - name: Call Hello World From Common
        uses: ./.github/actions/common

      - name: Call Hello World From Common With Input
        id: hello-world-with-input-result
        uses: ./.github/actions/common_with_input
        with:
          who: 'Hoge'
      - name: Output Hello World From Common With Input
        run: echo ${{ steps.hello-world-with-input-result.outputs.hello-world }}
        shell: bash

実行結果はこんな感じ。

  • 「Hello, World From Common Action!」
  • 「Hello, World From Hoge!」

と出力されているのがわかるかと思います。

まとめ

今回は、GitHub ActionsでComposite Actionを作成する方法について書きました!

最近CircleCIからGitHub Actionsへ移行して、まだまだまとまった情報が少なかったり、GHESなどを使用しているとまだまだサポートされていない物も多くちょっと不便だと感じています。

またYAMLのアンカーやエイリアスが使えないと、処理の共通化に困ることもありますが、今回のComposite Actionで何とかなりそうな部分もあるので、是非この記事が役に立てば嬉しいです!

オススメの関連商品

Note一覧

コメント

タイトルとURLをコピーしました