Docker Desktop を使って CI/CD 環境構築の調査 – Intel N100 ミニ PC で構築する開発環境(9日目)

NiPoGi ミニPC (CPU: Intel n100) を購入しました。Windows でも Ubuntu でも使えるようにして、「Intel N100 ミニ PC で構築する開発環境(2日目) | hiro345」で紹介した環境を用意していくつもりです。

最初から読むこともできます。目次もあります。)

 今回は、Docker Desktop を使って CI/CD 環境構築の調査をしました。Git リモートリポジトリを用意しておけば、Windows、WSL2 Ubuntu、Docker コンテナのどこからでもコードのバージョン管理ができるようになります。各環境でコードの編集をするときに、どの環境にあるファイルが最新なのかを気にしながら作業するのは効率が悪いですし、ある環境で作成したコードを別の環境で使うために改めて用意するというのも無駄になります。各環境から同じ Git リモートリポジトリが使えれば、そういった心配が減ります。


ローカルマシンで使いたい Git + CI/CD 環境

 ローカルマシンで使いたい Git + CI/CD 環境としては、どういったものが考えられるのか、少し検討してみました。

 最初に、クラウドサービスの Git リモートリポジトリについてです。これを使うと自分で管理する必要がないので楽ですが、ここでバージョン管理の対象にしたいファイルは、個人で使いたいもので、しかもローカルマシンに閉じていても良いものが対象となります。わざわざクラウドサービスにまで持っていって、インターネット接続していないと使えないという環境にしてしまうと、逆に使い勝手が悪くなります。

 GitBucket + Jenkins は以前調べたことがあって、日本語の情報も多くあるので最有力候補です。設定もわかっているので、動かすのはそれほど難しくありません。今回は、他に軽量で動作するものがあるか調べたいので、これについては省略することにしました。

 あと、自分は GitLab + GitLab Runner もよく使っています。個人的には仮想サーバーで稼働してよく使っているぐらい気に入っています。一応、これがあるので、改めてローカルマシン上に Git + CI/CD 環境を用意しなくても良いのですが、ローカルマシン単体で使えるぐらい手軽なものがないかと気になっています。GitLab + GitLab Runner がローカルマシンでも軽く動作するなら、これを使うのですが、実は稼働させるためには結構なリソースを要求されます。ということで、ローカルマシンで手軽に稼働させるのには適していないと考えています。

 Gitness は Git リモートリポジトリ管理システムですが、CI/CD 機能がついているということのようなので興味があります。実は gitbucket ci plugin というのがあって、GitBucket でも簡単な CI/CD ならプラグイン導入できてしまうのですが、これよりも良さそうだったら使ってみたいところです。

 Forgejo + Woodpecker CI については、Forgejo の元が GogsGitea といった Go 実装の Git リモートリポジトリ管理システムなので軽量だという印象があります。Woodpecker CI は使ったことがないのですが、Jenkins と比較してどれぐらい軽いかどうかは興味があります。

 ということで、Gitness、Forgejo、Woodpecker CI について調べてみることにしました。

Gitness

 最初に Gitness です。Docker イメージもあって、簡単に動作させることができました。開発元が出している harness/gitness と、Elestio: Fully Managed open source が提供している elestio/gitness のイメージがあって、両方とも使ってみました。

 DB は SQLite を使うことができました。ローカルマシンで利用するといった用途だと DB サーバを使うのは少し大げさな感じもあるので、ありがたいところです。本格的に運用するときは PostgreSQL などの本格的な DB が使えます。

 Docker で手軽に動かそうとなると、データの永続化について考慮が必要になります。基本は Docker ボリュームで保持すれば良いのですが、対象の指定が簡単な方が良いですし、Docker ボリュームから他のストレージへバックアップも取れるようにしておきたいところです。そのあたりも調べたところ、バックアップ対象もわかりやすく、大丈夫そうでした。

 また、パイプラインはインストールしたら、すぐに使える環境になっているようでした。これは便利そうですね。しかも、docker コマンドが使える環境ならコンテナを使ったパイプラインも実行可能なようです。`/var/run/docker.sock` を使ったソケットファイル経由で dockerd と通信をする指定となっていました。

 ということで、全体的に良さそうなのですが、SSH を使った clone については、まだ対応がされていないようで、HTTP/HTTPS を使うことになりそうでした。また、課題管理機能はないようでした。もしかしたら、課題管理は Forgejo などを使い、ミラー同期の機能かなにかで Gitness と連携させたりすれば良いのかもしれません。

 このあたりは、まだきちんと調べていませんが、Gitness についてはこれぐらいで調査終了としました。

Forgejo

 こちらも Docker イメージがあって、すぐに起動することができました。課題管理機能も使えるし、SSH を使った Git リポジトリ操作にも対応しています。一通り必要そうな機能は揃っているようでした。こちらも SQLite を使った軽い運用ができるようになっています。

 Gitness ではサンプルのリポジトリを作成してバックアップとかも調べたのですが、同じようにして Forgejo でもしてみました。結構、機能も多く、軽く動作して、ユーザーインタフェースも使い勝手が良さそうな印象でした。

 ただ、設定ファイルについて、カスタム用の設定ファイルを説明にある場所においても認識してくれないといったことがあり、若干時間を無駄にしてしまいました。一応、データのバックアップとリストア関連についても確認をして、問題なく使えそうだということがわかりました。

 これで、Woodpecker CI との連携が簡単なら、採用しても良さそうです。ということで、Forgejo の調査はこれぐらいで終了としました。

Woodpecker CI

 こちらも Docker イメージがあって、起動はすぐにできました。ただ、Forgejo との連携部分がうまく動作しなくて手間取りました。OAuth での認証がうまくいかなかったのですが、調べてみたら認証時の URL リダイレクト時に、設定した URL にあるポート番号が自動で消されてしまっていることがわかりました。

 仕方ないので、80 ポートで Woodpecker CI が動作するように環境を整えました。nginx コンテナを追加してリバースプロキシーで Woodpecker CI を使えるようにしました。こういったときに Docker は便利だと思う反面、Web システムの連携が必要となる場合は環境構築のハードルがすごく高くなると思いました。自分は、それなりに対応できてしまいますが、サーバーの運用に慣れていない人には厳しそうです。

 まぁ、もっと簡単に構築することもできそうな気もするので、検討してみたいところです。とはいえ、今回は、最近だと Web システム系では前提となる HTTPS 対応はせずに調査をしていました。このあたりもしっかりと対応しつつ、簡単に管理できるシステム構築の実現というのは、非常に難しそうです。

 さて、Woodpecker CI の話に戻ります。Forgejo と Woodpecker CI が連携は OAuth2 認証が動くと、すごく簡単でした。連携周りの基本的な設定は認証が通ると自動でされていました。ありがたいことです。

 それから Forgejo と Woodpecker CI の両方について CI/CD 関連の設定などを軽く見てみたところ、GitBucket + Jenkins と同じような感じで使えそうだという印象でした。Woodpecker CI でも docker が動作する環境でなら、docker コンテナを使った CI/CD が動きます。まだ、きちんと動かすところまではやっていないので、本格的に使ってみたらどうなるかわかりませんが、基本的には大丈夫そうです。

 ということで、今回は Docker Desktop を使って CI/CD 環境構築の調査をしました。

Git Hooks

 さて、ここで、個人用途であることを考えると、ローカルマシンでの CI/CD 機能については、Git Hooks というもので済ませてしまうのもひとつの手のような気がしてきています。Git Hooks というのは、Git へコミットしたり、リモートリポジトリへプッシュするタイミングで処理を自動実行することができる機能です。これを使うと、CI/CD でやっているようなことが原理的にはできます。

 そのため、CI/CD は別マシンで動作させるから嬉しいのであって、ローカルホストで動かすのなら、Web システムをわざわざ用意して連携させるといった手間をかけるのは無駄な感じもしてきます。結局、ローカルマシンを使っているのは自分一人なので、コミットコメントへ自動実行するときに必要なメッセージを入れて、Git Hooks で自動実行させることができるようになっていれば、それで十分です。

 とはいえ、Git Hooks で対応するとなると、一般的な CI/CD でのやりかたとは違うので、CI/CD システムだと使える便利なプラグインなどが利用できなかったりします。日頃から CI/CD に慣れることでスキルアップするものもあるはずなので、そういった成長の機会が失われるのはもったいないかもしれません。悩ましいところです。

調査結果から決めたこと

 ということで、実際に Intel N100 ミニPC で稼働させる CI/CD システムについて、どれを採用するかは、まだ決めることができていません。ですが、Git リモートリポジトリだけは必ず動かしたいので、そちらは決めたいと思います。

 それで、ここでは Forgejo を使うことにします。機能が豊富だという点、ランタイムを別途用意しなくても単体で実行できる点、SSH に対応しているといったことから採用することにしました。

 比較調査は終わったので、次は Hyper-V の仮想マシンで実際に動かしてみて検証してみようと思います。

 ということで、本日はここまで。

同じタグの記事: Docker Desktop
同じタグの記事: Forgejo
同じタグの記事: Intel N100
同じタグの記事: NiPoGi
同じタグの記事: Ubuntu
同じカテゴリの記事: Linux
同じカテゴリの記事: Win