CI/CDをkatacodaで体験（初心者向け） - Part10(Building Docker Images using Jenkins)

# CI/CD入門
このぺーじでは、[katacoda](https://www.katacoda.com/)と呼ばれる「ブラウザから無料で勉強用のインスタンスを起動できるWebサービス」を利用してCI/CDを実践します
内容は上記リンクに沿うので、不明点があればそちらへどうぞ

## jenkinsによるdockerコンテナのbuild - Building Docker Images using Jenkins
ここでは、CI/CDの中心となるjenkinsの利用例を紹介
このシナリオで学習することをさっと確認する場合は**概要**を確認
**理解に間違い等がございましたら、ぜひご指摘ください**

### <font color="Red">概要</font>
>- jenkinsによるコンテナbuildには下記の手順を踏む
    1. 特定のpluginをインストール
    2. pluginの設定
    3. jenkins agentの設定
    4. jenkins agentに実行させるprojectの作成
    5. project実行  

### Launch Jenkins
まず下記コマンドを実行しjenkinsをdockerコンテナとして実行

```
docker run -d -u root --name jenkins \   //バックグラウンド実行、rootユーザ、コンテナ名"jenkins"
    -p 8080:8080 -p 50000:50000 \   //8080番ポートはweb dashboard、50000番はjenkins agentとの疎通用
    -v /root/jenkins_2112:/var/jenkins_home \   //ホスト側のマウントpath及びコンテナ側のpath
    jenkins/jenkins:2.112-alpine   
```

今回はホスト端末が別に存在している
アクセスする場合は、ssh接続

```
$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                              NAMES
6048602eb5b9        jenkins/jenkins:2.112-alpine   "/sbin/tini -- /usr/…"   2 minutes ago       Up2 minutes        0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   jenkins
```

コンテナが正常に既往していることを確認後、[こちらのリンク](https://2886795278-8080-cykoria03.environments.katacoda.com/)から移動（デフォルト）
ログインには、```admin```、```344827fbdbfb40d5aac067c7a07b9230```
環境はこのようになっている

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/a2801c95-45db-69af-97d2-1602ea8ab0a7.png)


### Configure Docker Plugin
ここでは、Docker pluginを設定する
Docker pluginを設定することで、jenkinsがdockerデーモンとの通信をagentを介して実現（以下の概略図参照）

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/a0c50056-8e8d-8d8c-30ac-3e1454e4da0f.png)


dashboard上で以下の通りクリックしていく
Manage Jenkins > Manage Plugins > availableタブのDocker > Install without Restart

> このpluginはクラウドプロバイダーとして扱われる
dockerホストと通信するときのみコンテナ（jenkins agent）は起動する

### Add Docker Agent
ここでは、先ほど用意したagentに「コンテナを起動させる」構成を設定

dashboard上で以下の通りクリックしていく
Manage Jenkins > Configure System > Add a new cloudから"Docker" > Docker Host URIに```tcp://172.17.0.67:2345```（docker server）を入力
この手順でDocker daemonとの疎通が成功
確認する場合は、Docker Host URIの```Test Connection```の結果とコンソール上で```docker version```と打ち込んだ際の結果を比較

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/f7c9cd5c-8b14-8b94-e66d-6cd16d3e2897.png)


```
$ docker version
Client:
 Version:      18.05.0-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   f150324
 Built:        Wed May  9 22:16:25 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.0-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.10
  Git commit:   0520e24302
  Built:        Fri Mar 23 01:48:12 2018
  OS/Arch:      linux/amd64
  Experimental: false
```

続いて、agentコンテナを設定
1. Docker Agent templates
2. Add Docker Template
3. agentのlabel記入```docker-agent```
4. コンテナイメージ記入```benhall/dind-jenkins-agent:v2```
5. volumeのマウント設定```/var/run/docker.sock:/var/run/docker.sock```
6. agentコンテナとの接続方法指定```Connect with SSH```
7. save

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/9fb94854-5d42-7ceb-f5c0-1c79e4bfe941.png)


### Create Build Project
ここでは、先ほどの"jenkins-agent"を用いて実行するコンテナの設定を行う
手順は以下の通り
1. ```Create new jobs```でジョブの作成
2. ```Freestyle project```を選択し、プロジェクト名として"Katacoda Jenkins Demo"
3. コンテナ作成に当たって、Docker daemonに要求を出せる"dokcer-agent"（先の手順で作成）を選択
4. 実行するコンテナイメージとして[Gitレポジトリを](https://github.com/katacoda/katacoda-jenkins-demo)指定
5. ```Add Build Step```から```Execute Shell```を選択し、buildの詳細を以下のように記述し、Save

```
ls
docker info
docker build -t katacoda/jenkins-demo:${BUILD_NUMBER} .
docker tag katacoda/jenkins-demo:${BUILD_NUMBER} katacoda/jenkins-demo:latest
docker images

``` 
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/f4a00e2e-986e-7965-8623-9d5824ba7368.png)


### Build Project
ここでは、dashboardから実際にjenkinsによるコンテナbuildを実行
```Build Now```をクリック
>jenkinsコンテナからjenkins-agentコンテナが起動され、そこからGitのdockerfileをもとにコンテナを起動するので多少時間がかかる
時折、```pending—Jenkins doesn’t have label docker-agent```というエラーがdashboardに表示されることもある

### View Console Output
コンテナの起動がjenkinsから確認出来たら、コンソールでコンテナをrunする

```
$ docker run -d -p 80:80 katacoda/jenkins-demo:latest

～～～

$ curl host01
<h1>This request was processed by host: </h1> 
```

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/0501e252-9814-59b8-c434-c058624f6625.png)




```docke image```でコンテナイメージを確認

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/702aefa0-132f-9cc8-ec21-1c57fb55ffd0.png)

　　
```benhall/dind-jenkins-agent```はdocker-agentイメージのこと

```katacoda/jenkins-demo```はjenkinsによるコンテナの作成をしめしている
また、```TAG```の部分に着目すると、```1,2,latest```の三つが用意されている
これは、"Create Build Project"の手順5にて、```${BUILD_NUMBER}```をタグとして管理し、jenkinsによるコンテナbuildの処理が二回行われたことを意味する