目次
概要
GitHub Actionsを使って開発をする際にActionで共通で使う部分が出てくることがあります。この時、Composite Actionを使うと共通で使う部分を一つのActionにまとめて再利用性を高めることができます。
このブログポストではComposite Actionを使ってGitHub Actionsの再利用性を高める方法について紹介します。
Composite Actionとは
Composite Actionは複数のActionを一つのActionにまとめて使うことができる機能です。Composite Actionを使うと複数のActionで共通で使う部分を一つのActionにまとめて再利用性を高めることができます。
- 公式ドキュメント: Composite Action
重複コードがあるGitHub Actionの例
Reactを使うプロジェクトで次のようなGitHub Actionsを使うことができます。
name: 'Check code'
on:
pull_request:
jobs:
cspell:
name: CSpell
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20.3.0
- name: Enable Yarn 3.7.0
run: corepack enable
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: CSpell
run: yarn cspell
remark:
name: Remark-lint
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20.3.0
- name: Enable Yarn 3.7.0
run: corepack enable
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Remark-lint
run: yarn remark
eslint:
name: ESLint
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20.3.0
- name: Enable Yarn 3.7.0
run: corepack enable
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: ESLint
run: yarn lint
stylelint:
name: Stylelint
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20.3.0
- name: Enable Yarn 3.7.0
run: corepack enable
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Stylelint
run: yarn stylelint
test:
name: Test
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20.3.0
- name: Enable Yarn 3.7.0
run: corepack enable
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Test
run: yarn test
ReactプロジェクトでCSpell
と複数のLinter
とTest
を実行するGitHub Actionsです。ここでDependenciesをインストールする部分が重複していることが分かります。
...
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20.3.0
- name: Enable Yarn 3.7.0
run: corepack enable
- name: Install dependencies
run: yarn install --frozen-lockfile
...
この部分をComposite Actionを使って一つのActionにまとめて再利用する方法について見ていきます。
Composite Actionを作る
Dependenciesをインストールする部分をComposite Actionにするために.github/actions/install-dependencies.yml
ファイルを作成して次のように修正します。
name: 'Install Dependencies'
description: 'Install Dependencies'
runs:
using: 'composite'
steps:
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20.3.0
- name: Enable Yarn 3.7.0
shell: bash
run: corepack enable
- name: Install dependencies
shell: bash
run: yarn install --frozen-lockfile
Composite Action
を使うためにはusing
キーワードにcomposite
を使ってComposite Actionであることを明示します。そしてsteps
にComposite Actionを実行するステップを記述します。
コマンドを実行する際にはshell
キーワードにbash
を使ってbashシェルを使うように設定する必要があります。
Composite Actionを使う
Composite Actionを使うためにはGitHub Actionsを次のように修正します。
name: 'Check code'
on:
pull_request:
jobs:
cspell:
name: CSpell
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install_dependencies
- name: CSpell
run: yarn cspell
remark:
name: Remark-lint
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install_dependencies
- name: Remark-lint
run: yarn remark
eslint:
name: ESLint
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install_dependencies
- name: ESLint
run: yarn lint
stylelint:
name: Stylelint
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install_dependencies
- name: Stylelint
run: yarn stylelint
test:
name: Test
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install_dependencies
- name: Test
run: yarn test
공통으로 분리한 Composite Action을 다음과 같이 사용하도록 수정하였습니다.
...
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/actions/install_dependencies
...
Composite Action
는 .github
フォルダで管理しているため、actions/checkout
を使ってコードを先にチェックアウトする必要があります。その後、uses
キーワードにComposite Actionのパスを記述してComposite Actionを使えます。
Composite Actionのinputs
Composite Action
を使う際、特定の値を渡してActionを実行したい場合があります。この場合、Composite Action
のinputs
を使って値を渡すことができます。
Composite Action
のinputs
を使うため、Composite Action
を次のように修正します。
name: 'Composite Action with inputs'
description: 'Composite Action with inputs'
inputs:
variable_name:
description: 'Description of the variable'
required: true
default: 'variabel_default_value'
runs:
using: 'composite'
steps:
- name: Print Composite Action inputs variable
run: echo ${{ inputs.variable_name }}
shell: bash
このinputs
を使うと条件によって異なる動作をするComposite Action
を作成することができます。
このように作ったComposite Action
は次のように使ってComposite Action
のinputs
を使うことができます。
...
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Composite Action with inputs
uses: ./.github/actions/composite_action
with:
variable_name: 'test_input_value'
...
Composite Actionのoutputs
Composite Action
を使う際、Composite Action
から特定の値を受け取ってActionを実行したい場合があります。この場合、Composite Action
のoutputs
を使って値を渡すことができます。
name: 'Composite Action with outputs'
description: 'Composite Action with outputs'
outputs:
variable_name:
description: "variable description"
value: ${{ steps.output_step.outputs.output_variable_name }}
runs:
using: 'composite'
steps:
- name: Set outputs
id: output_step
run: echo "output_variable_name=test_output_value" >> $GITHUB_OUTPUT
shell: bash
このように作ったComposite Action
は次のように使ってComposite Action
のoutputs
を使うことができます。
...
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Composite Action with outputs
id: composite_action
uses: ./.github/actions/composite_action
- name: Print Composite Action outputs variable
run: echo ${{ steps.composite_action.outputs.variable_name }}
...
outputs
を使うとComposite Action
の実行結果を使うAction
を作成することができます。
完了
これでComposite Action
を使ってGitHub Actionsの重複を減らし、Actionの再利用性を高める方法について紹介しました。
皆さんももし重複するActionがあればComposite Action
を使ってActionの再利用性を高めてみてください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。