こんにちは、TAKAです。IT系企業でサラリーマンやってます。先日Jenkinsについて1台に複数のURLかポートでインストールできますか?との質問をうけ、やってみることにしました。
結果として、1つのWindowsに5人ものjenkinsを同居させることに成功しました。本記事ではその方法を書きました。これ誰得なんだろう!?
Jenkinsは1人で十分、サーバ調達すれば済む、Travis CI/CircleCI/AppVeyor など他のCIがいいなという方には、全く有益ではないです。。。
やってみたこと
1つのWindowsマシンにJenkinsを複数立ち上げてみました 。図のようなイメージが実現できました。
バージョン・環境など
- Windows10 1903
- Jenkins 2.193
- Docker desktop 2.1.0.2(Jekins3人目~5人目)
ドメインについて
今回はローカルでテストしました。hostsを下記を追加という細工しています。
- 127.0.0.1 dummy-domain.com
- 127.0.0.1 4th.dummy-domain.com
- 127.0.0.1 5th.dummy-domain.com
1人目のJenkins:msiインストーラ
最初のJenkinsは、Windowsのインストーラを使いました。本家のURLはこちら
- Download the latest package(最新版をダウンロードする)
- Open the package and follow the instructions(MSIファイルを実行し指示に従う)
簡単そうです。やってみます。
DLファイルはZIPです。回答するとmsiファイルになってますのでダブルクリックで実行しましょう。インストール先は、「D:\Users\jenkins\1st\」としておきました。
画像は貼っておきますが、特に特徴的なことはないです。
1人目のJenkinsがreadyになりました。この画像までくれば成功です。
2人目のJenkins:warファイルから
さて、2人目ですが、インストーラからはできません。下記のように「修復」か「削除」の2択になってしまいます。
そこで、2人目は、「WARファイル」によるインストールを行います。本家はこちら。ざっくり手順は下記。
- Download the latest stable Jenkins WAR file to an appropriate directory on your machine.
- WARファイルをDLしておく
- Open up a terminal/command prompt window to the download directory.
- コマンドプロンプトからWARファイルの場所に移動
- Run the command java -jar jenkins.war.
- コマンドプロンプトからWARファイル起動
- Browse to http://localhost:8080 and wait until the Unlock Jenkins page appears.
- あとはmsiと同じ(8080ならね)
今回、9090ポートで立ち上げたいので追加手順が必要です。まずは立上げまでやっていきましょう。
単純立上げ
- インストーラには付属のjreがついてます。WARの場合は、自前でjavaコマンドが使える状態が必要です。ここは各自お任せします。
- chocolatey利用可能なら、choco install jre8 で行けます。
- WARファイルを次のコマンドで立ち上げます。インストール場所はWARファイルの配置場所と同じとし、「D:\Users\jenkins\2nd」としています。
- java -DJENKINS_HOME=D:/Users/jenkins/2nd -jar jenkins.war –httpPort=9090
- ブラウザで下記URLに接続し、「Getting Started」画面が出れば成功です。
- http://localhost:9090/
- あとは1人目と同様に、Jenkinsのダッシュボードが見えるところまで進めてください。
2人目特有の追加作業
2人目の場合、インストーラと違って下記が未対応となっています。追加の手動作業を行います。
- Windowsファイアウォールの設定
- Windowsサービスからの起動
Windowsファイアウォールの設定
- 2人目のWindowsファイアウォールを手動設定します。(下記画面参照)
- 受信の規則に、TCP9090ポートの追加としました。
Windowsサービスからの起動
Jenkins2人目が動作しているのは、コマンドプロンプトのjavaコマンドに依存しています。今のままだと、コマンドプロンプトを落とすとページが落ちますので、そうならないようにしましょう。
- Jenkinsの管理 ⇒ Windowsのサービスとしてインストール
- jenkins.xmlを編集
- scコマンドでサービス化
「Windowsサービスとしてのインストール」は二つの動作が行われます
- jenkins.exe、jenkins.configなどのファイルの生成
- Windowsサービスへの追加 ⇒Service with id ‘jenkins’ already existsが発生
実行すると、二つ目の処理がエラーとなるため失敗となります。1つ目の処理が目的のため、失敗しても良いので実行してください。
次に、増加したファイルのうち、「jenkins.xml」を編集します。
- jenkins.xmlのファイルを開き、argumentsタグを探してください。
- その中の –httpPort=8080 という記述を –httpPort=9090 に修正して保存します。
仕上げに、scコマンドでサービスに登録します。
- 管理者モードでcmdプロンプトを開く
- sc create jenkins_2nd binpath= D:\Users\jenkins\2nd\jenkins.exe type= own start= auto
- [SC] CreateService SUCCESS と出れば成功です。
- sc start jenkins_2nd
- サービスが開始します。通常はこれで問題ないはずです。
- もしサービスがすぐ停止する場合は、jenkins.xmlファイルのポート修正をミスしてないか、利用済みのポートとバッティングしていないか再確認してください。それでも不明の場合、「jenkins.err.log」にエラー内容が書かれますので特定してください。
jenkinsは1台のマシンに1人が前提のため、2人目のjenkinsはちょっと工夫を加えました。
3人目~5人目:Docker+リバースプロキシ
2人目と同じ方法なら3人目以降も増殖できます。ここでは別の方法も試してみたい。そこで、3人目~5人目はDockerを使ってみます。Dockerでのインストール手順の本家はこちら
さて、イメージはこんな感じ
下記手順でやっていきます。
- dockerをインストールする
- dockerでjenkinsを起動
- 各jenkinsをセットアップする
dockerをインストールする
dockerを使える状態にしましょう。Windowsの場合下記いずれか
- docker-desktopサイトからインストーラ入手
- または、chocolateyを使って、以下コマンド
- choco install docker-desktop
- 確認
- powershell またはコマンドプロンプトからdockerコマンドが使えればOKです。
dockerでjenkinsを起動
- docker内の仮想ネットワークを事前に作成する。下記コマンドを実行します。
- docker network create –driver bridge docker-network
- docker-compose.ymlを準備
- git clone https://github.com/taka-output-blog/multi-jenkins
- 下記にも記載しておきます。
version: '3' services: Jenkins-3rd: image: jenkinsci/blueocean container_name: Jenkins-3rd restart: always ports: - 8080 - 50000 volumes: - ./jenkins-data-3rd:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock networks: - docker-network environment: VIRTUAL_HOST: dummy-domain.com VIRTUAL_PORT: 8080 VIRTUAL_PROTO: http Jenkins-4th: image: jenkinsci/blueocean container_name: Jenkins-4th restart: always ports: - 8080 - 50000 volumes: - ./jenkins-data-4th:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock networks: - docker-network environment: VIRTUAL_HOST: 4th.dummy-domain.com VIRTUAL_PORT: 8080 VIRTUAL_PROTO: http Jenkins-5th: image: jenkinsci/blueocean container_name: Jenkins-5th restart: always ports: - 8080 - 50000 volumes: - ./jenkins-data-5th:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock networks: - docker-network environment: VIRTUAL_HOST: 5th.dummy-domain.com VIRTUAL_PORT: 8080 VIRTUAL_PROTO: http nginx-proxy: image: jwilder/nginx-proxy container_name: nginx-proxy restart: always privileged: true ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro labels: - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true" networks: - docker-network networks: docker-network: external: true
- docker-compose up -d で起動
- cd multi-jenkins
- docker-compose up -d
4つのdoneが確認できればOKです。
それぞれのURLにアクセスしてみて下記のような画面が確認できれば成功です。(ローカルの場合hostsの整備を、グローバルの場合DNSの整備をお忘れなく)
各jenkinsをセットアップする
さて、セットアップです。docker起動直後、下記のようにjenkins-data-3rdのように3つフォルダができているはずです。これらは各Jenikinsの「JENKINS_HOME」に相当します。
アンロックのための「initialAdminPassword」は、「secret」フォルダにありますので、それぞれnotepadから参照可能です
- jenkins-data-3rd\secrets\initialAdminPassword
- jenkins-data-4th\secrets\initialAdminPassword
- jenkins-data-5th\secrets\initialAdminPassword
ここまでくればすべてセットアップできます。
まとめ
本日は、1つのWindowsマシンにJenkinsを複数立ち上げてみました。上記の通り5人のjenkinsを一つの端末から立ち上げることができています。
誰得だろうと思って記事にしてますが、その誰かがいて何かの参考になればうれしいです。Jenkinsは依然人気はあるようで参考記事が多いというのは強みですよね。でもワザワザ1台のマシンで何人もJenkins立ち上げようって人は少ないんじゃないか。本記事が誰かの役に立てばうれしい。
最近ではJenkins一強というわけではなく、Travis CI/CircleCI/AppVeyor など多くのCIサービスが台頭してきている点も注意です。特にCircleCIは広告を多く見かけるようになり目立ってます。今後は他のCIも語れるようになりたい。がんばろう。
このブログでは、将来に備えた技術力アップや資産運用を情報発信していきます。Twitterもやってますので良ければフォローお願いします。
コメント
You have mentioned very interesting points! ps nice site.
I became late to notice. thank you for your comment.
[…] 【実験】1つのWindowsに5人のJenkinsを立ち上げてみた […]