GitLab CI留存前序流水线二进制文件问题排查求助
GitLab CI跨流水线文件残留问题分析
问题现象
短时间内连续运行两次流水线时,后一次流水线会访问到前一次生成的NuGet包,导致推送失败:
- 首次流水线生成
Project_1.8.7.nupkg,正常推送至仓库 - 第二次流水线生成
Project_1.8.8.nupkg,但NuGet尝试同时推送1.8.7和1.8.8版本,因1.8.7已存在报错 - 问题非必现,预期中每个任务应使用独立Docker容器,工件完全隔离,前序文件不应被后续流水线访问
用户提供的CI配置:
build: dependencies: [] script: - dotnet pack ${PATH_TO_SLN} -c Release -o PackagesOutput -p:PackageVersion="${PACKAGE_VERSION}" artifacts: name: PackedNuget paths: - PackagesOutput/* release: stage: release image: $DOCKER_IMAGE_LINUX tags: - docker-shared variables: GIT_STRATEGY: none before_script: - dotnet nuget add source "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/nuget/index.json" --name gitlab_for_push --username gitlab-ci-token --password ${CI_JOB_TOKEN} --store-password-in-clear-text script: - dotnet nuget push "PackagesOutput/*.nupkg" --source gitlab_for_push rules: - if: $CI_COMMIT_REF_NAME == 'master'
可能原因
- 共享Runner工作目录未清理:使用
docker-shared标签的Runner如果是shell执行器,或者Docker执行器未启用清理机制,不同流水线的任务可能复用同一主机的磁盘目录,导致PackagesOutput目录残留旧文件。 - 工件依赖关联异常:
release任务未显式指定依赖,GitLab CI在短间隔触发时可能错误关联前一次流水线的工件。 - Docker镜像层残留:
$DOCKER_IMAGE_LINUX镜像中可能遗留了之前构建的PackagesOutput文件,或者构建脚本未提前清理目标目录。
解决方案
- 强制清理构建目录:在
build和release任务的脚本开头添加清理命令,确保目录初始为空:- rm -rf PackagesOutput && mkdir -p PackagesOutput - 显式指定工件依赖:在
release任务中明确依赖当前流水线的build任务,避免跨流水线关联:release: # 保留原有配置 dependencies: - build - 检查Runner配置:
- 若为Docker执行器,确保Runner配置中开启
cleanup选项(runners.docker.cleanup = true) - 若为shell执行器,添加Runner级别的工作目录清理脚本,在每次任务前重置工作区
- 若为Docker执行器,确保Runner配置中开启
- 清理镜像残留:确认
$DOCKER_IMAGE_LINUX镜像不包含PackagesOutput目录,或在before_script中清理该目录。
内容的提问来源于stack exchange,提问作者rholek
相关产品推荐
相关产品推荐

