0

在我的 gitlab-ci 管道的清理阶段,我删除了测试前生成的临时 docker 标签。图像在发布阶段重新标记。删除原始标签时,重新标签也会被删除。阶段是:

build:
  script:
    - docker build [...] $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} [...]
    - docker push $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} [...]
test:
  # do some testing
publish:
  script:
    - docker pull $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}
    - docker tag $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} $CI_REGISTRY_IMAGE/<image-name>:${CI_COMMIT_REF_SLUG}
    - docker push $CI_REGISTRY_IMAGE/<image-name>:${CI_COMMIT_REF_SLUG}
cleanup:
  when: always
  script:
    - 'curl --request DELETE --header "PRIVATE-TOKEN: ${GITLAB_PAT}" "<gitlab-url>/api/v4/projects/<project-path>/registry/repositories/<repository-id>/tags/${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}"'

运行后,标签${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} ${CI_COMMIT_REF_SLUG}删除,据我所知,只有${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}应该被删除。如果清除阶段被取消,标签会按预期创建并保留。通过 ui 删除标签时会发生相同的行为。如果我在清理阶段时遗漏了与此问题相关的任何内容,请告诉我。

4

1 回答 1

0

好的,我弄清楚了问题所在。看来我遇到了这个问题。一种可能的解决方法是标记一些与您要删除的图像相同的任意图像并将其推送到旧图像上。之后,您可以删除标签而不删除重新标签:

docker pull alpine:latest
docker tag alpine:latest $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}
docker push $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}

表面上,这个问题的修复是在 12.8 的 gitlab 里程碑中,但由于我们的内部 gitlab 仍然在 11.10 上,我无法对此进行测试。

于 2020-06-24T13:14:13.220 回答