LoginSignup
8
4

More than 1 year has passed since last update.

GitHubActionsを使って別リポジトリのYMLを自動更新する

Last updated at Posted at 2021-12-21

前置き

  • Aリポジトリ
    • アプリケーションのソースを管理しているリポジトリ
  • Bリポジトリ
    • 各環境のマニフェストファイルを管理しているリポジトリ

やりかた

Repository Dispatchの仕組みを使ってAリポジトリのイメージ作成をトリガーにBリポジトリにイベントを飛ばす。

やってみる

Aリポジトリ

on:
  push:
    branches:
      - 'dev-*'
      - 'stg-*'
      - 'pilot-*'

環境はdev(開発用)、stg(ステージング用)、pilot(パイロットテスト用)があるとします。
ブランチ名に命名規則に則った特定のブランチ名を付けてPUSHしたタイミングでワークフローが走るようにします。

- name: Repository Dispatch
  uses: peter-evans/repository-dispatch@v1
  with:
    token: ${{ secrets.REPO_ACCESS_TOKEN }}
    repository: <user_name>/<Bリポジトリ名>
    event-type: update-yml
    client-payload: '{"ref": "${{ env.GITHUB_REF }}"}'

ワークフローのトリガーにはpeter-evans/repository-dispatchのActionsを使用します。

  • token:
  • repositroy:
    • Bリポジトリを指定します
  • event-type:
    • イベント識別する任意の文字列を指定します。
  • client-payload:
    • BリポジトリにJSON形式で文字列など必要な情報を渡すことができます。(詳しくはこちら
    • プロパティは10個まで指定が可能になっていてそれ以上を指定するとエラーが発生します。
    • 今回はイメージタグになるブランチ名を渡すようにしています。

その他もろもろを追加して最終的なymlがこちら

repository_dispatch.yml
name: Repository Dispatch

on:
  push:
    branches:
      - 'dev-*'
      - 'stg-*'
      - 'pilot-*'

jobs:
  dispatch:
    name: Repository Dispatch
    runs-on: ubuntu-latest

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

      - name: Set Env
        run: |
          echo "GITHUB_REF=${{ github.ref_name }}" >> $GITHUB_ENV
      - name: Repository Dispatch
        uses: peter-evans/repository-dispatch@v1
        with:
          token: ${{ secrets.REPO_ACCESS_TOKEN }}
          repository: <user_name>/<Bリポジトリ名>
          event-type: update-yml
          client-payload: '{"ref": "${{ env.GITHUB_REF }}"}'

Bリポジトリ

今回更新したいマニフェストファイル

deployment.yml
containers:
  - name: dev
    image: 0000000000.dkr.ecr.ap-northeast-1.amazonaws.com/<ECR リポジトリ名>:v.1.0.0

ワークフロー

on:
  repository_dispatch:
    types:
      - update-yml

repository-dispatchで特定のイベントを受け取ったらワークフローが動作するようにします。
ここでは先ほどAブランチのrepository_dispatch.ymlで指定したevent-typeのupdate-ymlを指定します。

- name: Set Env
  run: |
    echo GITHUB_REF"=${{ github.event.client_payload.ref }}" >> $GITHUB_ENV

repository_dispatch.ymlで指定したclient-payloadを上記で取得します。

- name: Update dev Yml
  if: startsWith(env.GITHUB_REF, 'dev-')
  uses: mikefarah/yq@master
  with:
    cmd: IMAGE_TAG=' 0000000000.dkr.ecr.ap-northeast-1.amazonaws.com/<ECR リポジトリ名>:${{ env.GITHUB_REF }}' yq eval '.containers[].image = env(IMAGE_TAG)' -i k8s/dev/development.yml

GithubActionsからymlファイルの更新には今回はyqというjqのyaml版を使用します。
公式ドキュメント:https://mikefarah.gitbook.io/yq/
環境ごとに更新するファイルが異なるのでifでブランチ名の先頭文字列で判定をしています。
変数IMAGE_TAGに置き換えたい文字列を生成します。

'.containers[].image = env(IMAGE_TAG)'

ここで前述したマニフェストファイルの書き換えたい部分を指定してIMAGE_TAGで更新しています。

その他諸々を追加して最終的なymlがこちら

update_image.yml
name: Update Yml

on:
  repository_dispatch:
    types:
      - update-yml

jobs:
  update-yml:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set Env
        run: |
          echo GITHUB_REF"=${{ github.event.client_payload.ref }}" >> $GITHUB_ENV

      - name: Update dev Yml
        if: startsWith(env.GITHUB_REF, 'dev-')
        uses: mikefarah/yq@master
        with:
          cmd: IMAGE_TAG=' 0000000000.dkr.ecr.ap-northeast-1.amazonaws.com/<ECR リポジトリ名>:${{ env.GITHUB_REF }}' yq eval '.containers[].image = env(IMAGE_TAG)' -i k8s/dev/development.yml

      - name: Update stg Yml
        if: startsWith(env.GITHUB_REF, 'stg-')
        uses: mikefarah/yq@master
        with:
          cmd: IMAGE_TAG=' 0000000000.dkr.ecr.ap-northeast-1.amazonaws.com/<ECR リポジトリ名>:${{ env.GITHUB_REF }}' yq eval '.containers[].image = env(IMAGE_TAG)' -i k8s/stg/development.yml

      - name: Update pilot Yml
        if: startsWith(env.GITHUB_REF, 'pilot-')
        uses: mikefarah/yq@master
        with:
          cmd: IMAGE_TAG=' 0000000000.dkr.ecr.ap-northeast-1.amazonaws.com/<ECR リポジトリ名>:${{ env.GITHUB_REF }}' yq eval '.containers[].image = env(IMAGE_TAG)' -i k8s/pilot/development.yml

      - name: commit & push
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          BRANCH_NAME="ブランチ名"
          git config user.name <ユーザ名>
          git config user.email <メールアドレス>
          git checkout -b "$BRANCH_NAME"
          git add -A
          git commit -m "$BRANCH_NAME"
          git push origin "$BRANCH_NAME"

パーソナルアクセストークンの設定方法

パーソナルアクセストークンの発行

https://github.com/settings/tokensGenerate new tokenボタンからトークンを発行します。

スクリーンショット 2021-12-20 162613.png
repo権限をつけます。
他にも必要な権限があれば適宜つけてください。

スクリーンショット 2021-12-20 163816.png
トークンを発行したら、このように表示されるので文字列をコピーします。

これでパーソナルアクセストークンの発行は完了です。

リポジトリのシークレットを追加する

リポジトリのSettingsページからシークレットの追加をします。
GithubのリポジトリのページのSettings > SecretsにあるNew repository secretボタンを押すと追加ができます。
Valueにさきほどパーソナルアクセストークンを発行したときにコピーした文字列を入力してAdd secretボタンを押すと完了します。
スクリーンショット 2021-12-20 165038.png

これでパーソナルアクセストークンの発行&シークレットの追加が完了したので、${{ secrets.REPO_ACCESS_TOKEN }}が使用できるようになります。
REPO_ACCESS_TOKENの部分はシークレットを追加したときのNameになります。

実際に動かしてみる

Aリポジトリでdev-39という名前でブランチを作成。
スクリーンショット 2021-12-20 165927.png
SUCCESSになっていてちゃんとイベントが飛んでいそう。

BリポジトリのActionsを見てみる
スクリーンショット 2021-12-20 170056.png
自動でワークフローが動いてSUCCESSになっている。
ちゃんとdevのマニフェストファイルを更新していそう。

イメージタグの更新がPUSHされているか確認する。
スクリーンショット 2021-12-20 170323.png
狙い通りブランチ名でイメージタグが更新されていた。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4