Github Actionsを活用したCIの構築について - 活用事例や注意点
はじめに
はじめまして、メンバーズの岩谷です。
私が所属するチームでは、社内に分散したデータを整理統合・活用し、社内のDXを推進していくための基盤となる業務システムを内製で企画・開発・運用をしています。
最近、チーム内で Github Actions を利用する機会があったのですが、比較的簡単にCIを構築することができ、非常に良い体験でした。
そこで、今回は、Github Actions を使用して構築した CI について、簡単に解説していきたいと思います。
Github Actionsの概要や利用方法については、既に多くの情報が存在しているため、詳細な説明は省略します。
Github Actionsの概要や特徴
Github Actionsは、Github上でのCI/CDを実現するためのサービスです。
Github上でワークフローを定義し、ビルド、テスト、デプロイなどの処理を自動化することができます。
Github Actionsの利用方法
Github Actionsを利用するには、対象のリポジトリで.github/workflows ディレクトリにワークフローのYAMLファイルを作成し、必要な処理を記述します。
また、Github上から権限の設定や実行結果の確認などを行えます。
注意事項
Github Actionsを利用するにあたっては、以下のような注意点があります。
- GitHub ホステッド ランナーの使用時間に制限があること
実行時間の増加は開発体験にも影響するため、キャッシュの利用や無駄な処理を極力省くなど、処理時間に配慮した設定にしておくことが望ましいでしょう。
また、セルフホステッド ランナーという機能もあるので、実行時間が長い処理が必要な場合やセキュリティ的な問題がある場合は利用を検討してみてください。 - ストレージに制限があること
GitHub Actionsの成果物を保存できますが、制限があります。
制限にかかるようであれば、クラウドサービスを利用すると良いでしょう。 - キャッシュの利用できるサイズに制限があること
GitHub Actionsの過程でキャッシュを利用できますが、最大10GBの制限があります。 - シークレットなどを安易に利用しないこと
利用せずに済むのであれば利用せず、もし利用する場合はGithubの設定からシークレットを追加し、そこから利用することが望ましいでしょう。 - 安易に書き込み権限を許可しないこと
GitHub Actionsから書き込みを行う必要がある場合は、Githubの設定から権限を付与するのではなく、ジョブ単位で permissions を必要な分だけ指定することで、想定外の挙動やセキュリティリスクなどを減らすことができます。 - 不要になった処理は適宜削除すること
セキュリティや使用制限の観点から適宜削除していくことが望ましいでしょう。 - インジェクションの脅威について知ること
GitHub Actionsでは、コンテキストというものを利用できますが、コミットメッセージなど、任意で入力可能なものを参照する場合などは注意が必要です。
全てを挙げることは難しいですが、これらの注意点を踏まえ、公式ドキュメントも参照して、適切にGithub Actionsを利用することが重要です。
チーム内での活用事例
私が所属するチームでは、Github Actionsを利用して型チェックやLintなどの処理を実行しています。
ワークフローの流れとしては、以下のキャプチャのようになります。
setupジョブでは、以下のように設定しており、ビルドなどを行います。
また、ソースコードを元にした型定義ファイルの生成も行っており、これをGithub Actionsで生成からPushまで実行を行います。
# プルリクの開閉、Push、DraftからOpenへの変更時に実行
on:
pull_request:
types:
- opened
- reopened
- synchronize
- ready_for_review
# デフォルト設定
defaults:
run:
working-directory: app # 作業ディレクトリの指定
jobs:
setup:
if: github.event.pull_request.draft == false # ドラフトのPRは除外
permissions:
contents: write # Pushできるように権限を付与
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
# キャッシュの利用
cache: 'yarn'
cache-dependency-path: 'app/yarn.lock'
- run: yarn install --frozen-lockfile
- run: yarn prisma generate
- run: yarn build
# 型定義ファイル作成
- run: yarn ~
# 型定義ファイルのPush
- run: |
git config user.name "github-actions[bot]"
git config user.email
"41898282+github-actions[bot]@users.noreply.github.com"
if (git diff --shortstat | grep '[0-9]'); then \
git add .; \
git commit -m "GitHub Actions からPush [skip ci]"; \
git push origin HEAD:${{ github.head_ref }}; \
fi
working-directory: ./
# setup の結果をキャッシュに保存
- uses: actions/cache/save@v4
with:
path: ./
key: setup-result-${{ github.sha }}
最後の部分で、setupジョブの結果をキャッシュに保存しています。これは、以下のようにsetup以降のジョブでキャッシュを復元することで、他のジョブでビルドなどの結果を利用できるようにするためです。
jobs:
~~ 省略 ~~
lint:
needs: setup
steps:
# setup の結果をキャッシュから復元
- uses: actions/cache/restore@v4
with:
path: ./
key: setup-result-${{ github.sha }}
- run: ~
また、setupジョブのキャッシュについては、保存し続ける必要がないため、ワークフローの最後で以下のように削除を行います。
jobs:
~~ 省略 ~~
delete-cache:
needs: [setup,vue-tsc,lint,...etc]
if: success() || failure() # needsで指定したジョブが失敗しても実行するように設定
permissions:
actions: write # キャッシュ削除できるように権限を付与
steps:
# setup キャッシュ削除
run: gh cache delete setup-result-${{ github.sha }} --repo ${{ github.repository }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
こちらでは、組織全体の設定においては、以下のように設定しており、第三者が作成したActionsの使用の制限とデフォルトでの書き込み権限の削除を行っています。
今後の展望
今後については、以下の点を考えています。
・生成AIによるプルリクエストの自動レビューの活用
・Google Compute Engineのランナーへの活用
・Github Actionsによるデプロイ作業の簡易化
これらの取り組みにより、さらなる開発速度や品質の向上を目指し、Github Actionsを最大限に活用していきたいと考えています。
まとめ
Github Actionsを利用することで、開発効率の向上や品質の向上など、様々な効果が期待できます。
利用する際には、注意事項を押さえ、適切に設定することが重要です。
本記事が少しでもエンジニアの方々の参考になれば幸いです。
この記事を書いた人
関連記事
- OutSystems始めました
宮内 祥多
- AWSのコスト見積もりのポイント
Hideki Ikemoto