みなさんこんにちは。株式会社イプシロンソフトウェアで代表をしています、渡部です。うちの会社のソフトウェア開発はGitHubを使ったりGitLabを使ったりして管理しておりまして、プロジェクトの特性によって使い分けています。世の中的にはクラウドサービスというものがだいぶ浸透していて、ソースコードの管理もクラウドで全部ヨロシクというのが一般的になっておりますが、容量がデカかったりするものは毎回インターネット経由で取ってくるというよりもローカルネットワークの方が都合がよかったりするのでオンプレでGitLabも運用しているという感じになっております。
オンプレサーバーのハードディスク上限いっぱいまで使えるぞーということもありまして、だいぶ治安が悪い使われ方をする社員のみなさんがとても頑張って毎日働いてくれているおかげでハードディスクの使用量が結構増えてしまっていました。まだまだ余裕がある状況なのですが、早いうちに手を打っておこうということで今回調べてみることにしました。
あ、本編の前に宣伝ですがうちの会社では一緒に働いてくれてくれる仲間を募集しておりますので興味がある方は覗いてみていただけると嬉しいです。なんならうちのハードディスクもあなたのファイルで埋め尽くしてください。いや、手加減はしてほしいですけど。
何が容量を食っているのか
とりあえず容量を食ってるプロジェクトのうち幾つかを見てみたところ Artifacts というのが多数を占めている状況であることは理解できました。見た感じ全部のプロジェクトに共通してこの傾向が見られます。うちのサーバーの場合はArtifactsをなんとか対処すれば良いよねという話になりそうです。
GitLabにはCI(継続的インテグレーション)やCD(継続的デリバリー)を行うための機能がついておりまして、書いたプログラムをサーバーに入れると(pushすると)、特定の操作をスクリプトで実行することができます。うちの会社の場合はWindowsアプリをビルドしたりスマホのアプリをビルドしたり単体テストを回したりといったことを実行しています。同様のサービスにGitHub ActionsやCircleCI、Jenkinsなどがあります。コードの品質を担保したり、特定のプロジェクトメンバーに依存しない形でワークフローが組めたりとか色々とメリットがあります。
ArtifactsというのはGitLabでCIを行った結果として生成されるものなので、じゃあビルド結果が貯まらないようにすればいいよね~これで万事解決♪ とはならないんだなこれが。明示的に「保持する」というマークをしない限り、昔のビルド結果は勝手に消える設定になっているようです。このあたりの挙動はexpire_inとかサーバーの全体設定とかで調整は出来るのですが、デフォルトでは30日経つと勝手に消える設定。え、じゃあ消えているはずのArtifactsのためになんでこんなに容量が消費されてるの…?ってな話になってくるわけです。
ジョブの実行ログがデカいらしい…?
どうやらArtifactsの消費容量としてカウントされるものは今までのジョブの実行結果も含まれるらしいということがわかりました。ビルドしたときのログですね。次のターゲットとしてはビルドしたときのログをなんとかしましょうという話になりました。
xcprettyで出てくるログを抑える
現状のログを何とか対処する前に、生まれてくるログを何とか抑えてやろうというのが先決かなと思いましてまずはそっちの対処を行うことにしました。macOSのプロジェクトだとかiOSのプロジェクトだとかをコマンドラインでビルドするためのツールであるxcodebuildはビルドするたびに大量のログを出力します。ビルドエラーに対処しているときは大量のログが出るほうがありがたいのですが、ある程度安定してビルドできるようになってきたらこの利点が問題に変わってくるわけです。こういうときはxcprettyというツールに出力をパイプで渡してあげると出力ログがだいぶスッキリします。
古いパイプラインの実行結果を消す
GitLabのパイプライン(ビルドジョブを連鎖的に行う仕組み)が動いた履歴のうち古いものを消していきます。とは言えこういった機能はGitLabの機能としては備わっていないようです(15.9.3現在)。幸いGitLabはAPIを使って外部から自動操作することができるようなので自作でオレオレ管理ツールを作ってみることにしました。今回のケースではpipeline APIを使っています。何か今後も使いそうな気がしたので使い勝手がいいようにGUIとかもつけました。
デスノートに出てくる魅上みたいに ひたすら削除、削除、削除、削除
これでビルドログもガッツリ消えてくれて僕らのサーバーにも平和が訪れた…!
なんてなことにならないんだなこれが。 ふぇぇー…(泣
さらに調べる
GitLabのパイプラインを消すことで紐づいているジョブも綺麗さっぱり消えてくれたわけですが肝心のハードディスク容量は全く空いてくれず。とりあえずサーバーの中に潜って何が原因なのか調べてみることにしました。Linuxでどのディレクトリが大きいか調べるときはncdu (NCurses Disk Usage) を使うと分かりやすくて便利です。
で、実際にサーバーで全体をスキャンして容量を調べていたときにやたらと目についたjob.logというファイル。もしかしてこれが原因…?
見当がついたところで、昨今話題のBingのAIチャットに聞いてみましょう。調べ物をする速度が圧倒的に速くなって本当便利ですよね。もちろんAIの言っていることはまだまだ誤りも多いので最終確認をしっかりする必要はありますが、ある程度のことを相談した上で公式サイトまで一気にワープできます。
調べてみたところ公式サイトでもほぼ同じことを言ってますので問題なさそう。便利ですね。
サーバーからjob.logを消す
公式サイトにあったfindのコマンドから-deleteを抜くとファイルを列挙することができますので実際に列挙してみたら、出るわ出るわ…。貴様が犯人かー!
実際にコマンドを実行して削除してみたところ、うちのサーバーの環境で2時間ぐらいかかりまして、完了後には100GBの容量が削減できました。スッキリ~!
免責事項(お約束)
この記事に記載のあることを実行した結果生じる いかなる障害についても株式会社イプシロンソフトウェアは一切の責任を持ちませんので、すべて自己責任で実行するようにしてください。サーバーの環境や使用方法によってはここで言及した内容が閲覧者の環境で当てはまらない可能性があります。公式サイトも参照しながらしっかり確認しながら作業を進めてください。