【问题标题】:Pass run-time selected parameter to job without typing, GitLab CI (GUI)将运行时选择的参数传递给作业而不输入,GitLab CI (GUI)
【发布时间】:2021-09-09 16:05:29
【问题描述】:

我正在开发应用程序部署管道。

我有多个环境,应该由应用程序实例按需填充。

Desired behaviour: init_1 job triggers executor with specific parameter

  • 运行参数化作业以进行部署
  • 上述作业从用户那里获取参数
  • 用户只能从预定义列表中选择参数值
  • 用户应提供参数来启动管道

我尝试了什么:

  • (1) 我有手动触发的部署作业,我将参数设置为环境变量 [例如:ENV_NAME]。 此解决方案有效,但容易出错,并且很难正确重新运行。

  • (2) 我有一个初始化作业,它使用预设值 [例如:dev] 设置环境变量 [例如:ENV_NAME]。部署作业在初始化之后触发。 此解决方案有效,但没有实际价值。

  • (3) 我有多个初始化作业,可以设置单个环境变量,例如:ENV_NAME] 和特定值 [例如:dev、stage1、stage2]。部署作业应在初始化作业设置环境变量后触发。 此解决方案不起作用,因为 init 和 deploy 作业处于两个单独的阶段,并且在前一个阶段的所有作业完成之前,后者不会启动。

  • (3.a) 与上面相同,但这里初始化作业设置为 allow_failure。 此解决方案不起作用,因为 init 作业被完全跳过,因此部署作业没有获得所需的参数。

stages:
  - init
  - execute

init_1:
  stage: init
  rules:
    - when: manual
  script:
    - echo "INFRA_ID=pr1" >> build.env
  artifacts:
    reports:
      dotenv: build.env
  allow_failure: true

init_2:
  stage: init
  rules:
    - when: manual
  script:
    - echo "INFRA_ID=pr2" >> build.env
  artifacts:
    reports:
      dotenv: build.env
  allow_failure: true

executor:
  stage: execute
  script:
    - echo "Selected infrastructure $INFRA_ID"
  • (3.b) 与上面相同,但在 init 和 deploy 作业之间声明了依赖关系。 此解决方案不起作用,因为部署作业取决于所有初始化作业。

  • (4) 我创建了 N 个初始化流并部署。 此解决方案有效,但会导致许多重复代码。

您对我的用例有什么解决方案吗?

提前致谢

【问题讨论】:

    标签: gitlab-ci


    【解决方案1】:

    我找到了解决办法。这不是最好的,因为它需要连续两次手动批准,但它有效。

    概念

    • 在初始化阶段定义启动器作业,将预定义的值设置为环境变量(使用 artifacts.report.dotenv)
    • 定义阻塞管道的触发步骤(触发阶段)
    • 在稍后阶段定义执行器作业
    • 为手动设置初始化和触发作业
    • 将初始化作业设置为 allow_failure 以使其可选(您当时只需要一组参数)

    截图

    Pipeline in idle state

    Completed pipeline

    代码

    image: busybox:latest
    
    stages:
      - init
      - trigger
      - execute
    
    init_1:
      stage: init
      rules:
        - when: manual
          allow_failure: true
      script:
        - echo "INFRA_ID=pr1" >> build.env
      artifacts:
        reports:
          dotenv: build.env
    
    init_2:
      stage: init
      rules:
        - when: manual
          allow_failure: true
      script:
        - echo "INFRA_ID=pr2" >> build.env
      artifacts:
        reports:
          dotenv: build.env
    
    start:
      stage: trigger
      rules:
        - when: manual
      script:
        - echo "Pipeline is triggered with infra ID of $INFRA_ID"
    
    executor:
      stage: execute
      script:
        - echo "Selected infrastructure $INFRA_ID"
    
    

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2020-12-02
      • 2019-08-05
      相关资源
      最近更新 更多