この記事は アドベントカレンダー 2024 4日目のものです
他の記事を見たい方は こちら↑ のリンクをクリック!
こんにちは! 23B のぷぐまです
夏のブログリレーでも何本か記事を書きましたが、今回のアドベントカレンダーでも何本か書いていこうと考えております
よろしくお願いします
はじめに
今回のテーマは、「ArgoCD を使ったテスト環境のカジュアル化」についてです
僕は部内で traPortfolio 開発のリーダーをやっているんですが、そこでの開発体験向上のために導入しました
テスト環境のちょっと面倒なところ
突然ですが、皆さんはテスト環境についてどんな印象を抱いていますか?
Web アプリケーション開発において、テストのしやすさはフロントエンドとバックエンドで大きく異なると思います
バックエンドはアプリケーションがどのように動作するかを書いたロジックの部分しか存在しないので、正常に動作するかどうかは基本的にテストのためのコードを書くことで確かめられます
しかし、フロントエンドに関しては実際にどういうふうに見えるかの確認をしたい場面が多くあります
そのようなときに、見た目の確認のためだけに自分の PC に変更部分をダウンロードしてきてアプリケーションを動かすのは、少し面倒だな〜と感じています
今回導入した ArgoCD によるテスト環境を用いれば、オンライン上でテスト環境のアプリケーションを実行できるようになるため負担を軽減することができるんです!
今回導入する機能を使うと…?
GitHub で Pull Request を立てると、このように bot からのコメントが付きます
この URL にアクセスすることで…
という感じで、オンラインで開発環境を立てることができました!
というわけでここからこの導入の流れについて書いていきますが、いくつか注意点があります
この記事の注意点
- 以下の理由で、一部で不正確な表現が使われている可能性があります
- 僕自身の理解度がまだそこまで高くないこと
- 説明を簡単にするためにある程度の内容を端折っていること
- 対象となる読者は以下のとおりです
- なんとなく Git や GitHub について知っている
ArgoCD って?
この記事を読まれている方の中には、普段インフラを触らない方もいらっしゃると思います
そのため、まずは ArgoCD とは何?という話から始めましょう
公式サイト を見てみると、すごく短く書かれていました
Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.
日本語に直訳すると、 ArgoCD とは
宣言的で、GitOps による Kubernetes のための継続的なアプリケーション配信ツール
ということになります
……ちょっと短すぎる気もするので、少しずつ読んでいきましょう
まず、「宣言的」というのはアプリケーションの 動作 をプログラマーが書くのではなく、アプリケーションの あるべき姿 を書いておくことでそうなるようにソフトウェア側で調整を行ってくれるということです
これにより、これまで人力で定義されていた多くの手続きを、アプリケーション側が気を利かせて自動でやってくれるようになります
次に、「GitOps」というのは、 Git の情報によってサーバー上のアプリケーションを管理することです
例えば、サーバー上に乗っているアプリケーションを更新するときには、サーバーに直接我々の PC を繋いで作業をすることも考えられます
しかし、 GitOps では GitHub などで管理しているリポジトリの更新を検知したら、それを元にサーバー内のアプリケーションも自動で更新させることもできるようになります
最後に、 Kubernetes というのは多くのアプリケーションを複数のサーバーに渡って横断的に管理する際に使われることの多いソフトウェアです
企業だと数千〜数万に及ぶアプリケーションを複数のサーバーを使って管理することがありますが、これを人力で行うのは不可能です
そこで、Kubernetes ではアプリケーションやサーバーの構成を「宣言的」に書いておくことができます
traP でも Kubernetes を使ったアプリケーションはあるので、気になる方は以下の記事も読んでいただければと思います↓
https://trap.jp/post/2271/
よって、これまでのことをまとめると ArgoCD とは「Git を用いて大量のアプリケーションを継続的に管理することができる優れモノ」です
traP で運用されている様子を、すんごく簡略化して図にするとこんな感じです
Pull Request ができたタイミングでテスト環境を立てよう
ここまで少々長くなってしまいましたが、ここからが本題です
アプリケーションの情報を GitHub などの Git サービスから取得してそれを反映できるなら、それを main 以外のブランチを参照するようにもできるのでは?という話です
結論からすると、これは ArgoCD の機能を用いて比較的簡単に実現できます
公式サイトの該当ページ にはこんな感じで例が書かれています (コメント部分は適宜日本語に置き換えています)
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: myapps
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- pullRequest:
github:
# GitHub の organization や user を書くところ
owner: myorg
# Github リポジトリ名を書くところ
repo: myrepository
# (GitHub Enterprise を使っている場合は)
api: https://git.example.com/
# (リポジトリアクセストークンなど、秘匿情報があれば) 書くところ
tokenRef:
secretName: github-token
key: token
# (PAT の代わりに GitHub App を使ってアクセスする場合に) 書くところ
appSecretName: github-app-repo-creds
# (Pull Request の絞り込みをかけたい場合) そのラベルを書くところ
labels:
- preview
requeueAfterSeconds: 1800
template:
# ...
おや、ここまでふんわりと書いていたのに、急にそれっぽいものが出てきましたね
これが、最初の方に説明した「宣言的」な YAML 形式の記述です
具体的に GitHub からどのようにリポジトリの情報を持ってくるのか、みたいなことは書く必要がありません
私たちがすればいいのは、Pull Request Generator というすでに整備されたものに対して、リポジトリなどの情報を渡すことだけなんです
実際には、これ以外にもアプリケーションの実行やインターネット上での公開のためにいくつかの追加設定が必要なんですが、それらもほとんど同じようにできます
実際にやってみた
というわけで、実際にこれを traPortfolio に適用してみました!
このとき作ったものについては
https://github.com/traPtitech/manifest/tree/main/preview-portfolio-ui
にあるファイルを見ていただくことで閲覧できます
先ほど例として挙げたファイルと同等のものは preview-portfolio-ui/application-set.yaml
にかかれています
さいごに
結構長めの記事となってしまいましたが、どうだったでしょうか
皆さんの参考になる記事であれば幸いです
最初の設定を行うのがそれなりには大変ではありますが、一度動かし始めたらそこから先はほとんど手を入れなくても自動で動くようになります
ぜひ! 使ってみてはいかがでしょうか
明日は…
明日は @kenken くん、 @comavius くんと @haruka1012 さんです!
お楽しみに!