GitLab(Gitolite)を使っている環境に、Jenkinsをインストールして、
CIのためのシステム構築を行いましたが...
さらに他のマシンをスレーブとして追加することで、ビルドの負荷分散ができます。
今回は新しいVPSにもJenkinsをインストールして、スレーブにしてみました。
この記事では、スレーブを構築&設定する手順を、書いておきます。(自分用メモとしてw)
- スレーブ側では、Jenkinsサービスを起動しておく必要はありません。
- ビルドを行う度に、マスターのJenkinsがSSHを介してスレーブのシェルに接続し、スレーブ上のJenkinsの"スレーブエージェント"を実行する仕組みです。(sshを介して通信するので、特に両者間でVPNを張る必要もありません。)
参照: Distributed builds - 日本語 - Jenkins Wiki - 今回、CIを行う対象のプロジェクトは、マスター上のGitLab(Gitolite)にリポジトリがあるものとします。(先日の記事の続きなので。)
尚、今回は鍵を2つ作成することになります。
- [マスター側で作成する鍵] カギA - 手順3で作成
- マスターのJenkinsが、スレーブに接続するため の鍵。
- 作成されたカギの公開鍵は、スレーブのauthorized_keysに登録します。
- [スレーブ側で作成する鍵] カギB - 手順5で作成
- スレーブのJenkinsが、Gitリポジトリに接続するため の鍵。
- 作成されたカギの公開鍵は、GitlabもしくはGitoliteに登録します。
(※ もっと良い手順がありましたら、ご教授お願いします!)
- [スレーブ] Jenkinsをインストール。
(先日の記事 "Hello, Jenkins. GitLab+Jenkins+perl(Mojolicious)でCIをしてみた" を参照のこと。jenkinsサービスを開始する必要はありません。) - [スレーブ] JREをインストール。
- [マスター] カギAを .sshディレクトリ(/var/lib/jenkins/.ssh/)に作成。
$ sudo -u jenkins ssh-keygen > /var/lib/jenkins/.ssh/id_rsa_con_slave
(マスター側の.sshディレクトリには既に、マスター自身のJenkinsが Gitリポジトリに接続するための鍵があるわけですので、今回は別の名前にします。)
- [スレーブ] カギAの公開鍵(id_rsa_con_slave.pub)の中身を、スレーブ上のJenkinsユーザのauthorized_keys (/var/lib/jenkins/.ssh/authorized_keys) に記述。
$ sudo -u jenkins vi /var/lib/jenkins/.ssh/authorized_keys ssh-rsa ~~~~ jenkins@xxx
※ 但し、jenkinsユーザは、/etc/passwd上 で /bin/falseに設定されているので、/bin/bashに変更する。
もしくは、他のユーザを作成する。(セキュリティ的には後者のほうが安全...か?) $ sudo -u root vi /etc/passwd ~~~~ jenkins:x:xxx:yyy:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash
- [スレーブ] カギBを .sshディレクトリ(/var/lib/jenkins/.ssh/)に作成。
$ sudo -u jenkins ssh-keygen > /var/lib/jenkins/.ssh/id_rsa
- [スレーブ] カギBをGitリポジトリへの接続に使えるよう、.ssh/configに記述。(先日の記事でのマスター側と同様。)
$ sudo -u jenkins vi /var/lib/jenkins/.ssh/config Host example.com User gitolite Port xx Hostname example.com IdentityFile /var/lib/jenkins/.ssh/id_rsa
- [クライアント] カギBの公開鍵(id_rsa.pub)の中身を、GitLab(もしくはGitolite)のJenkinsユーザのSSH鍵に登録。
(GitLabを使っているならば、先日の記事と同様に、Webブラウザからjenkinsアカウントでログインして、SSH Keys画面から鍵の追加を行います。) - [スレーブ] known_hostsにGitリポジトリサーバの情報を登録するために、一旦、手動でgit cloneをします。
$ cd /var/lib/jenkins/ $ sudo -u jenkins git clone ssh://gitolite@example.com:xx/hoge.git > Are you sure you want to continue connecting (yes/no)? yes $ sudo -u jenkins rm hoge/ -R
(cloneしてくるリポジトリは、jenkinsアカウントでgit cloneできるものなら何でもOK。cloneされたディレクトリは、すぐに削除して構いません。)
- [クライアント] マスターのJenkinsのノード管理画面で、ノードを追加する。
- "ノード名": 適当
- "同時ビルド数": 適当 (スレーブのコア数にするのが妥当)。
- "リモートFSルート": "/var/lib/jenkins/"
- "起動方法": "SSH経由でLinuxマシンのスレーブエージェントを起動"
- "ホスト": スレーブのホスト名 or IPアドレス
- "ユーザ名": "jenkins"
- "ポート" スレーブのSSHデーモンのポート
- "秘密鍵": カギAの秘密鍵 ("/var/lib/jenkins/.ssh/id_rsa_con_slave")
- [スレーブ] 各プロジェクトのビルド環境を構築する。
とりあえず手順9まで終えて、ビルドを実行してみると、まだ失敗することがわかると思います。
ですので、例えば perlのプロジェクトをCIするのであれば、cpanmのインストールなり、perlのモジュールインストールなりを行います。先日の記事の後半どおり、マスター側と同様。
スレーブ側では、JenkinsのWeb画面での設定も、ジョブ作成も必要ありません。
その都度、マスターのJenkinsがスレーブへ自動的に転送してくれます。
尚、さらに2台目、3台目のスレーブ...と追加していく場合には、
この記事の手順3は不要ですね。
0 件のコメント:
コメントを投稿
お気軽にコメントをお寄せください m(_ _)m♪
"コメントの記入者"欄から[名前/URL]を選ぶと、登録なしでコメント投稿していただけます。