⽬次

  1. はじめに
  2. 処理の共通化とは
  3. 共通化の⽅法
  4. 最後に

1. はじめに

こんにちは。DXビジネス事業部のはしです。


今回は私が所属しているプロジェクトで利⽤している、GitHub Actionsの処理の共通化の⽅法を紹介します。
GitHub Actionsについては、以下の弊社ブログでも紹介していますので合わせてご覧ください。

 

CICDを実現するGitHubActionsについて

2. 処理の共通化とは

現在私が所属しているチームでは⾃社サービスの開発を⾏っており、AWS上に環境を構築しています。


本番環境、ステージング環境、開発環境などがあり、それぞれの環境に対してCloudFormationとGitHub Actionsを利⽤しデプロイ処理を⾏っています。


各環境は、リソース名などの設定が⼀部異なっているものの構成は同⼀になっているため、GitHub Actionsで実⾏する内容もほぼ同⼀です。(VPC名が、vpc-prd-service, vpc-dev-service、となっているなど)


この場合、GitHub ActionsのYAMLファイルを1環境分を作成し、コピー&ペーストで複製するという⽅法もありますが、環境が増えると管理が煩雑になります。


また設定変更の際に、環境毎のYAMLファイルを変更するという作業も発⽣しミスの原因にもなりかねません。


そこで、重複している処理は共通化を⾏い管理の簡略化を⾏っています。

3. 共通化の⽅法

公式ドキュメントの以下の内容を利⽤しています。

 

複合アクションを作成する

 

GitHub Actionsの設定ファイルを格納しているディレクトリの構成は以下のようになっています。

workflowsディレクトリ配下に各環境の設定ファイルを格納しており、リリース⽤ブランチにマージされた際に、それぞれの環境⽤の処理が実⾏されるようになっています。(開発環境⽤リリースブランチにマージされた際に、開発環境へデプロイを⾏う、など)


actionsディレクトリ配下には、workflowsディレクトリ配下の処理から呼び出される共通の処理を格納しています。


それぞれが、どのような設定を⾏っているかを以下に記載します。(記載している内容は本記事⽤に簡略化しています)

 

  • workflowsディレクトリ配下の設定ファイル
    • AWSアカウントの情報は、GitHub Secretsに登録しています
    • 環境毎の設定は、引数として渡しています

name: sample-dev

on:

  push:

    branches:

      - release/dev

env:

  AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID_DEV }}

  AWS_ROLE_ARN_INFRA: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_DEV }}:role/role-github-actions-infra

jobs:

  run_create_resources:

    runs-on: ubuntu-20.04

    steps:

      - name: Checkout

        uses: actions/checkout@v3

      - name: CreateResources

        uses: ./.github/actions/aws_create_resources

        with:

          TARGET_BRANCH_NAME: ${{ github.ref_name }}

          AWS_ACCOUNT_ID: ${{ env.AWS_ACCOUNT_ID }}

          AWS_ROLE_ARN: ${{ env.AWS_ROLE_ARN_INFRA }}

          AWS_REGION: ap-northeast-1

  • actionsディレクトリ配下の設定ファイル
    • iniファイルに設定した各環境⽤の値を取得し、GitHubの変数に設定しています
    • 今回のプロジェクトでは、AWSリソース毎にCloudFormationテンプレートを作成し、必要なリ ソース分のテンプレートを呼び出すようにしています(VPCとELB以外のリソースの記載は省略し ています)

name: create-resources

description: "This action creates AWS resources."

inputs:

  TARGET_BRANCH_NAME:

    required: true

    description: "ブランチ名"

  AWS_ACCOUNT_ID:

    required: true

    description: "デプロイ先のAWSアカウントID"

  AWS_ROLE_ARN:

    required: true

    description: "CloudFormationを実行するIAMロール名"

  AWS_REGION:

    required: true

    description: "デプロイするAWSリージョン"

runs:

  using: composite

  steps:

    - name: Set EnvironmentVariables

      shell: bash

      env:

        ENV_FILE: ./infra/env/cfn.ini

      run: |

        grep '${{ inputs.TARGET_BRANCH_NAME }}-' ${ENV_FILE} | sed 's|${{ inputs.TARGET_BRANCH_NAME }}-||' >> $GITHUB_ENV

    - name: Configure AWS Credentials

      uses: aws-actions/configure-aws-credentials@v2

      with:

        role-to-assume: ${{ inputs.AWS_ROLE_ARN }}

        aws-region: ${{ inputs.AWS_REGION }}

        role-session-name: role-github-actions

    - name: Deploy CloudformationStack/VPC

      shell: bash

      env:

        CFN_TEMPLATE: ./infra/templates/vpc.yml

      run: |

        aws cloudformation deploy \

          --stack-name ${{ env.CFN_PROJECT_NAME }}-${{ env.CFN_ENV }}-vpc \

          --template-file ${CFN_TEMPLATE} \

          --no-fail-on-empty-changeset

    - name: Deploy CloudformationStack/ELB

      shell: bash

      env:

        CFN_TEMPLATE: ./infra/templates/elb.yml

      run: |

        aws cloudformation deploy \

          --stack-name ${{ env.CFN_PROJECT_NAME }}-${{ env.CFN_ENV }}-elb \

          --template-file ${CFN_TEMPLATE} \

          --no-fail-on-empty-changeset

    :

    :

  • cfn.ini
    • 変数名の先頭は、各環境のリリース⽤ブランチ名にしています

# Prd

release/prd-CFN_PROJECT_NAME=sample

release/prd-CFN_ENV=prd

# Stg

release/stg-CFN_PROJECT_NAME=sample

release/stg-CFN_ENV=stg

# Dev

release/dev-CFN_PROJECT_NAME=sample

release/dev-CFN_ENV=dev

4. 最後に

当初、本プロジェクトでは共通化をせずに、コピー&ペーストでYAMLファイルを複製していましたが、管理がし切れなくなり共通化を⾏うことにしました。


処理を共通化することによって、内容を変更 → 開発環境で確認 → 本番環境へ反映と、ちゃんと確認することができるようになった点と、変更箇所が少なくなったことで他のメンバーでも作業が可能になった点がメリットと感じています。


また、良く触れているLinuxのシェルのような感覚で処理を共有化が出来たため、個⼈的に作業は⾏いやすかったです。


まだこうした⽅が良いのかも・・・といった点はあるため、もっと使いやすいように継続して改善に取り組んでいきたいと思っています。