📀

ArgoCD に合わせたフロントエンドの DevOps

2024/03/29に公開

はじめに

ビットキーで bitkey platform を開発しています @otakakot です。

以前、 CloudNative Days Tokyo 2023 での登壇や記事にて bitkey platform の DevOps について紹介しました。

https://cloudnativedays.jp/cndt2023/talks/2021

https://qiita.com/_otakakot_/items/12722dafa7d526ae61af

これらは Kubernetes (ArgoCD) を使っている前提の話です。
しかし、リリースするものがすべてコンテナでよしなにできるわけではありません。
管理方法によると思いますが、フロントエンドのリソースなどはコンテナとして扱わないこともあるかと思います。

このようなリソースをみなさんはどのようにリリースしているでしょうか?
デプロイ先に CLI ツールで(コマンド操作して)リリースすることになると思います。

こちらのコマンド、どのタイミングで実行しますか?
bitkey platform では ArgoCD のリリースフローの流れと同一となるようにフロントエンドのリリースを工夫しています。
リリースの流れを同一にしておくことでリリース時の認知負荷の低減が期待できます。
(管理コストは増えるかもしれませんが ... )

そんな bitkey platform でのフロントエンドのリソース管理についてご紹介します。

※ 現在、記事を執筆しつつフローも修正している箇所もあるのですべてがこの通りではありません。ご了承ください。

前提知識 : GitOps と CIOps

デプロイ方式として GitOps と CIOps という形式があります。
詳しい話は以下の記事をご参考いただきたいです。

https://blog.inductor.me/entry/2021/09/24/015402

今回紹介するフロントエンドのリリースは ArgoCD のように管理するので GitOps かと思われるかもしれませんが、 CIOps にあたります。

リポジトリ

ざっくりと bitkey platform が管理するリポジトリは下記の通りです。

  • resource ( Go コード や フロントエンド が複数 )
  • manifest ( Kubernetes マニフェスト )

ArgoCD は manifest リポジトリを監視し GitOps にて各環境へと自動でリリースしています。

bitkey platform の環境

bitkey platform は以下の環境を管理しています。

環境名 environment 用途
開発 develop bitkey platform 開発用
ステージング staging ビットキー社内開発/検証用
本番ミラー production-mirror リリース前最終検証用
本番 production

ArgoCD を使った DevOps

ざっくりと GitHub リポジトリと GitHUb Actions, ArgoCD の関係を図にすると下記のようになります。

各環境にリリースされるまでの流れは以下の表の通りです。
表の項目は左から

  • Step
  • Which ... どのリポジトリで
  • When ... どのタイミングで
  • What ... どんなことをして
  • To ... 次の Job 呼び出し先リポジトリ

で整理しています。

開発環境

Which (Repo) When What (Job) To (Repo)
1 resource on push (main merge) コンテナデリバリー, repository_dispatch manifest
2 manifest repository_dispatch マニフェスト更新 -

ステージング環境

Which (Repo) When What (Job) To (Repo)
1 recource cron タグ作成 resource
2 resource on push (tag trigger) コンテナデリバリー, repository_dispatch manfiest
3 manifest repository_dispatch マニフェスト更新 -

本番ミラー環境

Which (Repo) When What (Job) To (Repo)
1 manifest repository_dispatch マニフェスト更新 -

※ ジョブの詳細は以下の記事をご参照ください。

https://qiita.com/_otakakot_/items/12722dafa7d526ae61af

本番環境

Which (Repo) When What (Job) To (Repo)
1 scheduler cron create tag resource
2 resource on push (tag trigger) コンテナデリバリー, repository_dispatch manifest
3 manifest repository_dispatch マニフェスト更新 -

ArgoCD に合わせたフロントエンドの DevOps

ここから本題である ArgoCD に合わせたフロントエンドの DevOps について示します。

ArgoCD と同様に、ざっくりと GitHub リポジトリと GitHUb Actions、 ホスティング先である Firebase の関係を下記のように図として示します。

ArgoCD のときにはなかった scheduler が登場していますが、 resource で cron トリガーを引いていた GitHub Actions が移動しただけです。責務を分けたかったのでこのように整理しています。

開発環境

Which (Repo) When What (Job) To (Repo)
1 resource on push (main merge) repository_dispatch manifest
2 manifest repository_dispatch マニフェスト更新 -
3 manifes on push (main merge) リリース -

ステージング環境

Which (Repo) When What (Job) To (Repo)
1 scheduler cron タグ作成 resource
2 resource on push (tag trigger) repository_dispatch manfiest
3 manifest repository_dispatch マニフェスト更新 -
4 manifes on push (main merge) リリース -

本番ミラー環境

Which (Repo) When What (Job) To (Repo)
1 manifest repository_dispatch マニフェスト更新 -
2 manifest on push (open pr) リリース -

本番環境

Which (Repo) When What (Job) To (Repo)
1 scheduler cron タグ作成 resource
2 resource on push (tag trigger) repository_dispatch manifest
3 manifest repository_dispatch マニフェスト更新 -
4 manifest on push (main merge) リリース -

リリース方法

ArgoCD と異なり、フロントエンドは manifest リポジトリの GitHub Actions にて直接リリース用のコマンドを実行しています。
何か特別なことをしているかと言われるとそんなことはなく、ただ manifest リポジトリにデプロイの責務を寄せているだけです!
一方で現在困っているのがリリースのコマンドを誰が知っておくべきかということです。
デプロイの責務を manifest リポジトリに寄せていますが、現状はフロントエンドを管理するリポジトリにコマンドを記載しておき manifest リポジトリにて該当リポジトリを clone して実行しています。
このコマンドを manifest リポジトリに記載すべきかフロントエンドを管理するリポジトリに置いておくべきかは迷っています。

順番制御の自動化はできていない

フロントエンドは上流下流を考えると一番最後にリリースするかと思います。
バックエンドは後方互換性を保つために最初にリリースしていきます。
本番環境においては、 PR をマージしたタイミングでリリースが動き出します。
(本番環境以外は厳密にコントロールしていません。)
ArgoCD で完結することができればコントロールは可能になりますが、CIOps も加わってくるとコントロールができません。
リソースごとのマニフェスト更新 PR を個別に設定しておけばマージする順番 = リリースする順番 にコントロールできますが、まだ自動化はできていません。

おわりに

この管理をすることで manifest リポジトリにどのバージョンがリリースされたのか情報を集約することができます。
しかし bitkey platform にはまだ以下のようなリソースがありこの仕組みに集約はできていません。

  • Cloud Functions
  • Google Cloud Storage

頻繁に発生しないので手動でリリースしていますが、たまにでも手動リリースはめんどくさいです。
これらも自動化に組み込もうと思います。

今回記事を執筆およびフローを整備するにあたり下記のサンプルリポジトリも用意してあります。
詳細な yaml ファイルなどが気になった方はご参照ください。

https://github.com/otakakot/sample-scheduler

https://github.com/otakakot/sample-resource

https://github.com/otakakot/sample-manifest

また、ジョブ起動では必須となる repository_dispatch についても下記の記事を共有しているのでご参照ください。

https://zenn.dev/otakakot/articles/668c76fdd478b7

Bitkey Developers

Discussion