👨‍🏭

同一インスタンスに複数のJenkinsをたてる

2022/06/20に公開

やること

Jenkinsを立てており、NginxをリバースプロキシとしているEC2インスタンスに、二つ目のJenkinsを既存のものとバッティングしないように立ち上げる

EC2内の構成

ドメインはお名前.comで取得しています。SSL証明書はCertbotで発行しています。

手順

Jenkinsのインストール

専用のディレクトリ(今回は/usr/share/newjenkins)を作成し、新しいJenkinsをそこにインストールする。urlは執筆時点でのLTSバージョンです。

wget https://get.jenkins.io/war-stable/2.332.3/jenkins.war

Jenkinsの立ち上げ

インストールしたJenkinsを立ち上げます。この時、設定ファイル、使用port、urlパスが被らないようにしないといけません。よって以下のように起動します。

env JENKINS_HOME=/var/lib/newjenkins java -jar jenkins.war --httpPort=8081 --prefix=/first

ここでJENKINS_HOMEは設定ファイルや作業ファイルのパスを示す環境変数です。
prefixはurlの末尾を表すパラメータです。(ex. --prefix=/jenkins, url= http://myServer:8080/jenkins)

Nginxの設定

リバースプロキシの設定をします。

vi /etc/nginx/sites-enabled/default
upstream jenkins {
        server 127.0.0.1:8080 fail_timeout=0;
}
upstream newjenkins {
        server 127.0.0.1:8081 fail_timeout=0;
}
server {
        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name hogehoge.com;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.

                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_redirect http:// https://;
                proxy_pass http://jenkins;
        }
        location /first {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.

                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_redirect http:// https://;
                proxy_pass http://newjenkins;
        }
}

この時、Jenkinsのprefixで設定するパスとNginxのlocationで設定するパスは統一しておく必要があります。

インスタンス起動時新Jenkinsを起動するように

インスタンスのuserdataを以下のように設定します。
インスタンスを起動するごとに新Jenkinsが実行されるようになります。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
env JENKINS_HOME=/var/lib/newjenkins java -jar /usr/share/newjenkins/jenkins.war --httpPort=8081 --prefix=/first

最後に

インスタンスを再起動すれば完了です。以下参考urlです。
https://qiita.com/192agur2/items/5d06403ddee33d2f017f
https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/
https://dev.classmethod.jp/articles/execute-ec2-cloud-init-user-data-for-every-start/

Discussion