✍️
GitHub Actions から yaml ファイルを更新する
GitOps をやっていて GitHub Actions から helm チャート values ファイル( yaml )の Docker イメージタグ部分を自動で書き換えたくなりました。
イメージタグには git のコミットハッシュ値を使っています。
main ブランチにあるマニフェストの状態 = 該当環境にデプロイされている状態
としたいです。
ヒューマンエラーを避ける、効率化の観点からなるべく手動でのオペレーションは排除したいと考え、 yaml を cli から書き換えることができないか調べました🧐
やる
jq
の yaml 版のようです😊
公式ドキュメント も充実していて困りませんでした。
基本は eval
というコマンドを利用するみたいです。
GitHub Actions でやるならこんな感じになりました。
yq:
env:
ENV: stg
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: chage docker image
uses: mikefarah/yq@master
with:
cmd: IMAGE_TAG=${{ github.sha }} yq eval '.dockerImageTag = env(IMAGE_TAG)' -i ${{ env.WORK_DIR }}/infrastructure/kubernetes/mychart/${{ env.ENV }}-values.yaml
公式の Action も提供されています。
シェルの環境変数を展開して yaml に渡すこともできます。
これによって values ファイルを書き換えることができました🙌
この変更を適用したPRを作ってマージして Argo CD 経由で Kubernetes クラスタと同期してみたいな GitOps ワークフローを構築したい場合にはこんな感じになりました。
サンプルレベルなので適宜変更して頂けたらと思います🙇♂️
createPullRequestForStg:
env:
ENV: stg
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: chage docker image
uses: mikefarah/yq@master
with:
cmd: IMAGE_TAG=${{ github.sha }} yq eval '.dockerImageTag = env(IMAGE_TAG)' -i ${{ env.WORK_DIR }}/infrastructure/kubernetes/mychart/${{ env.ENV }}-values.yaml
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: |
[${{ env.ENV }}] update container image
committer: GitHub <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
signoff: false
branch: create-pull-request/release/${{ env.ENV }}
base: main
delete-branch: true
title: |
[${{ env.ENV }}] Update Container Image
body: |
[${{ env.ENV }}] Update Container Image
- Updated helm chart container image
- Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
labels: |
update container image
${{ env.ENV }} release
assignees: tatsuro-m
draft: false
- name: merge PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh pr merge ${{ steps.cpr.outputs.pull-request-url }} --merge
割と良い感じにパイプラインを構築できたのでは無いかなと思います!
yq 自体の紹介は少なかったですが、色々と使えそうなツールですね👨💻
どなたかの参考になれば幸いです。
Discussion