2017年3月6日月曜日

Jenkins の Docker Plugin を使って Docker と Jenkins を連携してみた

概要

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 サーバを登録できます
一番下にポツンとあるので気づきにくいかもしれません

jenkins-docker-plugin1.png

  • 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

jenkins-docker-plugin2.png

  • 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 にチェックをします

jenkins-docker-plugin3.png

そして Pipeline に以下のように定義します

node('slave1') {
  stage 'Stage 1'
  echo 'Hello World 1'
  stage 'Stage 2'
  sh 'hostname'
  stage 'State 3'
  sh 'java -version'
}

jenkins-docker-plugin4.png

ここで先程 Labels に設定した値を使用します
こうすることで指定のイメージからコンテナを作成してビルドすることができます

コンソールの結果を見ると以下のようになっている思います
jenkins-docker-plugin5.png

最後の

Jenkins Docker Plugin で Docker 連携を試してみました
ドキュメントが若干少なかったのが困った点でしょうか

今回は Pipeline ジョブとして作成しましたが、普通のジョブでもできるのか気になりました
スレーブはコンテナとして動作するので、それをノードとして登録できればノードを指定してジョブを実行するだけなのでできると思いますが、面倒そうなのでやめました

あとはスレーブ用のイメージに ruby や golang などの公式のイメージを使う方法も知りたいなと思いました
単純にイメージを追加で登録すればできるとは思うのですが

Jenkins のスレーブは謎の jar を動作させる必要があったと記憶しているので結局 Java のインストールされていないとダメなのだろうか
そうなると、今回使ったイメージに ruby や go やらをインストールしたイメージを作成してそれを使う感じになっぽいな、、、

この辺りも追加で検証してみたいと思っています

参考サイト

0 件のコメント:

コメントを投稿