dockerコンテナでjenkinsを立ち上げ、 pythonのデプロイツール「fabric」をjenkinsから実行してwebサーバに対してデプロイ、DBに対してSQL実行などを出来るようにする。 これによりデプロイだけでなく、業務の自動化なども可能!ジョブの作り方で色々と応用がきく内容となっております。

今回の記事に関する情報やソースコードなどは、GitHubで公開しておりますので、そちらも参照下さい。 https://github.com/hirasaki1985/jenkins_fabric

また、本手順に出てくる.ssh/ディレクトリのsshに関する設定(鍵やconfigファイル)は、環境に合わせて修正をしてください。

本手順で使用するライブラリ

  • docker
  • openssh .ssh/の設定(鍵やconfigファイル)

インストール & 環境構築

プロジェクトのダウンロード

$ git clone https://github.com/hirasaki1985/jenkins_fabric.git
$ cd jenkins_fabric

鍵の作成 or 鍵の設置

新しく作成する場合は以下のコマンドを実行。 すでにあるものを使用する場合は、.sshディレクトリに設置して下さい。

$ ssh-keygen -t rsa -b 4096 -f ./.ssh/id_rsa

configファイルの作成

こちらも、すでにある場合はそれを.sshディレクトリに設置して下さい。 ない場合は新規作成。

$ vi ./.ssh/config

configファイルのサンプルです。

ServerAliveInterval 60

Host webserver01
  HostName 192.168.0.100
  User deployuser
  Port 22
  IdentityFile ~/.ssh/id_rsa

Host webserver02
  HostName 192.168.0.101
  User deployuser
  Port 22
  IdentityFile ~/.ssh/id_rsa

Host database01
  HostName 192.168.0.102
  User dbuser
  Port 22
  IdentityFile ~/.ssh/id_rsa

ボリュームコンテナの作成

コンテナ永続化のため、ボリュームコンテナを作成。

$ docker volume create --name deployserver-volume
$ docker volume ls

dockerイメージのビルド

.sshディレクトリの設定が終わったらビルドを開始。

$ docker build . -t deployserver

Dockerfileに書かれておりますが、 ビルドをすると、.sshディレクトリがjenkinsユーザのホームディレクトリにコピーされ、 パーミッションの設定を行います。 .sshディレクトリを-vで共有にするとパーミッションや権限が上手くいかなったので、コピーをすることにしました。

Dockerfileのここの部分。

## ssh setting
USER jenkins
WORKDIR /var/jenkins_home
RUN mkdir .ssh/
COPY .ssh/ .ssh/

USER root
WORKDIR /var/jenkins_home
RUN chmod 700 .ssh
RUN find .ssh/ -type f -exec chmod 400 {} \; 
RUN find .ssh/ -type d -exec chmod 700 {} \;
RUN chown -R jenkins:jenkins .ssh

まだコンテナを立ち上げていませんが、 これでconfigファイルに書かれたサーバに対し、鍵を使ってjenkinsユーザでアクセスできるようになります。

## コンテナ内からssh接続できる。
$ ssh webserver01
## パスワードを聞かれる場合は、ssh-copy-idでサーバに鍵を登録する。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub webserver01

コンテナの作成

ビルドが完了したらコンテナを立ち上げます。

$ docker run -t -i -d \
    -v `pwd`/src:/tools \
    -v deployserver-volume:/var/jenkins_home \
    -p 8080:8080 -p 50000:50000 \
    -e MYSQL_PASSWORD=password -e MYSQL_USER=user_name -e MYSQL_DB_NAME=db_name \
    -h deployserver --name deployserver deployserver

srcディレクトリと、コンテナ内の/toolsディレクトリを共有するとで、ホストでソースコードの修正が可能。

-eの環境変数の登録の部分でmysqlの設定を行ってます。 この設定を使ってDBに対してSQLを実行します。(fabfile.pyやjenkinsジョブの書き方で修正可能)

立ち上げたら、確認をしましょう。

$ docker ps -a

jenkinsの初期設定

初回はjenkinsの初期化や設定が必要。

$ docker exec -it deployserver bash
(deployserver)$ cat /var/jenkins_home/secrets/initialAdminPassword

access jenkins & setup

http://localhost:8080 ブラウザからコンテナにアクセスし、「jenkinsの初期設定」で出力されたinitialAdminPasswordを入力し、セットアップを続ける。 ユーザ登録画面も表示されるはずなので、登録を行う。

ジョブの作成

「シェルの実行」の欄にそれぞれ以下のように入力します。

デプロイをする場合

$ fab -f /tools/fabfile.py -H webserver01,webserver02 webserver_deploy

.ssh/configに設定されたwebserver01,02に対し、fabfile.pyのwebserver_deploy()関数が実行されます。

SQLを実行する場合

$ fab -f /tools/fabfile.py -H database01 exec_sql_sample

.ssh/configに設定されたdatabase01に対し、fabfile.pyのexec_sql_sample()関数が実行され、 mysql_exec()によりSQLが実行されます。

あとはジョブを実行するだけ。

jenkinsの使い方は、こちらが参考になると思います。 [改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

手動でfabricを動かす場合

$ docker exec -it deployserver bash
(deployserver)$ fab -f /tools/fabfile.py -H webserver01,webserver02 webserver_deploy
(deployserver)$ fab -f /tools/fabfile.py -H database01 exec_sql_sample

その他使いそうなコマンド

### root権限でコンテナに入る場合
$ docker exec -it -u root deployserver bash

### コンテナとイメージを削除
$ docker rm -f deployserver && docker rmi deployserver

### exitedで終了しているコンテナを一括削除
$ docker rm $(docker ps -a --filter 'status=exited' -q)

参考

以下のサイトの情報を参考にさせていただきました、ありがとうございます。

fabric

jenkins

Debian 8にjenkinsをapt-getでインストール

ssh