GitLab CI 8.17.2 でジョブが並列に実行されるときの cache の動き

8.17.2 ではデフォルトではジョブごとブランチごとに有効になっている。つまり・・・

  • 異なるジョブ同士では共有されない
  • 異なるブランチでは共有されない
  • 同じブランチの同じジョブでのみパイプラインに跨って共有される

9.0 からはデフォルトがブランチごとに変わっている(たぶん)。

.gitlab-ci.ymlcache:key を指定すればキャッシュの共有の範囲を変更できます。 例えば次のように固定値にすれば、すべてのジョブのすべてのブランチでパイプラインに跨って共有されます。

cache:
  key: xxx

のはずですが、試してみたところうまく共有されませんでした。

例えば次のようなジョブ設定だったときに、

  • build
    • build_01
    • build_02
  • test
    • test_1
    • test_2
  • deploy
    • deploy_1
    • deploy_2

build_01 -> test_1 -> deploy_1 でキャッシュが共有され、かつ、build_01 -> test_1 -> deploy_1 でキャッシュが共有されました。つまり、同じステージで並列実行されるプロセスの順序が一致するものだけが共有されています。

Gitlab CI のキャッシュは Runner のローカルで持っているので、共有されるはずのキャッシュでも Runner が異なれば共有されない(複数の AP サーバのローカルに保持されるキャッシュが共有されないイメージ)。

がしかし、上の実験では同じひとつのホストの Runner で実行しているので、すべて共有されることを期待していました。

どうやら 8.17.2 の gitlab-ci-multi-runner だと並列に実行される Runner の順序数ごとに異なる Runner と扱われて、キャッシュも別に記録されるようだった(並列数 4 なら 4 つの Runner が別々に存在するようなイメージ)。

試しに並列数 1 で試してみたところ、上記と同じ設定ですべてのジョブでキャッシュが共有されました。


最近の版だとどうなっているかは試していないので不明。同時に実行されるジョブ間で共有されないのはともかく、ステージが異なれば共有できても良さそうなものな気がするので、もしかしたら改善されているかもしれない(ChangeLog にそれっぽいものは見つからなかった)。