【入門編】GitHub Actionsの「Reusable Workflows」徹底活用!組織全体で標準化するCI/CDテンプレート戦略 – バージョン管理・CI/CD活用バイブル

こんにちは!開発現場で毎日のようにCI/CDのパイプラインと格闘している先輩エンジニアです。

新しいプロジェクトが立ち上がるたびに、似たようなYAMLファイルをコピペして、微妙に違うバージョンを修正し、テストが通らなくて頭を抱える……そんな経験はありませんか?「またこのボイラープレート(お決まりのコード)を書いているな」と思った瞬間、それは自動化の怠慢であり、技術的負債の芽です。

今回は、GitHub Actionsの秘められた強力な武器「Reusable Workflows(再利用可能ワークフロー)」を徹底解説します。これをマスターすれば、組織全体のCI/CD標準化が一瞬で進み、毎日の作業が劇的に楽になりますよ。

—

1. そもそも「Reusable Workflows」とは?(ツールの役割)

一言で言うと、「他のワークフローから呼び出して使える、共通テンプレート化されたワークフロー」です。

これまでのGitHub Actionsでも、`uses:` を使ってコミュニティ製の「アクション(Action)」を呼び出すことはできましたよね。しかし、アクションを作るにはJavaScriptやDockerの知識が必要で、ちょっとハードルが高かったのです。

一方、Reusable Workflowsは、書き慣れたYAMLファイルのままで、「関数」のように他のリポジトリから呼び出せるのが最大の特徴です。

なぜ組織全体で使うべきなのか?(運用の工数削減メリット)

  • 「DRY(Don’t Repeat Yourself)」原則の徹底: セキュリティスキャンやビルドの手順が変わったとき、変更するのは「大元のリポジトリ」の1箇所だけ。全社のリポジトリが自動的に最新の安全なパイプラインに追従します。
  • 品質の強制力(ガバナンス): 「絶対に実行すべきテスト」や「脆弱性チェック」を共通フローに組み込んでおけば、開発者がうっかりスキップするのを防げます。

—

2. 基礎セットアップ:再利用ワークフローの置き場所とルール

まずは、組織全体で共有するための「大元のリポジトリ」を一つ決めましょう。今回は仮に `my-org/actions-library` というリポジトリを作ったとします。

Reusable Workflowsの肝は、配置場所とトリガーの指定方法です。

テンプレート側のルール

1. 保存先は `.github/workflows/` ディレクトリ。
2. トリガーに `workflow_call` を指定する(これがスイッチになります)。

それでは、最も基本となる「テスト実行の共通テンプレート」を作ってみましょう。

ファイルパス: `my-org/actions-library` リポジトリの `.github/workflows/node-ci.yml`

name: Reusable Node.js CI

1. 外部のリポジトリから呼び出せるようにするトリガー
on:
workflow_call:
# 2. 呼び出し元から受け取るパラメータ(inputs)の定義
inputs:
node-version:
description: ‘使用するNode.jsのバージョン’
required: false
default: ’18.x’
type: string
# 3. 呼び出し元からセキュアに受け取る秘密情報(secrets)の定義
secrets:
npm-token:
description: ‘npmのプライベートレジストリ用トークン’
required: false

jobs:
test:
runs-on: ubuntu-latest
steps:

  • name: コードのチェックアウト

uses: actions/checkout@v4

  • name: Node.jsのセットアップ

uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: ‘npm’

依存関係のインストールとテスト

  • name: Install Dependencies

run: npm ci

  • name: Run Tests

run: npm test
env:
# 必要に応じて渡されたセキュア情報を環境変数にセット
NODE_AUTH_TOKEN: ${{ secrets.npm-token }}

これで、再利用の「部品」の準備は完了です!

—

3. HelloWorld的な動作確認:アプリ側から呼び出してみる

次に、実際に開発している個別のアプリケーション側(例: `my-org/my-web-app`)から、先ほど作った共通テンプレートを呼び出してみましょう。

ファイルパス: `my-org/my-web-app` リポジトリの `.github/workflows/ci.yml`

name: Web App CI

アプリ側は通常通り push や pull_request でトリガーする
on:
push:
branches: [ “main” ]

jobs:
# 共通ワークフローを呼び出すジョブ
call-node-ci:
# リポジトリ名/.github/workflows/ファイル名@ブランチ名(またはタグ、コミットハッシュ)を指定
uses: my-org/actions-library/.github/workflows/node-ci.yml@v1.0.0
with:
node-version: ’20.x’ # 呼び出し側で柔軟にパラメータを変更可能!
secrets:
npm-token: ${{ secrets.MY_ORG_NPM_SECRET }} # 組織のシークレットを渡す

バージョン管理の極意:なぜ `@v1.0.0` と指定するのか?

ここがプロのエンジニアのこだわりポイントです。`@main` のようにブランチを指定してしまうと、大元の共通テンプレートを修正した瞬間に、全アプリのCIが意図せず壊れるリスク(サプライチェーン攻撃や予期せぬバグ)があります。

必ず Gitのタグ(`@v1.0.0`など)やコミットハッシュ で固定し、バージョンをコントロールしましょう。アップデートは、アプリ側が準備できたタイミングでタグを書き換えるだけです。安全かつ確実ですね。

—

4. 現場で役立つ設計パターンとハック

最後に、実際に組織で運用する中で壁にぶつかりがちなポイントをクリアする設計パターンをご紹介します。

パターンA: 呼び出し元へデータを返す(outputsの活用)

共通テンプレート内でビルドした成果物(アーティファクト)や、生成されたバージョン番号を、呼び出し元の後続ジョブで使いたい場合もありますよね。そんなときは `outputs` を使います。

テンプレート側 (`node-ci.yml`) の一部:

on:
workflow_call:
outputs:
build-version:
description: ‘生成されたビルドバージョン’
value: ${{ jobs.build.outputs.version }} # ジョブの出力を紐付ける

jobs:
build:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.meta.outputs.version }} # ステップの出力をジョブに渡す
steps:

  • id: meta

run: echo “version=1.2.3” >> $GITHUB_OUTPUT

呼び出し側での受け取り:

jobs:
build:
uses: my-org/actions-library/.github/workflows/node-ci.yml@v1.0.0

deploy:
needs: build
runs-on: ubuntu-latest
steps:

  • run: echo “Deploying version ${{ needs.build.outputs.build-version }}”

—

まとめ

GitHub ActionsのReusable Workflows、いかがでしたでしょうか?

  • 「書くな、再利用しろ」: ボイラープレートを捨てて共通テンプレートに集約する。
  • 安全なバージョニング: タグを指定して予期せぬ破壊的変更を防ぐ。
  • 柔軟なカスタマイズ: `inputs` と `secrets` で各リポジトリの個性を吸収する。

これを導入するだけで、チーム全体の開発体験(DX)は劇的に向上し、CI/CDのメンテナンスタスクに時間を奪われることがなくなります。ぜひ、次のスプリントであなたの組織の共通リポジトリを作ってみてください。

それでは、快適な自動化ライフを!

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