You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

可能原因

  1. 共享Runner工作目录未清理:使用docker-shared标签的Runner如果是shell执行器,或者Docker执行器未启用清理机制,不同流水线的任务可能复用同一主机的磁盘目录,导致PackagesOutput目录残留旧文件。
  2. 工件依赖关联异常:release任务未显式指定依赖,GitLab CI在短间隔触发时可能错误关联前一次流水线的工件。
  3. Docker镜像层残留:$DOCKER_IMAGE_LINUX镜像中可能遗留了之前构建的PackagesOutput文件,或者构建脚本未提前清理目标目录。

解决方案

  1. 强制清理构建目录:在build和release任务的脚本开头添加清理命令,确保目录初始为空:
    - rm -rf PackagesOutput && mkdir -p PackagesOutput
    
  2. 显式指定工件依赖:在release任务中明确依赖当前流水线的build任务,避免跨流水线关联:
    release:
      # 保留原有配置
      dependencies:
        - build
    
  3. 检查Runner配置:
    • 若为Docker执行器,确保Runner配置中开启cleanup选项(runners.docker.cleanup = true)
    • 若为shell执行器,添加Runner级别的工作目录清理脚本,在每次任务前重置工作区
  4. 清理镜像残留:确认$DOCKER_IMAGE_LINUX镜像不包含PackagesOutput目录,或在before_script中清理该目录。

内容的提问来源于stack exchange,提问作者rholek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:37:28