docker-compsoeで jenkins導入までの道のり・・・

# はじめに
会社で、jenkinsを使った自動テスト環境を作ることになり、環境構築をしたもののDocker環境で動かすのに相当苦労したため、備忘も兼ねて記載
まぁ、Docker環境っていうより、docker-composeの方で躓いた感じですが・・・
一応、成功だけじゃなくて、過程も含めて、記載

---

# 導入するjenkinsについて
Jenkins(ジェンキンス)とは、継続的インテグレーション(CI)や継続的デリバリー(CD)を実現のためのツール
あとは、下記を見てもらえれば、jenkinsとはなんぞやがわかってくれると思ってます・・・

#### 引用文献
[Jenkinsとは？» CloudBees|テクマトリックス](https://cloudbees.techmatrix.jp/jenkins/)

#### 参考文献
[Jenkins](https://www.jenkins.io/)
[Jenkins - Wikipedia - ウィキペディア](https://ja.wikipedia.org/wiki/Jenkins)

---

# 作業環境

ubuntu20.04 
Docker 20.10.2
docker-compose 1.26.2

---

# 作業

## 前提
Dockerとdocker-compsoeはインストールされていること

## 手順
環境構築で、変更作業としては、こんな感じかな～

1. 作業（結果：失敗）
    1. ソース
    1. 結果
1. 調査
1. 作業（結果：成功）
    1. ソース
    1. 結果

---

## 1. 作業（結果：失敗）
### docker-compose
いつもどおり、なにも考えず、データは永続化したいので、Volumeでjenkins_homeを永続化

```yml:docker-compose.yml

version: "3.7"
services:
  jenkins:
    container_name: jenkins
    image: jenkinsci/blueocean:latest
    volumes:
      - ./jenkins/jenkins-data:/var/jenkins_home
    restart: always
    ports:
      - "18080:8080"
      - "50000:50000"
    entrypoint: ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]

```

### 実行
```command.
docker-compose up -d
```
### 動いたかどうか確認
http://xxx.xxx.xxx.xx:18080
にアクセス!!

![error1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235279/791dcca4-3ab6-ec24-2662-59fdab4230f3.png)

？？あれ？
コンテナどうなってる？

```command.
docker logs -f jenkins
```
```ログ.
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
```
なんじゃこりゃ？
Dockerって基本rootだからPermissionでエラーすることないんやないの？
どういうこと？

---

## 2. 調査
ネットで頑張って調べる・・・

なんか調べてると、UIDとGUIDの1000がホスト側のフォルダに所有権に無いから、つければええよ感じっぽい・・・
UIDとGUIDの1000のホストの権限をつける？

あ～これ、コンテナ側が、rootでの起動をしていないのね・・・

でも、そうなると、shとか書かないと駄目だよな～
DockerfileにUser書いて、一度、rootでビルドした後に、実行時にjenkinsのユーザに変更して対応してたりするな～
面倒やな・・・って、コンテナのUIDとGUIDを直接rootにすればええんやない？
あんまり変更するのは、よろしくなさそうやけど・・・
まぁ、内部でしか使わんし、コンテナの起動ユーザをrootに書き換えちゃおう！！

### 参考文献
[「Jenkins」Dockerイメージを使ってJenkinsの環境を構築する](https://www.javaer101.com/article/6873653.html)
[ジェンキンスコンテナーを開始しますが、ボリュームに対して 'chown'を実行しましたが、アクセス許可が拒否されました](https://www.javaer101.com/article/6873653.html)
[2015-02-10 Jenkinsの公式Dockerイメージ使ってみた](https://knjname.hateblo.jp/entry/2015/02/10/040833)
[Dockerコンテナ上のJenkinsでコンテナをたててテストを実行する](https://fintan.jp/?p=4655)
[Docker を使って Jenkins サーバーをローカルに構築する (プラグイン導入済み)](https://dev.classmethod.jp/articles/jenkins-on-docker/)

---

## 3. 作業（結果：成功）

### docker-compose
```docker-compose.yml
version: "3.7"
services:
  jenkins:
    container_name: jenkins
    user: 0:0
    image: jenkinsci/blueocean:latest
    volumes:
      - ./jenkins/jenkins-data:/var/jenkins_home
    restart: always
    ports:
      - "18080:8080"
      - "50000:50000"
    entrypoint: ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]
```

### 実行
```comand.
docker-compose up -d
```

### 動いたかどうか確認
http://xxx.xxx.xxx.xx:18080
にアクセス!!


![成功.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235279/2eb82b5b-fb71-a3cd-563c-924d9b3397df.png)



成功～！！
動きました～
フォルダの中にもjenkins_homeの中身がホスト側からアクセスできるようにもなりました！

---

# 最後に

今回、docker-composeファイルしか作りたくない一心でrootユーザにして起動させています。
まぁ、jenkinsとしては、推奨していないと思われますので、こんなやり方じゃなく他のやり方でやりたいとかであれば、
docker-cmposeを使わずにやる方法か、ビルドだけrootで行い、ビルド中にユーザ権限を付けるようにshを組むかすると良いかと思います。