✍️

GitHub Actions から yaml ファイルを更新する

2021/08/12に公開

GitOps をやっていて GitHub Actions から helm チャート values ファイル( yaml )の Docker イメージタグ部分を自動で書き換えたくなりました。
イメージタグには git のコミットハッシュ値を使っています。

main ブランチにあるマニフェストの状態 = 該当環境にデプロイされている状態 としたいです。
ヒューマンエラーを避ける、効率化の観点からなるべく手動でのオペレーションは排除したいと考え、 yaml を cli から書き換えることができないか調べました🧐

やる

https://github.com/mikefarah/yq
良いものがありました。 json パーサとして認識の 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