feature image

2024年12月4日 | ブログ記事

ArgoCD でテスト環境を簡単に立てよう

この記事は アドベントカレンダー 2024 4日目のものです
他の記事を見たい方は こちら↑ のリンクをクリック!

こんにちは! 23B のぷぐまです
夏のブログリレーでも何本か記事を書きましたが、今回のアドベントカレンダーでも何本か書いていこうと考えております
よろしくお願いします

はじめに

今回のテーマは、「ArgoCD を使ったテスト環境のカジュアル化」についてです
僕は部内で traPortfolio 開発のリーダーをやっているんですが、そこでの開発体験向上のために導入しました

traPortfolio
東京科学大学デジタル創作同好会traPに所属する各部員の活動内容をまとめたポートフォリオサービスです。

テスト環境のちょっと面倒なところ

突然ですが、皆さんはテスト環境についてどんな印象を抱いていますか?

Web アプリケーション開発において、テストのしやすさはフロントエンドとバックエンドで大きく異なると思います
バックエンドはアプリケーションがどのように動作するかを書いたロジックの部分しか存在しないので、正常に動作するかどうかは基本的にテストのためのコードを書くことで確かめられます
しかし、フロントエンドに関しては実際にどういうふうに見えるかの確認をしたい場面が多くあります
そのようなときに、見た目の確認のためだけに自分の PC に変更部分をダウンロードしてきてアプリケーションを動かすのは、少し面倒だな〜と感じています

今回導入した ArgoCD によるテスト環境を用いれば、オンライン上でテスト環境のアプリケーションを実行できるようになるため負担を軽減することができるんです!

今回導入する機能を使うと…?

GitHub で Pull Request を立てると、このように bot からのコメントが付きます

このコメント自体は、ArgoCD とは関係なく別で設定したもの

この URL にアクセスすることで…

やったー

という感じで、オンラインで開発環境を立てることができました!

というわけでここからこの導入の流れについて書いていきますが、いくつか注意点があります

この記事の注意点

ArgoCD って?

この記事を読まれている方の中には、普段インフラを触らない方もいらっしゃると思います
そのため、まずは ArgoCD とは何?という話から始めましょう

公式サイト を見てみると、すごく短く書かれていました

Argo CD - Declarative GitOps CD for Kubernetes
ちなみにアイコンはこれ。絶妙にかわいい…?なんかタコさんウインナーに似てませんか

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/

【NeoShowcase】traPには内製の作品公開プラットフォームがあります
はじめに | 『デジタル創作』同好会traPとは 私たち『デジタル創作同好会traP』は、Webアプリやゲームの制作を中心に活動する、デジタル創作・プログラミングの総合サークルです。 traPについて東京工業大学デジタル創作同好会traPは、東京工業大学・大岡山キャンパスを拠点に活動する創作・プログラミングの総合サークルです。アプリ・ゲームの制作を中心に、音楽(DTM)、グラフィック(イラスト、3DCG、ドット絵、動画)などの創作活動に加え、Webインフラや競技プログラミング・サイバーセキュリティ(CTF)、機械学習(Kaggle)などに関する活動も行っています。 こうした創作活動のほかにも、大学サークル間の交流イベントの主催や、中高生向けプログラミング教室などといった社会貢献活動も行っています。 traPの班 * アルゴリズム(競プロ)班 * グラフィック班 * ゲーム班 * サウンド班 * CTF班 * SysAd班 * Kaggle班 traPには大きく分けてこの7つの班が設けられており、自分の興味に合わせて所属することができます。ここでは各班の活動を簡単に紹介します。よ

よって、これまでのことをまとめると ArgoCD とは「Git を用いて大量のアプリケーションを継続的に管理することができる優れモノ」です
traP で運用されている様子を、すんごく簡略化して図にするとこんな感じです

公式サイトの説明イラストにはもっといろんな要素が書かれてたけど、思い切って簡略化

Pull Request ができたタイミングでテスト環境を立てよう

ここまで少々長くなってしまいましたが、ここからが本題です
アプリケーションの情報を GitHub などの Git サービスから取得してそれを反映できるなら、それを main 以外のブランチを参照するようにもできるのでは?という話です

結論からすると、これは ArgoCD の機能を用いて比較的簡単に実現できます
公式サイトの該当ページ にはこんな感じで例が書かれています (コメント部分は適宜日本語に置き換えています)

Pull Request Generator - Argo CD - Declarative GitOps CD for Kubernetes
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
にあるファイルを見ていただくことで閲覧できます

manifest/preview-portfolio-ui at main · traPtitech/manifest
k8s manifests ☸ for traP services. Contribute to traPtitech/manifest development by creating an account on GitHub.

先ほど例として挙げたファイルと同等のものは preview-portfolio-ui/application-set.yaml にかかれています

さいごに

結構長めの記事となってしまいましたが、どうだったでしょうか
皆さんの参考になる記事であれば幸いです
最初の設定を行うのがそれなりには大変ではありますが、一度動かし始めたらそこから先はほとんど手を入れなくても自動で動くようになります
ぜひ! 使ってみてはいかがでしょうか

明日は…

明日は @kenken くん、 @comavius くんと @haruka1012 さんです!
お楽しみに!

Pugma icon
この記事を書いた人
Pugma

23B / 普段はWebアプリケーション全般を幅広く / 競技プログラミングもたまにつまみ食い

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2024年9月20日
2024年 1-Monthonを開催しました!!
Synori icon Synori
2024年12月24日
クリスマスを充実して過ごすためのたった一つの方法
Naru820 icon Naru820
2024年12月11日
Nixで実行環境のライセンス違反を予防する話
comavius icon comavius
2022年4月5日
アーキテクチャとディレクトリ構造
mazrean icon mazrean
2021年5月16日
CPCTFを支えたインフラ
mazrean icon mazrean
2024年12月11日
最近参加したオフラインイベントについてまとめてみる
Pugma icon Pugma
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記