GitLab项目重命名后CI_REGISTRY_IMAGE仍用旧名致认证失败
问题还原
项目从old_name重命名为new_name,并通过Settings->General->Advanced->Change Path修改了路径,容器仓库推送命令已显示新路径docker push registry.gitlab.com/path/to/project/new_name,但流水线中CI_REGISTRY_IMAGE变量仍返回旧路径registry.gitlab.com/path/to/project/old_name,执行Kaniko命令时触发以下未授权错误:
检查推送权限出错——请确认输入的标签名称正确,且已完成正确认证,然后重试:检查"registry.gitlab.com/path/to/project/old_name/main:some_git_hash"的推送权限时出错:POST https://registry.gitlab.com/v2/path/to/project/old_name/main/blobs/uploads/: 未授权:需要认证;[map[Action:pull Class: Name:path/to/project/old_name/main ProjectPath: Type:repository] map[Action:push Class: Name:path/to/project/old_name/main ProjectPath: Type:repository]]
流水线执行命令:
/kaniko/executor --context "${CI_PROJECT_DIR}" --build-arg "NODE_VERSION=18.15.0" --build-arg "NPM_TOKEN=${NPM_TOKEN}" --destination "${CI_REGISTRY_IMAGE}/$(basename ${CI_COMMIT_BRANCH}):$CI_COMMIT_SHA" --destination "${CI_REGISTRY_IMAGE}/$(basename ${CI_COMMIT_BRANCH}):latest"
核心原因
GitLab预定义变量CI_REGISTRY_IMAGE与项目路径强绑定,项目重命名或路径修改后,该变量不会实时自动同步更新,清理Runner缓存无法解决此问题,因为问题根源在GitLab项目元数据或CI变量配置层面。
解决步骤
手动同步容器仓库配置
进入项目Settings > Packages & Registries > Container Registry页面,确认仓库列表已更新为新路径。若旧路径仓库仍存在,删除旧仓库(确认无留存需求后操作),再重新触发流水线。自定义变量覆盖预定义值
在项目Settings > CI/CD > Variables中添加自定义变量CI_REGISTRY_IMAGE,值设为新仓库路径registry.gitlab.com/path/to/project/new_name。自定义优先级高于GitLab预定义变量,可强制流水线使用新路径。确认项目路径修改生效
回到Settings > General > Advanced页面,检查路径修改操作是否已完全生效,无待处理的路径变更请求。若有,重新提交修改并等待5-10分钟让GitLab完成元数据同步。重置自托管Runner(若使用)
若用的是自托管Runner,停止Runner服务,删除其缓存目录(通常为/etc/gitlab-runner/cache),重新注册Runner后启动服务,清除Runner缓存的旧项目信息。临时硬编码路径验证
直接修改Kaniko命令,用新路径替换CI_REGISTRY_IMAGE,快速验证推送是否正常:/kaniko/executor --context "${CI_PROJECT_DIR}" --build-arg "NODE_VERSION=18.15.0" --build-arg "NPM_TOKEN=${NPM_TOKEN}" --destination "registry.gitlab.com/path/to/project/new_name/$(basename ${CI_COMMIT_BRANCH}):$CI_COMMIT_SHA" --destination "registry.gitlab.com/path/to/project/new_name/$(basename ${CI_COMMIT_BRANCH}):latest"
验证方式
触发新流水线,查看日志中CI_REGISTRY_IMAGE的输出值是否为新路径,同时确认Kaniko推送镜像时不再出现UNAUTHORIZED错误。
内容的提问来源于stack exchange,提问作者LeoVen

