【问题标题】:Unable to pass variable to downstream pipeline on GitLab CI无法将变量传递到 GitLab CI 上的下游管道
【发布时间】: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


    【解决方案1】:

    您的下游项目作业需要在上游项目作业中声明 needs:

    上游项目:

    build_vars:
      stage: build
      script:
        - echo "BUILD_VERSION=hello" >> build.env
      artifacts:
        reports:
          dotenv: build.env
    
    deploy:
      stage: deploy
      trigger: my/downstream_project
    
    

    下游项目:

    test:
      stage: test
      script:
        - echo $BUILD_VERSION
      needs:
        - project: my/upstream_project
          job: build_vars
          ref: main
          artifacts: true
    

    【讨论】:

    • 我也试过这个,下游作业立即失败,甚至没有出现错误“此作业取决于其他具有过期/已删除工件的作业”。上游作业没有指定任何人工制品过期超时,看起来这个错误消息不完全正确,但我还没有找到原因。使用这种方法时是否出现此错误?
    • @OksanaVozniuk 触发上游工作的人在两个项目中都需要适当的许可。但是我能够毫无问题地使用这个完全相同的测试。
    • 有趣的是,我在这两个项目中都获得了广泛的权限,但仍在研究它,看起来根本原因在权限中的某个地方,但更深一些。无论如何,这一切都适用于 curl 调用,谢谢你的帮助
    • @sytech 也许about.gitlab.com/releases/2022/04/22/gitlab-14-10-released/… 与此相关? (适用于 GitLab 14.10+,2022 年 4 月)
    【解决方案2】:

    我能够通过使用 build.env 做到这一点

    上游项目:

    stages:
        - build
        - deploy
    
    buildinfo:
        stage: build
        script:     
            - echo var="defined in the job" >> $CI_PROJECT_DIR/build.env
        artifacts:
            reports:
                dotenv: build.env
    
    trigger:
        stage: deploy
        trigger:
            project: path/to/downstream
    

    下游项目:

    downstream:
        script: 
            - echo $var
        needs:
            - project: path/to/upstream
              ref: dev
              job: buildinfo
    

    作为奖励,您还可以通过将此块添加到 trigger 作业来传递上游项目的路径和分支:

    variables:
        UPSTREAM_REF_NAME: $CI_COMMIT_REF_NAME
        UPSTREAM_PROJECT_PATH: $CI_PROJECT_PATH
    

    然后将下游项目的needs块更改为

    needs:
        - project: UPSTREAM_PROJECT_PATH
          ref: UPSTREAM_REF_NAME
          job: buildinfo
    

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 1970-01-01
      • 2021-12-24
      • 2020-05-03
      • 2021-01-23
      • 2023-01-26
      • 2022-01-05
      • 1970-01-01
      • 2021-05-27
      相关资源
      最近更新 更多