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
关键检查项
- 权限验证:
- 进入子项目
Settings > CI/CD > General pipelines,勾选"Allow access to this project's artifacts from other projects",开启跨项目工件访问权限。 - 确认你在两个项目的Owner权限生效,CI runner拥有拉取跨项目工件的权限。
- 进入子项目
- 工件路径验证:
- 在子项目的
build任务中添加ls -la $CI_PROJECT_DIR/dist/,确认构建后该目录确实存在且有内容。
- 在子项目的
- 流水线状态验证:
- 确保trigger任务使用
strategy: depend,父流水线会等待子流水线完成后再执行后续任务,避免子流水线未完成就去拉取工件。
- 确保trigger任务使用
内容的提问来源于stack exchange,提问作者Pwnstar
相关产品推荐
相关产品推荐

