git pushしたら、Jenkinsでコンテナをビルドして、DockerHubへPushするチェーンを作る


アプリのコードを書いて、コンテナのリポジトリにプッシュするまでの自動化環境を、次のツールを利用して作ってみた。
 1.GitHub
 2.Jenkins
 3.DockerHub
 4.DockerCE
 5.Java8
 6.Ubuntu Linux
 7.MyDNS


## Jenkinsのインストールとセットアップ

### インターネット上に仮想サーバーを立てる

IBM Cloud の仮想サーバーを立てました。 https://console.bluemix.net/ 


### MyDNSでドメイン名を取得する

https://www.mydns.jp/でドメイン名を取得

~~~ドメインを維持するcron
# m h  dom mon dow   command
#
0 2 * * * curl --user USERID:PASSWD http://www.mydns.jp/login.html > /tmp/mydns.txt
~~~


### DockerCE のインストール

~~~
# add repo Docker-CE
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

# install Docker-CE
apt-get update
apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')
usermod -aG docker myuserid
~~~


### Java8 のインストール

このサイトを参考にインストール
https://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d


### Jenkins をインストールする

Jenkinsのダウンロード
https://jenkins.io/download/

Jenkins 起動スクリプト

~~~
#!/bin/bash

export BASE=/$HOME/jenkins
export JENKINS_HOME=$BASE/data

nohup java -jar jenkins.war --httpPort=9080 1>$BASE/logs/jenkins.log 2>$BASE/logs/jenkins.err &
~~~


### Jenkinsのセットアップ

Youtube を参考にセットアップ
https://www.youtube.com/watch?v=89yWXXIOisk



## GitHubとJenkinsの連携を設定する


### GitHubの Webhooks 設定

GitHubのリポジトリ https://github.com/takara9/web-nginx で設定
![スクリーンショット 2018-08-02 21.02.12.png](https://qiita-image-store.s3.amazonaws.com/0/42829/1f154789-f7e8-38af-0b44-c73f97a0b1c1.png "スクリーンショット 2018-08-02 21.02.12.png")


### Jenkins 認証情報作成

認証情報 -> System -> Add domain -> ドメイン、ドメイン名を付与 -> OK

認証情報の追加 -> 
種類「ユーザー名とパスワード」
ユーザー名 DockerHubのユーザーID
パスワード 同パスワード
ID パイプライン・スクリプトが参照するラベル dockerhub



### Jenkins タスク設定

「新規ジョブ作成」->  名前をつけて「パイプライン」を選択 -> OKでジョブ作成

1.General の GitHub project をチェック
2.URLを設定する https://github.com/takara9/web-nginx/
3.ビルドトリガーのGitHub hook trigger for GITScm polling
4.パイプラインを設定、定義 Pipeline scriptを選択

~~~
node {
    stage('チェックアウト') {
        checkout([$class: 'GitSCM', 
        branches: [[name: '*/master']], 
        doGenerateSubmoduleConfigurations: false, 
        extensions: [], submoduleCfg: [], 
        userRemoteConfigs: [[url: 'https://github.com/takara9/web-nginx/']]])
    }

    // versionの読み込み
    def version = readFile('version').trim()
    def imageName = "maho/web-nginx:" + version
    print imageName

    stage('ビルド') {
        sh "docker build --tag " + imageName + " ."
    }

    stage ('DockerHubへプッシュ') {
        // jenkinsに登録した認証情報を利用する
        withCredentials([[$class: 'UsernamePasswordMultiBinding', 
                        credentialsId: 'dockerhub',
                        usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
            sh 'docker login -u $USERNAME -p $PASSWORD'
        }
        sh "docker push " + imageName
    }   
}
~~~

参考資料 https://qiita.com/miyasakura_/items/9d9a8873c333cb9e9f43


### ビルドの実行テスト

ビルド実行をクリックしてビルドのテスト

![スクリーンショット 2018-08-02 21.23.26.png](https://qiita-image-store.s3.amazonaws.com/0/42829/6a5bfe84-6612-4740-b815-7e3f88ddb465.png "スクリーンショット 2018-08-02 21.23.26.png")

 
 
### git pushトリガーの コンテナ ビルド & プッシュ

(1) ソースコードをローカルへクローン
git clone https://github.com/takara9/web-nginx

(2) コードを編集
エディタで修正
version ファイルに、DockerHub リポジトリのタグを設定  例 0.1, 0.2 

(3) リポジトリへpush

git commit -m "update"
git push


(4) wehhooksにより、チェックアウト、ビルド、プッシュが実行される。


## まとめ

* 以上でGitHub, Jenkins, DockerHub までのツールのチェーンを作成できた。
* Jenkinsには、Dockerコンテナのビルド環境など、ビルドの環境は作らなければいけない。
* Jenkinsは、JENKINS_HOMEのディレクトリごとバックアップが必要