GitLab CIのキャッシュの保存先にS3互換ストレージのMinIOを使う

GitLabをHelmで立てるとデフォルトでS3ストレージのMinIOが立ち上がる。
これを活用して、GitLabのCI/CDでキャッシュの保存先としてMinIOを使ってみた時のメモ。

## 前提条件
MinIOにアクセスできるようになっていること。今回はIngressを利用した。
```
$ kubectl get ing gitlab-minio
NAME           CLASS           HOSTS                       ADDRESS                                                                PORTS     AGE
gitlab-minio   awesome-class   minio.gitlab.hogeeee.info   k8s-gitlab-gitlabmi-xxxxxxxx.us-east-1.elb.amazonaws.com   80, 443   230d
```

また、RunnerのデプロイにはHelmを利用している。

## MinIOでバケットを作成する
MinIOにアクセスするためのAccess KeyとSecret KeyはGitLab経由でインストールした際はSecretに保管されている。
```
$ kubectl get secret -n gitlab |grep minio
gitlab-minio-secret                         Opaque                                2      371d
```
こちらから引っ張る。今回はkubectl view-secret pluginで取得した。
```
kubectl view-secret gitlab-minio-secret accesskey
kubectl view-secret gitlab-minio-secret secretkey
```
次にMinIOにブラウザでアクセスし、バケットを作成する。
なお、出来る人はmcコマンドでちゃっちゃとやってしまって無問題。
アクセスすると以下の画面が出るので、先程取得したAccess KeyとSecret Keyを入力してログインする。

![1676976486340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/475cd238-f866-c76b-02cf-f86039c8320a.png)

右下のアイコンをクリックし、Create bucketからバケットを作成する。
![1676976594659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/34bc06b9-9ee2-8009-8f3a-78fee688d29e.png)

今回バケット名はtest-cacheとした。
![1676976725884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/f684f1fe-e62a-294e-c6bc-eae7cf0c06fd.png)

MinIOでの操作は一旦お終い。

## GitLab Runnerのデプロイ
[公式ドキュメント](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching)に従って、S3の設定を追記する。
values.yamlだと以下のように`[runners.cache]`以下を追加した。
```yaml
runners:
  config: |
    [[runners]]
      [runners.cache]
        Type = "s3"
        Path = "test-cache-dir/"
        Shared = false
        [runners.cache.s3]
          ServerAddress = "minio.gitlab.hogeeee.info"
          AccessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          SecretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          BucketName = "test-cache"
          Insecure = false
      [runners.kubernetes]
        namespace = "{{.Release.Namespace}}"
        image = "ubuntu:16.04"
```
`Path =`のところは勝手にディレクトリを作成してくれるので、存在しないディレクトリを指定しても問題ない。
`ServerAddress`にMinIOのアドレス、`AccessKey`,`SecretKey`にSecretから取ってきた値を、`BucketName`に先程作成したバケット名を入れて、Runnerをデプロイする。
```
helm upgrade -i -f runner-values.yaml gitlab-runner-debug gitlab/gitlab-runner -n gitlab
```
ConfigMapに反映されていることを確認する。
```yaml
$ kubectl get cm -o yaml gitlab-runner-debug |grep test-cache -B4
  config.template.toml: |
    [[runners]]
      [runners.cache]
        Type = "s3"
        Path = "test-cache-dir/"
--
        [runners.cache.s3]
          ServerAddress = "minio.gitlab.hogeeee.info"
          AccessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          SecretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          BucketName = "test-cache"
```

## 動作確認

`.gitlab-ci.yml`にこんなジョブを用意した。
```yaml
build-job:
  stage: build
  rules:
  - if: '$CI_PIPELINE_SOURCE == "push"'
  script:
  |- 
    set -x
    if [ ! -d ".config" ]; then
      mkdir .config
    fi
    ls -l .config/
    echo "test" > .config/hoge
  cache:
    key: test-cache
    paths:
      - .config
```
cacheが正常に保存されれば、2回目のlsでcacheがある状態が表示されるはずだ。
このジョブを実行した結果したところ、1回目はこのような出力となった。
```sh
Executing "step_script" stage of the job script
$ set -x # collapsed multi-line command
++ '[' '!' -d .config ']'
++ mkdir .config
++ ls -l .config/
total 0
++ echo test
Saving cache for successful job
Creating cache test-cache-protected...
.config: found 2 matching artifact files and directories 
Uploading cache.zip to https://minio.gitlab.hogeeee.info/test-cache/test-cache-dir/runner/WDBR7uzC/project/3/test-cache-protected 
Created cache
Cleaning up project directory and file based variables
Job succeeded
```
lsでは何も取得できず、最後にMinIOにUploadしていることが見て取れる。
ジョブを再実行する。
```sh
Executing "step_script" stage of the job script
$ set -x # collapsed multi-line command
++ '[' '!' -d .config ']'
++ ls -l .config/
total 4
-rw-r--r-- 1 root root 5 Feb 21 11:37 hoge
++ echo test
Saving cache for successful job
Creating cache test-cache-protected...
.config: found 2 matching artifact files and directories 
Uploading cache.zip to https://minio.gitlab.hogeeee.info/test-cache/test-cache-dir/runner/WDBR7uzC/project/3/test-cache-protected 
Created cache
Cleaning up project directory and file based variables
Job succeeded
```
今度はlsの結果が取得できた。これにより、cacheに溜め込んだものが次のジョブで再利用できることが確認できた。