【问题标题】:if condition variables in gitlab-ci.ymlif gitlab-ci.yml 中的条件变量
【发布时间】:2023-02-02 10:07:57
【问题描述】:

一个简单的请求,但找不到任何示例。

假设,我想设置一个环境变量,取决于分支名称。

像这样(当然,这段代码不起作用)

variables:
  rules:
    - if: '$CI_COMMIT_BRANCH != "master"'
      variables:
        env: "dev"
    - if: '$CI_COMMIT_BRANCH == "master"'
      variables:
        env: "prod"
  stackName: projectA-${env}

所以 stackName 或其他变量可以在名称中使用 ${env} 作为后缀,我也可以在作业、脚本或阶段中使用 ${env}

我该如何设置它?

【问题讨论】:

    标签: gitlab gitlab-ci gitlab-ci-runner


    【解决方案1】:

    变量envstackName可以设置在两个不同的作业中,它们根据分支以规则运行。你可以定义一个模板作业,为两种环境做同样的事情。例如,使用模板定义两个这样的作业:

    .template-job:
      script:
        - echo $STACK_NAME
    
    prod-job:
      variables:
        STACK_NAME: projectA-prod
      rules:
        - if: '$CI_COMMIT_BRANCH == "master"'
      extends: .template-job
    
    dev-job:
      variables:
        STACK_NAME: projectA-dev
      rules:
        - if: '$CI_COMMIT_BRANCH != "master"'
      extends: .template-job
    

    使用这个,你有两个作业,但它们扩展了相同的template-job,它使用变量$STACK_NAME。您当然可以将其命名为ENV 或其他名称。

    【讨论】:

    • 谢谢。但是假设,不仅一个作业需要设置这个变量,还有 10 个以上的作业,并且不仅是一个变量,而是 10 个以上的变量。我必须在每份工作中添加它们吗?我的目的,最重要的是,设置所有变量,但针对不同的环境。
    • 以及代码中“规则”的目的是什么,删除它们没有区别。
    • 此处的规则用于定义作业应在何时运行,因此该变量应取什么值。这是一种根据分支名称为不同环境设置所有变量的方法,所以是的,您必须在所有作业(环境)之间复制变量,然后才能使用它们。
    • @Bill 注意扩展。您可以在模板中定义工作流的公共部分。您还可以在此处的每个 variables 块中定义多个变量。但是,是的,定义大量条件构建步骤有点多余。但这就是答案。
    【解决方案2】:

    你可以这样使用它。

      environment:
        name: your-env-dev
      rules:
        - if: '$CI_COMMIT_REF_NAME == "master" && "your-env-dev" =~ $YOUR_INSTANCES'
    

    在 CI/CD 下的设置中设置变量值

    【讨论】:

    • 我能看懂environment的用法,但不熟悉rules的用法,能分享一下吗?
    【解决方案3】:

    大约1年后回答我的问题。这是我的解决方案,也是一个简单的解决方案。

    我参考了@Time recommended 的想法。

    gitlab pipeline's environmentsCircleCI's context 的概念类似,如果您熟悉的话。

    • 首先创建环境,例如开发、暂存、生产等
    • 创建变量但分配给不同的环境

    • 您可以设置具有相同名称但分配给不同环境的变量。

    使用时,您可以在每个任务中添加以下代码

    staging_build:
      stage: build
      environment:
        name: staging
      script:
        - echo ${AWS_ACCESS_KEY_ID}
      only:
        - staging
    
    production_build:
      stage: build
      environment:
        name: production
      script:
        - echo ${AWS_ACCESS_KEY_ID}
      only:
        - main
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      相关资源
      最近更新 更多