Helm で Jenkins を OpenShift にデプロイする

Helm を用いて OpenShift に Jenkins をデプロイし、`https://jenkins.apps.<openshift-domain>` からアクセスできるようにする。手順は https://artifacthub.io/packages/helm/jenkinsci/jenkins に従う。

サンプルレポジトリ：

https://github.com/sawa2d2/helm-with-openshift-samples/tree/main/jenkins

## Environment
- `helm`

- OKD4 (v4.14.0)
  - Dynamic Provisioning 可能な StorageClass
    - e.g. ODF の `ocs-storagecluster-ceph-rbd`

```
$ oc get sc
NAME                          PROVISIONER                             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
localblock                    kubernetes.io/no-provisioner            Delete          WaitForFirstConsumer   false                  26h
ocs-storagecluster-ceph-rbd   openshift-storage.rbd.csi.ceph.com      Delete          Immediate              true                   25h
ocs-storagecluster-ceph-rgw   openshift-storage.ceph.rook.io/bucket   Delete          Immediate              false                  26h
ocs-storagecluster-cephfs     openshift-storage.cephfs.csi.ceph.com   Delete          Immediate              true                   25h
```

## 手順
### Helm chart のデプロイ
Jenkins の Helm レポジトリを追加する
```
# Add repository
$ helm repo add jenkinsci https://charts.jenkins.io/

# Update repository
$ helm repo update
```

helm の設定をデフォルトからカスタマイズするために、下記の `values.yaml` 作成する。

```values.yaml
controller:
  usePodSecurityContext: true
  runAsUser: 0
  fsGroup: 0
  containerSecurityContext:
    runAsUser: 0
    runAsGroup: 0
    readOnlyRootFilesystem: false
    
persistence:
  storageClass: <STORAGE_CLASS_NAME>
```

Helm で Jenkins をデプロイする。
```
# Install jenkins
$ helm install jenkins jenkinsci/jenkins --version 5.3.3 -f values.yaml
```

Jenkins がデプロイされたことを確認する：
```
$ oc get pods
NAME        READY   STATUS    RESTARTS   AGE
jenkins-0   2/2     Running   0          4m43s

$ oc get svc
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP                            PORT(S)     AGE
jenkins         ClusterIP      172.30.147.224   <none>                                 8080/TCP    31m
jenkins-agent   ClusterIP      172.30.99.228    <none>                                 50000/TCP   31m

$ oc get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
...
jenkins   Bound    pvc-e09c4ae6-5eaf-415b-97a0-3726e971c254   8Gi        RWO            ocs-storagecluster-ceph-rbd   29m

$ oc get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                      STORAGECLASS                  REASON   AGE
...
pvc-e09c4ae6-5eaf-415b-97a0-3726e971c254   8Gi        RWO            Delete           Bound    default/jenkins                                            ocs-storagecluster-ceph-rbd            29m

```

## Route の作成
```
$ oc create route edge --service=jenkins --hostname=jenkins.apps.ocp4.example.com --port='8080' --insecure-policy='Redirect'
```

## Jenkins へのアクセス

指定した URL (e.g. https://jenkins.apps.ocp4.example.com) から Jenkins にアクセスする。

![Screenshot from 2024-02-03 18-04-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261727/3fc258a5-93d7-c3af-8311-a0745c5add45.png)


Secrets からログイン情報を取得する。
```
$ oc get secrets jenkins -o yaml | yq '.data.jenkins-admin-user' | base64 --decode
admin
$ oc get secrets jenkins -o yaml | yq '.data.jenkins-admin-password' | base64 --decode
<PASSWORD>
```

ログインする。

![Screenshot from 2024-02-03 18-04-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261727/b50359f0-b9ca-effe-ae0c-0a197009bdec.png)


## Cleanup
本記事で構築したものをクリーンアップするには、次のコマンドを実行する。
```
$ helm uninstall jenkins
$ oc delete route jenkins
```

## Links
### 参考にした GitHub Issues
- [Permission denied on disable Setup Wizard step · Issue #210 · jenkinsci/helm-charts](https://github.com/jenkinsci/helm-charts/issues/210)
- [(k8s v1.25 bug?) compute-resources: must specify limits.cpu for: config-reload; limits.memory for: config-reload; requests.cpu for: config-reload; requests.memory for: config-reload · Issue #737 · jenkinsci/helm-charts](https://github.com/jenkinsci/helm-charts/issues/737)
- [Error while deploying on OpenShift: AccessDeniedException: /.cache · Issue #506 · jenkinsci/helm-charts](https://github.com/jenkinsci/helm-charts/issues/506#issuecomment-1050898826)