【问题标题】:GitLab CI variables in job api?工作 api 中的 GitLab CI 变量?
【发布时间】:2020-03-05 13:27:32
【问题描述】:

我正在使用 REST API 在 GitLab CI 中运行手动作业。当我从 UI 开始手动作业时,我能够定义我可以在作业期间使用的自定义变量。通过 API 运行作业时如何定义它们?

找不到任何关于它的文档。或者在论坛中甚至没有一个问题。

这就是我目前的工作方式

curl -k --request POST --header "PRIVATE-TOKEN: abc" https://mygit.com/api/v4/projects/17/jobs/1956/play

我尝试添加:

--form variables[TEST]=hello

但这没有用。

编辑: 关于我在做什么的更多信息。所以我的管道有两个阶段。构建和部署。在每次提交时,我希望构建运行一次,然后我希望能够将此结果部署到多个不同的服务器。因为服务器列表是动态的并且其中有很多,所以我希望将服务器的 IP 地址作为变量提供给我的部署作业。

【问题讨论】:

    标签: gitlab-ci gitlab-ci-runner


    【解决方案1】:

    您可以启动管道并从那里设置变量,而不是启动作业。以下是来自the GitLab documentation 的如何执行此操作的示例:

    curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
    --header "Content-Type: application/json" \
    --data '{ "ref": "master", "variables": [ {"key": "VAR1", "value": "hello"}, {"key": "VAR2", "value": "world"} ] }' \
    "https://gitlab.example.com/api/v4/projects/169/pipeline"
    

    【讨论】:

    • 传奇 - 我在这上面浪费了几个小时
    【解决方案2】:

    这就是我使用它的方式,但没有找到使用 API 令牌的方式。

    curl -X POST \
                    -F token=xxxxxxxxxxxxxxxx \
                    -F "ref=some_branch" \
                    -F "variables[VAR1]=abc" \
                    -F "variables[VAR2]=cde" \
                    "https://example.gitlab.com/api/v4/projects/312/trigger/pipeline"
    

    例如-F "variables[VAR1]=abc".gitlab-ci.yml 中设置。

    only:
        variables:
          - $VAR1
    

    这个想法是创建一些手动 CI 作业并告诉开发人员他们可以通过 API 调用来运行它们,但是由于我在这里只能使用项目令牌,所以绝对不安全。

    通过以下方式运行它真的很方便 curl --request PUT --header "PRIVATE-TOKEN: &lt;your_access_token&gt;"

    【讨论】:

      【解决方案3】:

      gitlab-org/gitlab issue 2772 中记录了传递变量,但更多关于触发管道(不是作业)

      查看该语法是否有效,对于trigger variables(语法variables[xxx]=yyy):

      # gitlab-ci.yml
      build:
        script:
          - curl --request POST --form "variables[PRE_CI_PIPELINE_SOURCE]=$CI_PIPELINE_SOURCE" --form "token=$CI_JOB_TOKEN" --form ref=master http://192.168.10.3:3001/api/v4/projects/13/trigger/pipeline
      

      或者只是用于常规变量--form key=value

      curl --request POST --form "token=$CI_JOB_TOKEN" --form ref=master https://gitlab.example.com/api/v4/projects/9/trigger/pipeline
      

      【讨论】:

      • 是的,我还找到了有关如何使用变量触发新管道的文档。但是,如果我的目标是将构建工件部署到不同的服务器,那么这对我没有好处。在这种情况下,每个管道都会创建一个新的工件。这就是为什么我想用不同的参数重播作业以将相同的工件部署到不同的服务器。
      • @user1985273 好的,但是--form TEST=hello 会比--form variables[TEST]=hello 工作得更好吗?
      • "使用不同的参数重播作业以将相同的工件部署到不同的服务器" - 这合理吗?检索工件然后将其分发到您当前正在考虑使用的任何环境中重新触发作业的所需服务器不是更有意义吗?...或在 CI/CD 中包含目标服务器列表首先作为作业的一部分运行的脚本。
      • 我更愿意将部署保留为 gitlab 管道的一部分。我目前用来重新触发作业的环境只是一个基本的 ui,它具有指向 gitlab 的链接,因为 gitlabs ui 不是非常用户友好。我需要选择手动将工件部署到任何服务器。如果它们都是一项工作的一部分,那么我不能只说“将工件 x 部署到服务器 y”。
      【解决方案4】:

      截至 2021 年 1 月 25 日,此功能似乎尚不受支持。我在这里找到了一个功能请求:https://gitlab.com/gitlab-org/gitlab/-/issues/37267

      【讨论】:

        【解决方案5】:

        2022 年 3 月更新:

        在你create a trigger token 之后,在管道中创建 trigger_pipeline 步骤,像这样

        trigger_pipeline:
          tags:
          image: alpine:latest
          stage: deploy
          script:
          only:
            variables:
              - $MANUAL
        

        您可以使用它通过可以访问 API 的工具来触发管道

        curl --request POST \
          --form token=TOKEN \
          --form ref=main \
          --form "variables[MANUAL]=true" \
          "https://gitlab.example.com/api/v4/projects/123456/trigger/pipeline"
        

        或网络钩子:

        https://gitlab.example.com/api/v4/projects/123456/ref/<ref_name>/trigger/pipeline?token=<token>
        

        例如手动运行。

        【讨论】:

          猜你喜欢
          • 2021-07-04
          • 2022-12-22
          • 2018-07-25
          • 2018-12-12
          • 2019-10-21
          • 1970-01-01
          • 2019-08-07
          • 2023-03-15
          • 2020-03-11
          相关资源
          最近更新 更多