概要
Jenkins の Docker Plugin を使って Jenkins から Docker コンテナを操作できるようにしてみました
設定方法から簡単なサンプルジョブを作成してみます
Jenkins と Docker サーバの準備は事前に行っておいてください
環境
- Docker
- CentOS 7.3.1611
- Docker 1.12.6
- Jenkins
- CentOS 6.7 64bit
- Jenkins 2.10
- Docker Plugin 0.16.2
Docker サーバの設定変更
Jenkins サーバから tcp で Docker サーバにアクセスできる必要があります
ポートは好きなポートを指定することができます
- mkdir /etc/systemd/system/docker.service.d/
- vim /etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
- systemctl reload-daemon
- systemctl restart docker
で tcp ポートでのアクセスを有効にできます
2376 は好きなポートを指定してください
docker.sock のソケットファイルの指定も必要になるので注意してください
また、reload-daemon -> restart の流れが必要になるので、どちらか一方だけだと有効にならないので注意してください
失敗した方法としては DOCKER_OPTS に設定する方法です
環境変数に export したあとで restart しても全く反映されなかったので設定ファイルを作成しました
- netstat -an | grep 2376
tcp6 0 0 :::2376 :::* LISTEN
- ps aux | grep dockerd
root 31530 0.2 1.9 563920 40756 ? Ssl 10:00 0:00 /usr/bin/dockerd -H tcp://0.0.0.0:2376
こんな感じになっていれば OK です
Jenkins スレーブ用のイメージの取得
設定を有効にしたら Jenkins 用のスレーブイメージを pull します
- docker pull evarga/jenkins-slave
完了すれば OK です
中身は Ubuntu 14.04 で Java は OpenJDK7 がインストールされていました
SSH が有効になっており jenkins/jenkins でログインできます
- docker run -d evarga/jenkins-slave
docker inspect --format="{{ .NetworkSettings.IPAddress }}" 3e7e77225972
で IP が確認できるので SSH できるか確認してみると良いと思います
おまけ: Java がインストールされたコンテナの用意
今回はすでにできあがっている Jenkins スレーブ用のイメージを作成しました
手動で作成することもできるのでその方法を紹介しておきます
基本は JDK が動作するコンテナを用意できれば OK です
今回は ubuntu のイメージから JDK がインストールされたコンテナを準備します
- docker pull ubuntu
- docker run -i -t ubuntu /bin/bash
でコンテナに入って、コンテナ内で以下のコマンドを順次実行していきます
- apt-get update
- apt-get install openssh-server
- mkdir /var/run/sshd
- apt-get install openjdk-8-jdk
- adduser jenkins
- /usr/sbin/sshd
- exit
openjdk-6-jdk がないので 8 をインストールしています
jenkins ユーザのパスワード「jenkins」と設定しました
以下のようなコンテナが作成されれば OK です
- docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65ab636fe103 ubuntu "/bin/bash" 3 minutes ago Exited (0) 3 seconds ago gigantic_hawking
そのコンテナを Jenkins のスレーブ用のイメージとして保存しておく
コンテナのままだと消しちゃったときに面倒なのもあるので、コンテナをイメージ化しておきます
docker commit コマンドを使って作成します
CONTAINER ID は作成されたイメージのものを利用してください
- docker commit 65ab636fe103 jenkins-1
念のためイメージがあるか確認すると良いと思います
- docker images | grep jenkins-1
jenkins-1 latest 7e5771f93803 22 seconds ago 225.1 MB
このイメージを Jenkins のスレーブ用のイメージとして代わりに使うこともできます
Jenkins 側の設定
ここからは Jenkins 側の設定になります
Docker サーバを Jenkins から操作するために Docker サーバの登録を行います
- Jenkins -> Jenkins の管理 -> システムの設定 -> クラウド -> 追加 -> Docker
で Docker サーバを登録できます
一番下にポツンとあるので気づきにくいかもしれません
- Name・・・好きな名前を設定してください
- Docker URL・・・http://xxx.xxx.xxx.xxx:2376
- Docker API Version・・・1.24
- Connection Timeout・・・5
- Read Timeout・・・15
- Container Cap・・・100
という感じで入力します
Docker URL の部分は先程 tcp を有効にした Docker サーバの IP アドレスを入力してください
スレーブ用のイメージを指定する
Jenkins のスレーブを管理するためのスレーブプロセスを動作させるイメージを選択します
事前に pull しておいたイメージを指定します
- Add Docker Template -> Docker Template
- Docker Image・・・evarga/jenkins-slave
- Instance Capacity・・・1
- Remote Filing System Root・・・/home/jenkins
- Lables・・・slave1 (あとでこのラベルを指定することで、このイメージを使えるようにします)
- 用途・・・このスレーブをできるだけ利用する
- Launch method・・・Docker SSH computer launcher
- 認証情報・・・jenkins ユーザのログイン情報 (ない場合は新規で作成)
- Remote FS Root Mapping・・・/var/lib/jenkins
- Pull strategy・・・Pull once and update latest
特に気にするところはないですが、Labels は必ず指定するようにしてください
テスト用のジョブの作成
ではテスト用のジョブを作成します
Pipeline ジョブを作成してください
General -> Docker Container にチェックをします
そして Pipeline に以下のように定義します
node('slave1') {
stage 'Stage 1'
echo 'Hello World 1'
stage 'Stage 2'
sh 'hostname'
stage 'State 3'
sh 'java -version'
}
ここで先程 Labels に設定した値を使用します
こうすることで指定のイメージからコンテナを作成してビルドすることができます
コンソールの結果を見ると以下のようになっている思います
最後の
Jenkins Docker Plugin で Docker 連携を試してみました
ドキュメントが若干少なかったのが困った点でしょうか
今回は Pipeline ジョブとして作成しましたが、普通のジョブでもできるのか気になりました
スレーブはコンテナとして動作するので、それをノードとして登録できればノードを指定してジョブを実行するだけなのでできると思いますが、面倒そうなのでやめました
あとはスレーブ用のイメージに ruby や golang などの公式のイメージを使う方法も知りたいなと思いました
単純にイメージを追加で登録すればできるとは思うのですが
Jenkins のスレーブは謎の jar を動作させる必要があったと記憶しているので結局 Java のインストールされていないとダメなのだろうか
そうなると、今回使ったイメージに ruby や go やらをインストールしたイメージを作成してそれを使う感じになっぽいな、、、
この辺りも追加で検証してみたいと思っています
0 件のコメント:
コメントを投稿