Docker Compose & Jenkinsを使ってみた話

なんか「**Jenkins**」を使ってみたいと思ったんです。
そういう年頃なんです。
色々と面倒なのは勘弁なので、「**Docker**」を使って楽に環境構築することにしました。

# ワイの環境
- OS：Windows 10

# 前提
- 「**Docker for Windows**」がインストールされていること。

# Jenkinsってこんなアイコンやで
<img width="251" alt="jenkins8.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/05eacd0e-a3a8-53eb-7cf8-71b35f063a21.jpeg">
ワイほどではないですが、ジェントルマンですね。

# じゃあ環境構築するよ
じゃあ、早速やりましょう。
今回は「**Docker Compose**」を使います。
何やら、Jenkinsは「**master-slave**」構成が一般的らしく、今回はmasterしか作りませんが、「**Docker Compose**」の方が実用的かなと思ったので。

## まずはフォルダを作る
任意の場所に「**docker-jenkins**」みたいなフォルダを作ります。
※フォルダ名も何でもいいです。

## docker-compose.ymlを作成
以下のファイルを先ほどのフォルダ内に作成します。

```yaml:docker-compose.yml
version: '3'

services:
  master:
    container_name: master
    image: jenkins:latest
    ports:
      - 18080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home

```
特に変わったことはせずに、jenkinsのイメージを使っています。
ポートは「**18080**」にしています。

## Dockerコンテナを起動
```powershell:
C:\docker-jenkins> docker-compose up
```
コマンドを実行します。
よく「**-d**」オプションを付けてバックグラウンドで実行させますが、今回はフォアグラウンドで実行します。

## 実行結果
```powershell:
C:\docker-jenkins> docker-compose up
Creating master ... done                                                                                                Attaching to master
master    | Running from: /usr/share/jenkins/jenkins.war
master    | webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
master    | Feb 20, 2020 9:03:33 AM Main deleteWinstoneTempContents
master    | WARNING: Failed to delete the temporary Winstone file /tmp/winstone/jenkins.war
master    | Feb 20, 2020 9:03:33 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: Logging initialized @884ms
master    | Feb 20, 2020 9:03:33 AM winstone.Logger logInternal
master    | INFO: Beginning extraction from war file
master    | Feb 20, 2020 9:04:32 AM org.eclipse.jetty.util.log.JavaUtilLog warn
master    | WARNING: Empty contextPath
master    | Feb 20, 2020 9:04:32 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: jetty-9.2.z-SNAPSHOT
master    | Feb 20, 2020 9:04:35 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
master    | Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
master    | Feb 20, 2020 9:04:38 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: Started w.@47404bea{/,file:/var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
master    | Feb 20, 2020 9:04:38 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: Started ServerConnector@1c80e49b{HTTP/1.1}{0.0.0.0:8080}
master    | Feb 20, 2020 9:04:38 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: Started @65859ms
master    | Feb 20, 2020 9:04:38 AM winstone.Logger logInternal
master    | INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled
master    | Feb 20, 2020 9:04:40 AM jenkins.InitReactorRunner$1 onAttained
master    | INFO: Started initialization
master    | Feb 20, 2020 9:04:41 AM jenkins.InitReactorRunner$1 onAttained
master    | INFO: Listed all plugins
master    | Feb 20, 2020 9:04:45 AM jenkins.InitReactorRunner$1 onAttained
master    | INFO: Prepared all plugins
master    | Feb 20, 2020 9:04:45 AM jenkins.InitReactorRunner$1 onAttained
master    | INFO: Started all plugins
master    | Feb 20, 2020 9:04:45 AM jenkins.InitReactorRunner$1 onAttained
master    | INFO: Augmented all extensions
master    | Feb 20, 2020 9:04:48 AM jenkins.InitReactorRunner$1 onAttained
master    | INFO: Loaded all jobs
master    | Feb 20, 2020 9:04:49 AM hudson.model.AsyncPeriodicWork$1 run
master    | INFO: Started Download metadata
master    | Feb 20, 2020 9:04:50 AM jenkins.util.groovy.GroovyHookScript execute
master    | INFO: Executing /var/jenkins_home/init.groovy.d/tcp-slave-agent-port.groovy
master    | Feb 20, 2020 9:04:51 AM jenkins.InitReactorRunner$1 onAttained
master    | INFO: Completed initialization
master    | Feb 20, 2020 9:04:53 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
master    | INFO: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@6913ea65: display name [Root WebApplicationContext]; startup date [Thu Feb 20 09:04:53 UTC 2020]; root of context hierarchy
master    | Feb 20, 2020 9:04:53 AM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
master    | INFO: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@6913ea65]: org.springframework.beans.factory.support.DefaultListableBeanFactory@3765f1c9
master    | Feb 20, 2020 9:04:53 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
master    | INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@3765f1c9: defining beans [authenticationManager]; root of factory hierarchy
master    | Feb 20, 2020 9:04:54 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
master    | INFO: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@61030fca: display name [Root WebApplicationContext]; startup date [Thu Feb 20 09:04:54 UTC 2020]; root of context hierarchy
master    | Feb 20, 2020 9:04:54 AM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
master    | INFO: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@61030fca]: org.springframework.beans.factory.support.DefaultListableBeanFactory@4ab8811f
master    | Feb 20, 2020 9:04:54 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
master    | INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4ab8811f: defining beans [filter,legacy]; root of factory hierarchy
master    | Feb 20, 2020 9:04:55 AM jenkins.install.SetupWizard init
master    | INFO:
master    |
master    | *************************************************************
master    | *************************************************************
master    | *************************************************************
master    |
master    | Jenkins initial setup is required. An admin user has been created and a password generated.
master    | Please use the following password to proceed to installation:
master    |
master    | ★★★ここやで★★★
master    |
master    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
master    |
master    | *************************************************************
master    | *************************************************************
master    | *************************************************************
master    |
master    | Feb 20, 2020 9:04:58 AM hudson.model.UpdateSite updateData
master    | INFO: Obtained the latest update center data file for UpdateSource default
master    | Feb 20, 2020 9:04:59 AM hudson.model.DownloadService$Downloadable load
master    | INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
master    | --> setting agent port for jnlp
master    | --> setting agent port for jnlp... done
master    | Feb 20, 2020 9:05:03 AM hudson.model.UpdateSite updateData
master    | INFO: Obtained the latest update center data file for UpdateSource default
master    | Feb 20, 2020 9:05:03 AM hudson.model.DownloadService$Downloadable load
master    | INFO: Obtained the updated data file for hudson.tools.JDKInstaller
master    | Feb 20, 2020 9:05:03 AM hudson.model.AsyncPeriodicWork$1 run
master    | INFO: Finished Download metadata. 13,858 ms
master    | Feb 20, 2020 9:05:03 AM hudson.WebAppMain$3 run
master    | INFO: Jenkins is fully up and running
```
「★★★ここやで★★★」って書いてるところにシークレットキーが記載されているのでどこかにメモしておいてください。

# Jenkinsが使えるところまでいくよ
ってことで、アクセスしてみます。

## Jenkinsにアクセス
⇒ [http://localhost:18080/](http://localhost:18080/)
※docker-composeの設定で18080にしていたので、ポートは「**18080**」でアクセスします。

<img width="743" alt="jenkins1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/21ebc736-6ab4-edd7-65de-aaf08e889712.jpeg">
おっ！画面が出ましたね。
ってことで、先ほどメモしておいたシークレットキーを入力して、画面下部の「**Continue**」ボタンを押します。

<img width="742" alt="jenkins2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/694a0d2a-2686-692a-4f10-20d730b9c677.jpeg">
今回は細かい設定をするつもりにないので、「**Install suggested plugins**」をクリックします。

<img width="740" alt="jenkins3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/4df29162-eb92-0bc2-8ea4-ce7e7a2469b4.jpeg">
え？．．．．え？．．．．。

## Jenkinsのセットアップに失敗したのでググる
どうやらDockerイメージは「**jenkins/jenkins:lts**」らしい。
なんて日だ！！

## docker-compose.ymlの修正
```yaml:docker-compose.yml
version: '3'

services:
  master:
    container_name: master
    image: jenkins/jenkins:lts
    ports:
      - 18080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home

```
これでどうよ！！

## だめや
```powershell:
Attaching to master
master    | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': No such file or directory
master    | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
master exited with code 1
```
ぽえええええええええ。
ぶちぎれナウ。

## ディレクトリを変更してみる
```yaml:docker-compose.yml
version: '3'

services:
  master:
    container_name: master
    image: jenkins/jenkins:lts
    ports:
      - 18080:8080
    volumes:
      - ./jenkins_home:/var/lib/jenkins_home

```
「**/var/jenkins_home**」から「**/var/lib/jenkins_home**」にするとうまくいくという記事を見かけたのでその通りにしてみます。
いけええええええええええええええええええええええええええええええええええええええええい！！
※ただこれあれですね。ホスト側の「**jenkins_home**」に何もマウントされてこないので、ここら辺使う予定の人はだめかもね！

## 再度アクセス
どうやらうまくいったので再度アクセスします。
⇒ [http://localhost:18080/](http://localhost:18080/)

ここからシークレットキーとかを入れる手順は前と同じです。

## 俺の時代がきました
<img width="745" alt="jenkins4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/6acdaee2-25fc-ccbd-fc3f-9d2c0ab23f87.jpeg">
うまくいくとこの画面に来ます。
言い換えると、この画面が出ないということはセットアップに失敗しています。
ってことで、適当に入力して画面下部の「**Save and Continue**」をクリックします。

<img width="741" alt="jenkins5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/c49e622f-d95f-0101-cf69-9d13a3ac6618.jpeg">
「**JenkinsのURLはこれでいいか？**」と聞かれます。
それでよきに候なので「**Save and Finish**」をクリックします。

<img width="742" alt="jenkins6.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/e6de1709-bd86-3afc-d78d-cf01c56c8517.jpeg">
ポチっとな。

<img width="1919" alt="jenkins7.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/82f43ad1-d797-34d8-ebd6-7dbd84e43d46.jpeg">
おわり！！

## まとめ
なんもねーよ！！
じゃあな！！