前置き
- 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:
-
${{ secrets.GITHUB_TOKEN }}
を使用することができないので、repo権限があるpersonal access token を用意してください。(手順は後述します)
-
- repositroy:
- Bリポジトリを指定します
- event-type:
- イベント識別する任意の文字列を指定します。
- client-payload:
- BリポジトリにJSON形式で文字列など必要な情報を渡すことができます。(詳しくはこちら)
- プロパティは10個まで指定が可能になっていてそれ以上を指定するとエラーが発生します。
- 今回はイメージタグになるブランチ名を渡すようにしています。
その他もろもろを追加して最終的な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リポジトリ
今回更新したいマニフェストファイル
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がこちら
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/tokens のGenerate new token
ボタンからトークンを発行します。
repo権限をつけます。
他にも必要な権限があれば適宜つけてください。
トークンを発行したら、このように表示されるので文字列をコピーします。
これでパーソナルアクセストークンの発行は完了です。
リポジトリのシークレットを追加する
リポジトリのSettingsページからシークレットの追加をします。
GithubのリポジトリのページのSettings > SecretsにあるNew repository secret
ボタンを押すと追加ができます。
Valueにさきほどパーソナルアクセストークンを発行したときにコピーした文字列を入力してAdd secret
ボタンを押すと完了します。
これでパーソナルアクセストークンの発行&シークレットの追加が完了したので、${{ secrets.REPO_ACCESS_TOKEN }}
が使用できるようになります。
REPO_ACCESS_TOKEN
の部分はシークレットを追加したときのNameになります。
実際に動かしてみる
Aリポジトリでdev-39
という名前でブランチを作成。
SUCCESSになっていてちゃんとイベントが飛んでいそう。
BリポジトリのActionsを見てみる
自動でワークフローが動いてSUCCESSになっている。
ちゃんとdevのマニフェストファイルを更新していそう。