Runner cache does not work on Windows if CI_JOB_NAME containing colon character is used inside a key
Summary
GitLab Runner documentation says "The cache:key variable can use any of the predefined variables" but in fact if there is :
character inside CI_JOB_NAME
and you try to use it as a key cache functionality will not work on Windows at all. On Linux and macOS everything works fine. The fact is that :
is not allowed to be used inside filename on Windows but GitLab Runner tries to do that.
CI_PROJECT_PATH
has /
within and it also causes side effects. $CI_PROJECT_PATH.$CI_PROJECT_ID.$CI_COMMIT_REF_NAME.$CI_JOB_NAME
is expanded to kutelev/windows-runner-cache.8214570.master.build:bar
it causes creation of nested directories under cache
directory.
The issue is caused by the following line: https://gitlab.com/gitlab-org/gitlab-runner/blob/1403cfc3093ed66fc08fb97b66a679b1372661d1/shells/abstract.go#L181
file = path.Join(build.CacheDir, key, "cache.zip")
key
is used as it is for a file path construction.
Here is a naive way of performing a key sanitization: kutelev/gitlab-runner@d4720e9e
Steps to reproduce
Create a dummy project with the following .gitlab-ci.yml
:
stages:
- build
build:foo:
stage: build
script:
- New-Item -ItemType file -Path useless_file | Out-Null
tags:
- docker_windows
cache:
key: "$CI_PROJECT_ID.$CI_COMMIT_REF_NAME.$CI_JOB_NAME"
paths:
- useless_file
The job must be executed on Windows.
You will see following error messages inside a build log:
Checking cache for 8214570.master.build:foo...
FATAL: open ..\..\..\..\..\cache\kutelev\windows-runner-cache\8214570.master.build:foo\cache.zip: The filename, directory name, or volume label syntax is incorrect.
Failed to extract cache
...
Creating cache 8214570.master.build:foo...
useless_file: found 1 matching files
WARNING: GetFileAttributesEx ..\..\..\..\..\cache\kutelev\windows-runner-cache\8214570.master.build:foo\cache.zip: The filename, directory name, or volume label syntax is incorrect.
FATAL: open ..\..\..\..\..\cache\kutelev\windows-runner-cache\8214570.master.build:foo\archive_583029391: The filename, directory name, or volume label syntax is incorrect.
Failed to create cache
Actual behavior
GitLab Runner is not always to capable of storing/extracting cache if CI_JOB_NAME
is used inside a key.
Expected behavior
GitLab Runner must be capable of storing/extracting cache if any predefined variable (including CI_JOB_NAME
) is used inside a key.
Relevant logs and/or screenshots
Environment description
The issue is reproducible on Windows OS with the latest available version of the GitLab Runner.
Used GitLab Runner version
Version: 11.2.0
Git revision: 35e8515d
Git branch: 11-2-stable
GO version: go1.8.7
Built: 2018-08-22T15:57:57+00:00
OS/Arch: windows/amd64