gitlab-runner cache key bug: cache not being created anymore in gitlab steps
Introduction
Besides auto-updating also to the most recent version of the Docker image of maven:3-jdk-8, the Gitlab runners were also always updated to the most recent version.
Again not best-practice and again I learned the hard way: builds suddenly starting to fail.
The issue and workarounds/solutions
Because suddenly indeed the docker image build of the application started to fail with this error:
Step 9/12 : ADD service1/target/*.jar app.jar
ADD failed: no source files were specified
ERROR: Job failed: exit code 1
ADD failed: no source files were specified
ERROR: Job failed: exit code 1
It turned out the service1/target directory was empty (or missing, I forgot).
Investigating some more showed that the cache produced in previous steps in Gitlab was not there anymore. The version that this started appearing was:
Running with gitlab-runner 10.1.0 (c1ecf97f)
on gitlab-runner-hosted (70e74c0e)
Running with gitlab-runner 10.1.0 (c1ecf97f)
on gitlab-runner-hosted (70e74c0e)
From older successful builds I saw that at the end of the previous step, when the cache is created, you see something like this:
Creating cache developbranch:1...
WARNING: target/: no matching files
service1/target/: found 87 matching files
service2/target/: found 33 matching files
untracked: found 200 files
Created cache
Job succeeded
WARNING: target/: no matching files
service1/target/: found 87 matching files
service2/target/: found 33 matching files
untracked: found 200 files
Created cache
Job succeeded
But those loglines were now suddenly missing! And I noticed that the gitlab-runner version changed between the last successful build and this failing one.
So I had an area to focus on: the caching didn't work anymore.
The cache definition in the gitlab-ci.yml was:
cache: key: "$CI_COMMIT_REF_NAME" paths: - target/ - service1/target/ - service2/target/ untracked: true
I suspected maybe the environment variable of the key: field being empty or something.
But when I added logging in other script steps, the $CI_COMMIT_REF_NAME variable was filled with the value 'developbranch'. So it is not empty.
Then I had an epiphany and prefixed the above environment variable with a string, making the cache key: definition look like this:
cache: key: prefix-"$CI_COMMIT_REF_NAME" paths: - target/ - service1/target/ - service2/target/ untracked: true
In the above you can see I prefixed the key with the hardcoded string "prefix-". And indeed that did it, the creating of the cache worked again and looked like this:
Creating cache prefix-developbranch:1...
WARNING: target/: no matching files
service1/target/: found 87 matching files
service2/target/: found 33 matching files
untracked: found 200 files
Created cache
Job succeeded
WARNING: target/: no matching files
service1/target/: found 87 matching files
service2/target/: found 33 matching files
untracked: found 200 files
Created cache
Job succeeded
So also here I learned (as I really already knew): don't auto-update but do that in a controlled way, so you know when to expected potentially failing builds.
No comments:
Post a Comment