GitLab CI跨项目include配置执行脚本提示文件不存在如何解决
问题根因
GitLab CI的include指令仅会拉取引用项目的CI配置内容做合并,不会自动同步引用项目内的脚本、代码等其他文件到当前流水线工作目录。project2触发流水线时,默认工作区只会拉取project2自身的仓库代码,自然找不到存放在project1中的folder/scripts/automation.sh文件,触发路径不存在的报错。
可行解决方案
方案1:前置拉取跨项目脚本到对应路径(改动最小)
这个方案不需要修改project1的现有配置,仅调整project2的CI配置即可。
- 先配置权限:在project1的项目成员管理中,给project2的CI服务账号授予Reporter及以上的拉取权限,直接使用GitLab内置的
CI_JOB_TOKEN做鉴权即可,不需要额外生成访问令牌。 - 在project2的
.gitlab-ci.yml中给apply任务增加前置执行步骤,把需要的脚本拉取到工作区的匹配路径下,原有脚本执行逻辑不需要修改:
include: - project: 'namespace/project1' ref: main file: 'file_project1' apply: before_script: # 浅克隆project1的main分支,仅拉取最新提交减少耗时 - git clone --depth 1 --branch main https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/namespace/project1.git /tmp/p1_repo # 创建脚本预期的目录结构,复制脚本到对应路径 - mkdir -p folder/scripts - cp /tmp/p1_repo/folder/scripts/automation.sh folder/scripts/automation.sh
配置完成后,原有bash folder/scripts/automation.sh指令就能正常匹配到文件执行。
方案2:封装为可复用公共CI配置(适合多项目复用场景)
如果后续有多个项目都需要调用这个自动化脚本,可以直接在project1的CI配置里内置自拉取逻辑,其他项目引用时不需要额外加任何配置。
修改project1中的file_project1内容如下:
.apply_script_base: before_script: # 检测当前工作区是否存在目标脚本,不存在则自动拉取 - | if [ ! -f "folder/scripts/automation.sh" ]; then git clone --depth 1 --branch main https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/namespace/project1.git /tmp/p1_common mkdir -p folder/scripts cp /tmp/p1_common/folder/scripts/automation.sh folder/scripts/automation.sh fi apply: stage: apply extends: .apply_script_base script: - bash folder/scripts/automation.sh rules: - if: $CI_PIPELINE_SOURCE == "push" when: always
后续所有项目只要按原有include方式引入这个配置,就能直接运行任务,不需要额外处理路径问题。
方案3:短脚本直接内嵌到CI配置
如果automation.sh的逻辑简单、代码量小,可以直接把脚本内容写到project1的CI配置script块中,完全不依赖独立文件,include时会把执行逻辑直接同步到引用项目的流水线配置中,不存在路径匹配问题。
注意事项
- 禁止硬编码GitLab访问令牌、仓库访问地址,统一使用GitLab内置的
CI_SERVER_HOST、CI_JOB_TOKEN等预定义变量,避免凭证泄露,同时兼容自建GitLab实例场景。 - 跨项目拉取代码时务必加
--depth 1参数做浅克隆,仅拉取对应分支最新一次提交的内容,大幅降低代码拉取耗时,提升流水线运行效率。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

