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

GitLab多项目流水线跨项目获取工件失败求助

解决方案:GitLab父流水线获取触发子流水线的工件

首先修正子项目CI配置的语法错误

你的子项目CI中expire_in的缩进位置错误,它属于artifacts块的属性,正确配置如下:

stages:
  - build

build:
  image: node:latest
  stage: build
  script:
    - yarn run build
  artifacts:
    name: "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}"
    when: always
    paths:
      - $CI_PROJECT_DIR/dist/
    expire_in: 90 days  # 修正缩进,归属到artifacts下

父流水线正确配置:关联触发的子流水线工件

你之前的问题核心原因:

  • 直接依赖trigger-child任务拿不到工件,因为trigger任务本身不产出工件,它仅负责触发子流水线。
  • 使用needs:project指定ref: main时,GitLab会去找main分支的常规流水线工件,而非你刚触发的那个子流水线的工件,导致找不到。

正确的做法是:在trigger任务中传递子流水线ID给后续任务,然后通过该ID精准获取对应子流水线的工件:

trigger-child:
  stage: .pre
  trigger:
    project: another-group/another-project
    branch: main
    strategy: depend
  artifacts:
    reports:
      dotenv: variables.env  # 将子流水线ID保存为环境变量工件
  script:
    - echo "TRIGGERED_PIPELINE_ID=$TRIGGERED_PIPELINE_ID" >> variables.env

parent-job:
  stage: afterwards
  needs:
    - job: trigger-child
      artifacts: true  # 先获取trigger任务的环境变量工件
    - project: another-group/another-project
      job: build
      pipeline: $TRIGGERED_PIPELINE_ID  # 指定为当前触发的子流水线ID
      artifacts: true
  script:
    # 验证工件是否存在
    - ls -la ./dist

关键检查项

  1. 权限验证:
    • 进入子项目Settings > CI/CD > General pipelines,勾选"Allow access to this project's artifacts from other projects",开启跨项目工件访问权限。
    • 确认你在两个项目的Owner权限生效,CI runner拥有拉取跨项目工件的权限。
  2. 工件路径验证:
    • 在子项目的build任务中添加ls -la $CI_PROJECT_DIR/dist/,确认构建后该目录确实存在且有内容。
  3. 流水线状态验证:
    • 确保trigger任务使用strategy: depend,父流水线会等待子流水线完成后再执行后续任务,避免子流水线未完成就去拉取工件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:13:10