如何在GitLab流水线中调用另一个仓库的Bash脚本?
GitLab流水线调用其他项目脚本的子模块错误解决方法
这个错误的核心是流水线环境中没有提供GitLab私有仓库的认证信息,导致用HTTPS地址克隆子模块时无法通过身份验证。以下是几种可行的解决方式:
方案一:改用SSH地址配置子模块
- 本地修改项目B的子模块地址,替换为SSH格式:
git submodule set-url a git@gitlab-ss.intranet.x.com:a.git git add .gitmodules git commit -m "切换子模块地址为SSH" git push - 流水线配置SSH认证:
- 生成SSH密钥对,将公钥添加到项目A的「Settings > Repository > Deploy keys」,按需勾选「Write access allowed」。
- 将私钥添加到项目B的「Settings > CI/CD > Variables」,变量名设为
SSH_PRIVATE_KEY,类型选「File」。 - 在
.gitlab-ci.yml中配置SSH环境:stages: - prepare prepare_job: stage: prepare before_script: - eval $(ssh-agent -s) - ssh-add < "$SSH_PRIVATE_KEY" - mkdir -p ~/.ssh - echo "Host gitlab-ss.intranet.x.com" >> ~/.ssh/config - echo " StrictHostKeyChecking no" >> ~/.ssh/config script: - git submodule update --init --recursive - # 调用项目A的脚本,例如 ./a/your-script.sh
方案二:用CI_JOB_TOKEN通过HTTPS克隆子模块
GitLab流水线内置的CI_JOB_TOKEN可用于同一实例下的项目授权:
- 打开项目A的「Settings > Repository > CI/CD access for projects」,允许项目B访问(或设置为「All projects」)。
- 在项目B的
.gitlab-ci.yml中添加认证配置:stages: - prepare prepare_job: stage: prepare script: - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab-ss.intranet.x.com/".insteadOf "https://gitlab-ss.intranet.x.com/" - git submodule update --init --recursive - # 执行项目A的脚本
方案三:直接下载脚本(无需子模块)
若仅需调用单个脚本,可跳过子模块直接下载:
stages: - run-script run_script_job: stage: run-script script: - # 替换分支名和脚本路径为实际值 - curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab-ss.intranet.x.com/a/-/raw/main/your-script.sh" -o your-script.sh - chmod +x your-script.sh - ./your-script.sh
内容的提问来源于stack exchange,提问作者floriandev
相关产品推荐
相关产品推荐

