前回の記事でWindows コンテナと Linux コンテナ、両方が使えるようになりました。そこでこれが役立ちそうなものはないか、と検討していたところ、Jenkins の構成を作ってみるのが面白いだろうという(自分の中で)結論が出たのでトライしました。
構成
今回は master と agent がそれぞれ1台ずつとなっています。また master で Linux 向けジョブが実行する状態としていますが、これも別 agent に切り出して構成を組む方がおそらくスッキリします。本記事をベースに実用とする場合には、その辺も再考してみて下さい。
Jenkins master
Jenkins master として、 WSL2 を利用した Ubuntu 20.04 を用います。ここで Docker コンテナとして Jenkins master を動かします。せっかくなので他の PC からアクセスできるようにポート公開しておきます。
Jenkins agent
Windows コンテナのなかで、 Jenkins agent を動かします。Windows コンテナなので当然 Windows 環境で動いている agent として振る舞います。master との接続には JNLP を使用し、本agent から master へ向く通信方向としています。
この Jenkins master と agent は同一のPCで動かします。 Windows10 Professional (64bit) のPC1台でそれぞれを動かし、しかも余計な仮想化ソフトウェア(VirtualBox とか VMware とか) を入れない!という点でとてもコンパクトな環境構成になると思います。
これらの構成を図にしてみたものが以下となります。
環境構築の手順
Jenkins master 側
公式のイメージを使用して、 Jenkins master を動かします。余所でも説明されているとおりのコマンドで、特に変更する点はないです。強いて言えば、ポート 50000 を公開しておくことでしょうか。
docker run -d -p 8080:8080 -p 50000:50000 -v /your/home:/var/jenkins_home jenkins:lts
Windows ホストの設定
Windows ホストの設定で、 Jenkins の 8080 ポートと、50000 ポートを他からもアクセスできるようにポートフォワードの設定を行います。詳しくは以前の記事を参照して下さい。
他の PC からアクセスしないからといって、この手順を省くと失敗しますのでご注意下さい。先に示した図で JNLP の矢印が Windows10 ホスト側にしみ出しているのはこれが理由です。
これらの設定は管理者権限のついたPowershell で、以下の通りに実行します。
$addr=(wsl hostname -I).split()[0].trimend()
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=$addr connectport=8080
netsh interface portproxy add v4tov4 listenport=50000 connectaddress=$addr connectport=50000
Jenkins agent 側
Windows コンテナを利用した Jenkins agent のコンテナイメージを探してみたところ jonathank/jenkins-jnlp-slave-windows というものが見つかったのでこれを利用しました。これを用いて起動するときのオプション設定などは以下の通りです。
docker run jonathank/jenkins-jnlp-slave-windows -url http://(IPアドレス):8080 (シークレット) (エージェント名)
必要なパラメータは Jenkins で新規ノードを作成した画面で表示されるもので揃います。迷うのはリモートFSルートでしょうが、これについては、C:\Users\jenkins\Agent を設定します。重要なのが、接続先のアドレスです。このアドレスは Windows ホスト側に付いている IP アドレスを指定します。 localhost や、 Jenkins master が動いている IP などではアクセスができません。(このために先にポートフォワードの設定が必要でした)。
まとめ
これらの手順によって Jenkins を構築すると、1PCしか使用していませんが以下の構成を作ることができます。Linux 環境と Windows 環境とを構築できるので、状況によってはとても便利なのではと思います。
同一 PC 上で Linux コンテナを用いて、 Jenkins master と agent とを繋ぎたい場合にも、本記事の内容は流用できるかと思います。一度 Windows 側の IP を経由して接続する部分です。 Linux コンテナ同士であれば、ネットワークが別にならないので、内部ネットワークの IP が分かっていればそれでも接続は可能です。ただし IP の変化には弱いので、常用する場合にはひと工夫が必要かもしれません。
https://hub.docker.com/r/jenkins/inbound-agent/ のイメージを用いて、うまく agent が追加できることを確認しています。