aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

GitLab 自社運用のノウハウと CI 環境について

はじめに

こんにちは。
aptpod Advent Calendar 2022 8 日目を担当する、SRE チームの柏崎です。

SRE チームは、 intdash のインフラ関連の業務はもちろんですが、自社のコーポレートサイトやオフィスのネットワーク等の運用など、いわゆる「社内 SE」的な業務も担当しています。

今回は、社内 SE 業務のうちの 1 つで、私がアプトポッドに入社して以来 8 年ほど面倒を見ている、GitLab の運用についてご紹介しようと思います。

GitLab 運用ノウハウ

ここでは、これまで長く運用してきた GitLab 運用の知見の一部をご紹介します。

※ 現在 GitLab は、Omnibus と呼ばれる deb/rpm パッケージでのインストールや、Helm chart での k8s へのインストールなど、様々なインストール方式が提供されていますが、アプトポッドでは当初からソースインストール方式を使い続けています。

利用するバージョンは 1 つ前

GitLab は、年 1 回のメジャーリリース、月 1 回のマイナーリリースがあり、都度様々な新機能が追加されています。
私は、「1 つ前のマイナーリリース」の最新を追いかけるようにしています。

GitLab は、バグフィックスやセキュリティフィックスが含まれるパッチリリースが頻繁に行われています。
最新リリースでは、不具合やアップグレードドキュメントの不備があることが多く、そういったものは後追いのパッチリリースで修正されていきます。

当初は最新リリースを追いかけていましたが、前述のような不具合等で切り戻す事も多く苦労しました。
1 つ前のマイナーリリースを使うことで、これにアップグレードする頃には大きな不具合は修正されていて、切り戻しはほとんど発生しなくなりました。

( こんな 1 行修正 MR を出したこともあります。)

ドキュメントをよく読む

アップグレード時に注意すべき点を把握するため、アップグレード手順だけではなく、インストール手順も含めてドキュメントをよく読むようにしています。
具体的には下記です。

Ruby と Node.js

Ruby は rbenv、Node.js は nodenv を利用してインストールしています。

env 系を利用することで複数のバージョンを手軽に同居させられるので、Ruby や Node.js の必要バージョンが変わった際に、アップグレード作業時間外に事前に準備することができるようにしています。

Ruby のメモリアロケータ

GitLab のような Ruby on Rails なアプリケーションを長く稼働していると、メモリ断片化によるメモリ使用量の逼迫に悩まされると思います。

当初は定期的に Puma ワーカーや Sidekiq プロセスを立ち上げ直すことで対処していました。
メモリアロケータを jemalloc にした Ruby を利用するようにしてから、メモリ使用量の上昇がゆるやかになり、このような対処が不要になりました。

jemalloc な Ruby に差し替えてからメモリ使用量が改善した様子

CI 環境

ついでに、CI 環境についても触れておきます。

GitLab は早くから CI サービスが統合されていて、私が GitLab 運用を担当するようになってからは、CI 環境の整備に力を入れてきました。
現在では、製品のアプリはもちろんのこと、プロジェクト独自のアプリも含めて、ほとんどのリポジトリで CI が実行されています。

実行基盤

Docker Machine で、GCP でプリエンプティブル VM インスタンスを利用し、低コストで運用しています。

CI は、ジョブ毎に n1-highcpu-4 (4 vCPU, 3.6 GB) のマシン上で実行され、最大 20 並列で動きます。
プリエンプティブル VM インスタンスを利用していることで、このような「つよつよ環境」を利用しても、月額 1 万強で済んでいます。

月額 1 万強

結構な数の CI が実行されている様子

Docker Hub のミラーリング

CI は、ジョブごとに新規の環境で実行されるので、Docker Hub からのイメージの取得が都度行われます。
CI 実行基盤と同じネットワーク内に レジストリのキャッシュ を用意し、イメージ取得の高速化・トラフィックの抑制を行っています。

おわりに

いかがでしたでしょうか。
GitLab や CI 環境の運用は、「みんなの業務は俺が支えてるんだ」感を味わえるので、実は結構好きな業務です。

だいぶまとまりが無い内容になってしまいましたが、アプトポッドの GitLab・CI についてのご紹介でした。