業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【Hakkyの社内Wiki】Strapi
AI

執筆者:Handbook編集部

GitHub Actionsでの複数デプロイ環境に対応した共通化のベストプラクティス

はじめに

GitHub ActionsのCDを運用する中で、デプロイ対象を継ぎ足しで増やしていった結果、YAMLファイルが肥大化していったという経験はありませんか? そういったケースにおいて、デプロイ先への認証処理など共通化できる余地は多くあると思います。

また、開発・ステージング・本番環境にそれぞれデプロイする場合、デプロイ用の REST API を使いパラメータでデプロイ先の分岐を行うのも有効ですが、外部ツールからトリガーする必要があり、場合によっては管理が煩雑になります。

今回は、よりシンプルにGitOpsができる複合アクション(Composite actions) を使った、Github Actionsのコードの共通化のベストプラクティスを紹介します。

本記事では、GCPの開発(dev)と本番(prod)環境を別のGCPプロジェクトで管理し、それぞれの環境にCloud Run Functionsのコンポーネントを複数デプロイするケースを取り扱います。

GitHubのブランチ運用フロー

今回のGitHubブランチは、 feature/* -> develop -> main の流れで進めることを前提とします。 個別機能の開発は feature/* ブランチで行い、レビュー完了後に develop (デフォルトブランチ)へマージします。 リリース準備が整ったら main へマージする形です。

ディレクトリ構成

以下のようなディレクトリ構成でファイルを配置します。 レポジトリ直下にある .github ディレクトリ以下には、 workflowsactions を置きます。 .github/workflows は、個別のCIやCDの処理を置くディレクトリです。 .github/actions は、.github/workflowsから呼び出される共通処理を置けるディレクトリです。

今回、紹介するサンプルでは、 .github/workflows には、各Cloud Functionのデプロイワークフローを配置します。 また、.github/actions 以下に project_name ディレクトリ(これは適宜修正しましょう)を作成し、プロジェクトに対する認証処理のコードを入れます。

.
├── .github
│   ├── actions
│   │   └── project_name
│   │       └── action.action.yml
│   └── workflows
│       ├── deploy_functions_a.yml
│       └── deploy_functions_b.yml
├── functions_a
│   └── main.py
└── functions_b
    └── main.py

GitHub Actionsの設定

共通アクションの設定

まず、 .github/actions/project_name/action.yml に共通アクションを定義します。 ブランチによって環境変数を切り替え、prodとdevそれぞれに対応するGCPのProject IDやProject Numberを設定し、Workload Identityを使った認証設定を行います。 Workload Identityの設定方法については、こちらを参照してください。

name: Setup of env variables and gcloud login
description: "This is the actions for setup of env variables and gcloud login"
runs:
  using: "composite"
  steps:
    - name: set env variables for prod
      shell: bash
      if: github.ref == 'refs/heads/main'
      run: |
        echo ENV=prod >> $GITHUB_ENV
        echo GCP_PROJECT_ID=project-name-prod >> $GITHUB_ENV
        echo GCP_PROJECT_NUMBER=xxx >> $GITHUB_ENV
        echo GCP_REGION=asia-northeast1 >> $GITHUB_ENV

    - name: set env variables for dev
      shell: bash
      if: github.ref == 'refs/heads/develop'
      run: |
        echo ENV=dev >> $GITHUB_ENV
        echo GCP_PROJECT_ID=project-name-dev >> $GITHUB_ENV
        echo GCP_PROJECT_NUMBER=xxx >> $GITHUB_ENV
        echo GCP_REGION=asia-northeast1 >> $GITHUB_ENV

    # Install gcloud, do not specify authentication.
    - uses: google-github-actions/setup-gcloud@v1
      with:
        project_id: ${{ env.GCP_PROJECT_ID }}

    # Configure Workload Identity Federation via a credentials file.
    - id: "auth"
      name: "Authenticate to Google Cloud"
      uses: google-github-actions/auth@v1
      with:
        create_credentials_file: "true"
        workload_identity_provider: "projects/${{ env.GCP_PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-actions-deploy-pool/providers/github-actions-provider"
        service_account: "github-actions-deployer@${{ env.GCP_PROJECT_ID }}.iam.gserviceaccount.com"
        access_token_lifetime: "600s"

    # Authenticate using the created credentials file.
    # WARNING: The --cred-file flag is in preview and is subject to change.
    - id: "gcloud"
      name: "gcloud login"
      shell: bash
      run: gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"

ワークフローファイルの設定

次に、 .github/workflows/deploy_functions_a.yml でCloud Function Aのデプロイを設定します。 この設定により、指定ブランチにプッシュされた際にCloud Functionをデプロイします。 ブランチやパスの指定で、条件を満たした場合にのみデプロイが実行されるようにしています。

name: Deploy Cloud Function

on:
  push:
    branches:
      - main
      - develop
    paths:
      - ".github/workflows/deploy_functions_a.yml"
      - ".github/actions/project_name/action.yml"
      - "functions_a/**"

jobs:
  build:
    name: Deploy Cloud Function
    runs-on: ubuntu-latest
    timeout-minutes: 10

    permissions:
      contents: "read"
      id-token: "write"

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup gcloud
        uses: ./.github/actions/project_name

      - id: deploy_cloud_functions
        run: |
          gcloud \
              --project=${{ env.GCP_PROJECT_ID }} \
              functions deploy ${{ env.ENV }}-functions-a \
              --gen2 \
              --region=${{ env.GCP_REGION }} \
              --runtime=python311 \
              --trigger-http \
              --entry-point="handler" \
              --run-service-account=gcf@${{ env.GCP_PROJECT_ID }}.iam.gserviceaccount.com \
              --source=./functions_a/

同様に、cloud_functions_bのデプロイワークフローも .github/workflows/deploy_functions_b.yml に設定できます。

さいごに

GitHubのブランチフローと組み合わせて、デプロイにおける共通処理をモジュール化する一例をご紹介しました。 この方法により、誤ってリリースした際も同様のフローで簡単にRevertできるため、実用的な運用が可能となります。

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年06月15日に最終更新
読み込み中...