Ubuntu20環境にjenkinsをdockerで起動させてnginxでサーバを建てる


Ubuntu20環境にjenkinsをdockerで起動させてnginxでサーバを建てる

やること
- jenkinsをインストールして起動してジョブを作るまで。

やらないこと
- pipeline
- Node
- jenkinsの設定

## jenkins install

```bash
# /app/jenkins配下にインストールする例
sudo mkdir /app/jenkins
# jenkins_homeはjenkinsのsrcが入る
sudo mkdir /var/jenkins_home
sudo chown 1000:1000 /var/jenkins_home
cd /app/jenkins
sudo vim Dockerfile
sudo vim docker-compose.yml
```

Dockerfileの中身

```Dockerfile
FROM jenkins/jenkins:lts

USER root

RUN apt-get update -y \
&& apt-get -y install sshpass lftp\
&& curl -fL -o docker.tgz "https://download.docker.com/linux/static/test/x86_64/docker-20.10.14.tgz" \
&& tar --strip-components=1 -xvzf docker.tgz -C /usr/bin \
&& groupadd docker \
&& gpasswd -a jenkins docker

USER jenkins
```

docker-composeの中身

```docker-compose.yml
version: "3"
services:
  jenkins:
    build: .
    ports:
      - 8080:8080
   environment:
      TZ: Asia/Tokyo
    volumes:
      - /var/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
```

### 各ファイル準備ができたらdockerをたちあげる

```bash
$ sudo docker-compose build
$ sudo docker-compose up -d
```

### nginxサーバにjenkinsの追加

```bash
$ sudo vim /etc/nginx/sites-available/jenkins
$ sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/jenkins
$ sudo service nginx restart
```

証明書発行までは443部分をコメントアウトか、仮証明書を置いておく必要あり

```jenkins
#----------------------------------------
# index
#----------------------------------------
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto http;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://0.0.0.0:8080;
    }
}

#----------------------------------------
# jenkins
#----------------------------------------

server {
    listen 80;
    server_name jenkins.example.com; #自分のドメイン

    # letsencrypt用だが、設定変更必要かも
    location /.well-known/ {
        root /var/www/html;
    }

    location / {
        return 301 https://jenkins.example.com$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name jenkins.example.com;

    ssl_certificate     /etc/letsencrypt/live/jenkins.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jenkins.example.com/privkey.pem;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://0.0.0.0:8080;
    }
}
```

## 証明書発行

```bash
$ sudo certbot certonly --webroot -w /var/www/html  -d jenkins.example.com
```

## jenkinsの設定

ブラウザでアクセスして設定していく。
初回でアドミンユーザ登録と、プラグインのインストールを行う。

```bash
$ cat /var/jenkins_home/secrets/initialAdminPassword
1e6e303b720f4c30b0803ec3e17a05e2
```

## userの作成

とりあえず確認用に3つ作成

`admin`
`B#THH7!kLvn*vhVA`

`developer`
`qk1EG4!2PmWanENc`

`user`
`skE23eib#veEENc$`

### 権限の設定

`Role-based Authorization Strategy Plugin`プラグインをインストールし、各ロールを作成。

user: テスト関連のみデプロイ可能
developer: 全部できる

で設定してテストする

## ジョブの作成

割愛

- shellをそのまま流用すると、ダブルクォートがjenkinsでは解決されるため、シングルクォートに直したり、パイプ使っているところを変えたりしないといけない
- 環境変数はjenkinsのクレデンシャルとグローバル定数で定義する。
- 必要なタイミングでjenkinsプラグインのインストールする。
  - ssh関連のプラグインインストールとか

## JENKINS API
- `/api/json`をURL末尾につけるとjsonで返ってくる
- 認証が必要なため、アクセストークンと外部ドメインの許可設定が必要になる。
- curlのオプションでuserの指定が必要
- 基本的にはjenkinsの内部でジョブの中からジョブの状態をみるために使うため、localhostでokなはず

```bash
$ curl --user 'developer:{ACCESS_TOKEN}' 'https://jenkins.example.com/api/json'
$ curl --user 'developer:{ACCESS_TOKEN}' 'http://localhost:8080/api/json'
```

## 参考

https://fintan.jp/page/1565/
https://www.mmj.ne.jp/mmjblog/docker-on-jenkins/
[jenkins - dockerhub](https://hub.docker.com/r/jenkins/jenkins/tags)