Artifact downloads fail with certain CI_JOB_TOKEN values
## Status update 2022-07-26 (2:00 pm UTC) The root cause is an update to the github.com/urfave/cli library to v1.22.2 which was done in this [MR](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/3525/). We are working on reverting that change. We will be releasing a patched version of the runner with this library reverted to undo this regression. ## Summary <!-- Briefly summarize the bug --> Sometimes the randomly generated CI/CD job token can begin with a leading dash (e.g. `-AsdfABdagvf`). If a job token happens to be created with this leading dash and that job token is then used for downloading previous job artifacts, the download will fail with the following: ``` ERROR: Downloading artifacts from coordinator... forbidden id=JOB_ID_HERE responseStatus=403 Forbidden status=GET https://gitlab.com/api/v4/jobs/JOB_ID_HERE/artifacts: 403 Forbidden token=--id ``` It seems as if the `-` is being misinterpreted by the `artifacts-downloader` and causing the subsequent `--id` flag to be passed in as the `--token` value. This has started cropping up with the 15.2 release of the runner specifically. ## Steps to reproduce This is very hard to reproduce, as it relies on the CI/CD randomly generated job token to have this leading dash. I have been unable to reproduce this on my own, but we have at least two tickets where the jobs encountering this error do have CI_JOB_TOKEN values beginning with the `-` character. If you happen to get lucky and get a token with this value, the `.gitlab-ci.yml` below should replicate the issue. <details> <summary> .gitlab-ci.yml </summary> ```yml job: stage: test image: bash:latest script" - echo $CI_JOB_TOKEN > test.file artifacts: paths: - test.file job2: stage: deploy image: bash:latest script: - echo "" needs: - job: "job" optional: false ``` </details> ## Actual behavior The `--id` flag is passed as the token to the `artifacts-downloader` if the CI/CD job token begins with a `-`. ## Expected behavior CI/CD job tokens beginning with the `-` character are properly are passed as the token properly. ## Relevant logs and/or screenshots <!-- Paste the job logs inside of the code blocks (```) below so it would be easier to read. --> Some interesting behavior is shown when calling the `artifacts-downloader` command directly within the helper image between 15.2 and 15.1. Using 15.2's helper image `registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-7f093137` ``` bash-5.1# /usr/bin/gitlab-runner-helper artifacts-downloader --url https://gitlab.redacted.com/ --token -Abajdbajdbajbd --id 123455 WARNING: Missing build ID (--id) FATAL: Incomplete arguments ``` Using 15.1's helper image `registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-76984217` ``` bash-5.1# /usr/bin/gitlab-runner-helper artifacts-downloader --url https://gitlab.redacted.com/ --token -Abajdbajdbajbd --id 123455 ERROR: Downloading artifacts from coordinator... forbidden id=123455 responseStatus=403 Forbidden status=GET https://gitlab.redacted.com/api/v4/jobs/123455/artifacts?: 403 Forbidden token=-Abajdba FATAL: permission denied ``` ## Environment description Confirmed to be affecting Kubernetes based executors - untested on others at this time. ### Used GitLab Runner version ``` Running with gitlab-runner 15.2.0 (7f093137) ``` ## Possible fixes Add safeties for the `-` character to the `artifacts-downloader` utility.
issue