こんにちは。AWS事業本部コンサルティング部に所属している今泉(@bun76235104)です。
今回初めて自作のGitHub Actionsのアクションを作成している時に、複合アクション(compositeアクション)を触ってみました!
ただ単にJavaScriptのコードを動かすだけなら、複合アクションを使用する必要ありませんが、どうしても事前にとあるシェルスクリプトを実行する必要があったので、解決策の1つとして利用してみました!
GitHub Actionsとは
GitHubで用意されているCI/CDに利用できるサービスです。
公開されているさまざまなアクションを組み合わせて利用することはもちろん、自分でアクションを作成可能です。
GitHub Actionsを自作するにあたって、以下の3種類のアクションを選択できます。
私は今回JavaScriptのアクションを活用して、あらかじめ用意したJavaScriptファイル(index.js
)を実行する想定でした。
しかしindex.js
を実行する前に、どうしても別途シェルスクリプトを実行する必要性がでてきました。
解決策としては以下の3つが思い浮かんだものの、今回は3番目の複合アクションを利用してみることにしました。
- そもそもシェルスクプトを使わない
- Dockerfileで必要な環境・必要な処理を定義してDockerコンテナのアクションを利用する
- 複合アクションでシェルスクプトの次にJavaScriptのコードを実行する
なお、今回は複合アクションを使いたかったという理由もあり選定していますが、Dockerfileで必要な環境・処理をひとまとめにする方法で多くのユースケースは解決する気がしています。
action.ymlの設定
以下のように、action.ymlを定義することで実装しました。
name: "Sample"
description: "Sample Composite Action"
author: "bun913"
inputs:
AUTHOR_ID:
required: true
description: "sample input"
GH_TOKEN:
required: false
default: ${{ github.token }}
description: "GitHub Token"
runs:
# 複合アクションの利用を宣言
# https://docs.github.com/ja/actions/creating-actions/creating-a-composite-action
using: "composite"
steps:
# 公開されている既存のアクションを使ってNode.jsのセットアップ
- uses: actions/setup-node@v3
with:
node-version: 16
# 事前に実行したかったシェルスクリプトの実行
- run: "${GITHUB_ACTION_PATH}/preprocess.sh"
shell: bash
# 本筋のJavaScriptファイル実行
- run: "node ${GITHUB_ACTION_PATH}/dist/index.js"
env:
INPUT_AUTHOR_ID: ${{ inputs.AUTHOR_ID }}
INPUT_GH_TOKEN: ${{ inputs.GH_TOKEN }}
INPUT_SHA: ${{ github.sha }}
shell: bash
branding:
icon: "bar-chart-2"
color: "blue"
なお、${GITHUB_ACTION_PATH}はデフォルトの環境変数でaction.ymlが配置されたパスを取得します。
こちらを使わずに ./dist/index.js
などと指定した場合、この自作アクションを呼び出した側のリポジトリのパスを参照してしまいます。
以下の記事がわかりやすかったのでご参照ください。
上記ymlを見てのとおり、actions/setup-node@v3
のような既存のアクションも利用できるので、再利用性の高いアクションを作成できそうです!
まとめ
私の所感・留意事項などは以下のとおりです。
- GitHub Actionsの複合アクションでは既存のアクションを処理に組み込むことも可能
- 車輪の再発明を避けつつ、気軽にワークフローが組めそう
- ただし任意の処理を実行される危険性もあるためスクリプトインジェクションなどに留意が必要
- こちらの本が非常に分かりやすくまとまっていて、参考になりました!
想像以上に気軽に自作アクションを作成できましたので、ぜひ皆さんも自作アクションを試してみてください!
この記事がどたなか1人でも参考になれば嬉しいです。