JenkinsをDockerで起動した話

# 概要

表題通りCI/CDツールの一つJenkinsサーバーをDockerを使って起動できたので、記事にします。
基本公式の手順にをなぞっているだけです。
先見の方の知見も大いに活用させていただきました。
解釈間違ってたらご容赦ください。

- 追記
Docker駆動のサーバーについてはGitHubに集約しました。
[SustainableEnv](https://github.com/koiusa/SustainableEnv/tree/recommend)

# GitHub Project

https://github.com/koiusa/jenkins-test

# 公式リンク

### Jenkins Docker Support 

https://www.jenkins.io/doc/book/installing/docker/

### Jenkins Docker Hub

https://hub.docker.com/_/jenkins

# 動作環境構築

### 動作確認環境
```
  Operating System: Ubuntu 20.04.5 LTS
            Kernel: Linux 5.4.0-137-generic
      Architecture: x86-64
```

### 手順

Dockerfileを作成
```
FROM jenkins/jenkins
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
```

docker-compose.ymlを作成
```
version: '3.9'

services:
  docker:
    image: docker:dind
    privileged: true
    networks: 
      - jenkins
    environment:
      DOCKER_TLS_CERTDIR: /certs
    volumes:
      - ./jenkins-docker-certs:/certs/client
      - ./jenkins-home:/var/jenkins_home
    expose:
      - "2376"

  jenkins-blueocean:
    build: .
    depends_on:
      - docker
    networks: 
      - jenkins
    environment:
      DOCKER_HOST: "tcp://docker:2376"
      DOCKER_CERT_PATH: /certs/client
      DOCKER_TLS_VERIFY: 1
    expose:
      - "8888"
      - "50000"
    ports:
      - "8888:8080"
      - "50000:50000"
    volumes:
      - ./jenkins-docker-certs:/certs/client:ro
      - ./jenkins-home:/var/jenkins_home

networks:
  jenkins:
    driver: bridge
```

公式のDockerHubのイメージをpull
```
docker pull jenkins/jenkins
```
BuleOceanプラグインをイメージにビルド
```
docker build -t jenkins/jenkins .
```
DockerNetworkを作成
```
docker network create jenkins
```
docker-composeでjenkinsのdockerプロセスを起動
```
docker-compose -f docker-compose.yml up -d
```
dockerイメージからバインドしているディレクトリの所有者を現在のユーザーに変更
```
sudo chown -R ${USER}:${USER} jenkins-*
```

以上でjenkinsのサーバーがDockerで起動します

ブラウザでjenkinsのウェブページを表示できます。
```
http://＜ホストPCのIP＞:8888
```
docker-composeを起動したディレクトリ内に初期パスワードが記載されているファイルが作成されるので、内容をコピーしてログイン後、表示される初期化手順に従います。
```
./jenkins-home/secrets/initialAdminPassword
```

# Jenkinsのpipeline実行

深堀すると他にもいろいろありそうですが、とりあえずリポジトリ内のjenkinsfileに動作ルールを記述すれば動くと思います。

agentがpipelineを実行時にホストとなる環境です。

```
pipeline {
  agent {
    docker {
      image 'python:3.6' ※1
      args '-u root:sudo'
    }

  }
  stages {
    stage('Build') {
      steps {
        sh '''
            echo "building"
            uname
            cat /etc/*release
            apt-get update && apt-get install sudo ※2
            cd app
            ls
            sudo pip install -r requirements.txt
        '''
      }
    }

    stage('Test') {
      parallel {　※3
        stage('App') {
          steps {
            sh '''
                cd app
                ls
                python3 ./app.py
            '''
          }
        }

        stage('HelloWorld') {
          steps {
            sh '''
                cd app
                ls
                python3 ./helloworld.py
            '''
          }
        }

      }
    }

    stage('Deploy') {
      steps {
        sh 'echo "Deploy"'
      }
    }

  }
}
```

※1 pythonを動かしたいのでpythonがインストールされているイメージを使用します。
※2 基本的に公式のDockerイメージはデフォルトではsudoが使用できないので、buildのスクリプトでインストール動作を記述しています。
※3 メインの実行処理ですが、並列処理の記述もできます。

以上

# あとがき

sudoって標準で使えるものかと思っていたので、sudoが使用できないところでちょっとつまりました。

とりあえず動かしただけですが、
あとは、環境に応じて処理を増やしてくことになるかと思います。
詳しいことはまだわからないので、なんか知見たまったら追記します。
たぶん、、、