概要

GitLabでCIをするために必要なものとして、GitLab Runnerがあります。

GitLab Runnerは自前で用意したコンピュータにインストールして利用するのですが、CIの際にキャッシュを使用する場合は、GitLab Runnerの方でも設定が必須です。

ここでは、Docker上で実行するGitLab Runnerおけるキャッシュの設定方法について紹介します。

環境

  • GitLab Runner 13.5

GitLab RunnerのExecutorとキャッシュ

GitLab Runnerは、様々な方法でCIを実行でき、シェルやDocker、Kubernetesなどがあります。

ちなみに、このような実行方法自体のことをExecutorといい、シェルの場合は、Shell Executor、Dockerの場合はDocker Executorと呼ばれます。GitLab Runnerについて調べる場合は、これらのことを覚えておくと調べやすいです。

私は、あまり環境に依存しなくてすみ、準備も簡単なものとしてDockerを使用しています。

そこで、私はDockerを使ってGitLab Runnerを動作させるようにしているのですが、Dockerの場合、キャッシュの設定が少々特殊で、かなり設定に時間を必要としました。

キャッシュ

そもそも、GitLab Runnerで実行しているCIでは、キャッシュを設定することができ、適切にキャッシュを設定することで実行時間を短くしたり、リソースの消費を抑えられます。

Dockerにおけるキャッシュは、Dockerボリュームを使用した方法やホストのディレクトリをマウントする方法、オブジェクトストレージであるAWS S3やGCSを使用する方法があります。

私は、最初設定のしやすいDockerボリュームを使用した方法やディレクトリをマウントする方法で使用していました。

しかし、この方法では適切にキャッシュを扱えていませんでした。

どういうことかというと、GitLab Runnerで同時に実行できるCIの数をひとつではなく複数として設定していたのですが、このような場合に、ひとつめのCI、ふたつめのCIのようにそれぞれのCIでキャッシュが分かれているため、例えば並列数が5の場合は、同じキャッシュが5つ別々に保存されるということです。

つまり、並列数をふたつ以上にしている場合は、キャッシュが余計に作成されて無駄があるということです。

このような問題を解決する方法として、オブジェクトストレージを使うという方法があり、今回は、このオブジェクトストレージを使う方法を採用しました。

オブジェクトストレージは、クラウドサービスとして提供されているのですが、無料でキャッシュの環境を構築したいため、ここではMinioというAWS S3互換のOSSソフトウェアを使うことにしました。

Minioは、Dockerを使うことで簡単に実行することができるので、次のようにMinioの実行をしました。

$ docker run --name gitlab-runner-minio --restart-policy unless-stopped -p 9000:9000 -v /opt/gitlab-runner-minio:/data -d minio/minio server /data

Minioを実行するとログに、MinioにアクセスするためのACCESS_KEYとSECRET_KEYがしゅつりょくされます。

次のコマンドで確認します。

$ docker logs gitlab-runner-minio

ACCESS_KEYとSECRET_KEYを/etc/gitlab-runner/config.tomlに次のように記述します。

[[runners]]
name = "runner"
url = "***"
token = "***"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
Type = "s3"
Shared = false
[runners.cache.s3]
ServerAddress = "ip_address:9000"
AccessKey = ""
SecretKey = ""
BucketName = "gitlab-runner-cache"
BucketLocation = "eu-west-1"
Insecure = true
[runners.docker]
tls_verify = false
image = "ubuntu:20.04"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
pull_policy = "if-not-present"
disable_cache = false
volumes = ["/cache"]
shm_size = 0

AccessKeySecretKeyには、先ほどMinioを実行したときのログに出力されたものを記述します。

ServerAddressには、Dockerコンテナから見たホストのIPアドレスを記述します。私の場合は、ホストのIPアドレスを固定IPアドレスとしていたため、そのIPアドレスを指定しました。

最後に、GitLab Runnerの再起動をして設定ファイルを反映させれば設定は終わりです。

さいごに

まさかDockerボリュームによるキャッシュでは、キャッシュが並列数に応じて増えてしまうということになるとは思いませんでした。