GitHub Actionsで他のリポジトリのコードをcheckoutする

状況

Github Actionを使用する際に、別のリポジトリで用意しているインフラ設定(Terraform)を流用したかったので、その際の対応方法のメモ。

workflow.yml

以下のci/cdは、mainブランチへのマージ時に、アプリケーションのdocker imageをbulidし、ECSで稼働させます。
ハイライト部分がインフラ設定のリポジトリをチェックアウトする部分です。

name: update ECS
# mainへのpushをトリガーとする
on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

env:
  ENV: stg
jobs:
  build-deploy:
    name: build image and update ECS
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: login aws oicd
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-actions-oidc 
          aws-region: ap-northeast-1

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      # アプリケーションリポジトリでECSで稼働させるdocke imageをbuildし、ECRにpushする。
      - name: push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          ECR_REPOSITORY=my-repo-${{ env.ENV }}
          docker build . -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f docker/rails/Dockerfile
          IMAGE_URL=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          docker push $IMAGE_URL
          echo "::set-output name=image::$IMAGE_URL"

      # インフラ設定を持つリポジトリをチェックアウト
      - name: checkout
        uses: actions/checkout@v2
        with:
          repository: my-org/my-infra-repo
          ref: main # checkout対象のブランチの指定
          path: infra # checkoutしたリポジトリを配置するディレクトリを指定
          # インフラのリポジトリがprivateの場合は、pull権限を持つtokenを与える必要があります。
          token: ${{ secrets.GET_PRIVATE_REPOS }}

      # Terraform環境を用意するためのtemplate
      - name: terraform setup
        uses: hashicorp/setup-terraform@v1
        with:
          terraform_version: 0.14.5
          # terraform outputの実行のために必要な設定
          # https://blog.nillsf.com/index.php/2020/08/25/how-to-use-terraform-output-in-a-github-action/
          terraform_wrapper: false

      # ECSのterraform applyに必要なvariablesを用意する
      - name: fetch outputs of ALB
        id: alb-output
        working-directory: infra/modules/alb
        run: |
          terraform init
          ALB_TARGET_GROUP_ARN=`terraform output -raw alb_target_group_arn`
          echo "::set-output name=alb_target_group_arn::$ALB_TARGET_GROUP_ARN"

      # 今回はTerraformを使うのですが、backend.tfはインフラのリポジトリにも用意してないので、作成します。
      - name: set remote state of ECS
        working-directory: infra/modules/ecs
        run: |
          cat > backend.tf << EOF
          terraform {
            backend "s3" {
              bucket  = "my-repo-${{ env.ENV }}-tfstate"
              key     = "ecs.tfstate"
              region  = "ap-northeast-1"
              encrypt = true
            }
          }
          EOF

      # Terraform initを実行するstep
      - name: terraform init ECS
        run: terraform init
        # 処理を実行させるディレクトリを指定します
        working-directory: infra/modules/ecs

      # Terraform applyを実行するstep
      - name: terraform apply ECS
        id: terraform-apply
        env:
          IMAGE_URL: ${{ steps.build-image.outputs.image }}
          ALB_TARGET_GROUP: ${{ steps.alb-output.outputs.alb_target_group_arn }}
        working-directory: infra/modules/ecs
        run: |
          terraform apply -auto-approve -no-color \
          -var="service=my-repo" \
          -var="environment=${{ env.ENV }}" \
          -var="image=$IMAGE_URL" \
          -var="alb_target_group_arn=$ALB_TARGET_GROUP" \
          -var="aws_iam_role_ecs_task_role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/my-repo-stg-task-role" \
          -var="aws_iam_role_ecs_task_execution_role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/my-repo-stg-task-execution-role" \
          -var="ecs_task_count=2"

 

参考: https://zenn.dev/jerome/articles/cc07ad73e017ad

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.