【发布时间】:2023-01-04 06:06:14
【问题描述】:
一个多星期以来,我一直在努力在 GitLab CI 的多项目管道中的作业之间传递变量,并且遇到了很多奇怪的错误。该机制看起来非常基本,这让我发疯,如此明显的事情仍然对我不起作用,如果有人遇到类似问题 - 我将感谢您的帮助!
所以我一直在努力做到: 我在 gitlab 上有两个项目,我试图将它们链接到一个多项目管道中,作业模式如下所示: 在项目A中:
variables: BUILD_PATH:""
build:
script:
- $BUILD_PATH="some-path" #the important point here that this value sets inside the job, it's not static
bridge:
variables:
PATH: $BUILD_PATH
RUN_TYPE: test #this value is a static and it passes correctly, no issues here
trigger:
project: project-B-path
在项目 B 中:
variables:
PATH: ""
RUN_TYPE: ""
test:
script:
echo "From upstream pipeline dynamic: $PATH"
echo "From upstream pipeline static: $RUN_TYPE"
...
当我在 CI 上运行它时,我正确传递了 $RUN_TYPE 变量,并且 $PATH 变量中的值为空(即使 $BUILD_PATH 在构建作业运行期间具有正确的值)。尝试了很多方法 - 在脚本之前设置 $BUILD_PATH 值,将环境值(如 CI_JOB_ID)传递给项目 B 中的作业,根本不在项目 B 中创建此变量等。没有任何帮助,动态变量始终具有空值.
然后我尝试将动态变量 $BUILD_PATH 保存在 .env 文件中并将其发布为人工制品,以便桥接作业可以从那里读取它。我是这样做的:
build:
script:
- some code here
- echo "BUILD_VERSION=hello" >> vars.env
artifacts:
reports:
dotenv: vars.env
当我在 CI 作业上运行它时,它总是失败并出现如下错误:
Uploading artifacts...
825vars.env: found 1 matching files and directories
826WARNING: Failed to load system CertPool: crypto/x509: system root pool is not available on Windows
827WARNING: Uploading artifacts as "dotenv" to coordinator... failed id=1877748 responseStatus=500 Internal Server Error status=500 token=some-token-here
828WARNING: Retrying... context=artifacts-uploader error=invalid argument
829WARNING: Uploading artifacts as "dotenv" to coordinator... failed id=1877748 responseStatus=500 Internal Server Error status=500 token=some-token-here
830WARNING: Retrying... context=artifacts-uploader error=invalid argument
831WARNING: Uploading artifacts as "dotenv" to coordinator... failed id=1877748 responseStatus=500 Internal Server Error status=500 token=some-token-here
832FATAL: invalid argument
我也试过上传没有名字的 .env 文件,就像我在某处看到的那样
- echo "BUILD_VERSION=hello" >> .env
但同样没有运气,同样的 500 错误。我一直在研究这个错误,但到目前为止 - 它与我同在。
所以重点 - 在多项目管道中将变量传递到下游管道的方法都不适合我。如果有人遇到相同的问题或使其以不同的方式工作 - 请帮忙
更新: 以不同的方式解决了这个问题 - 使用来自项目 A 的 cUrl 触发器,例如:
- curl --request POST --form "token=$CI_JOB_TOKEN" --form ref=branchName --form "variables[PATH]=$BUILD_PATH" "https://gitlab/api/v4/projects/projectID/trigger/pipeline"
【问题讨论】:
标签: gitlab continuous-integration