繁体   English   中英

gitlab-ci.yml 中的条件变量

[英]Conditional variables in gitlab-ci.yml

根据构建来自的分支,我需要使用稍微不同的命令行参数。 特别是我想在从分支构建时上传快照关系工件,并在构建主时释放工件。

有没有办法有条件地改变变量?

我尝试使用像这样的 except/only 关键字

stages:
    - stage


variables:
    TYPE: Release


.upload_common:
    stage: stage
    tags: ["Win"]
    script: 
        - echo Uploading %TYPE%


.upload_snapshot:
    variables:
        TYPE: "Snapshot"
    except:
        - master


upload:
    extends: 
        - .upload_common
        - .upload_snapshot

不幸的是,它在构建 master 时跳过了整个上传步骤。

我在这里使用“扩展”模式的原因是我有 win 和 mac 平台,它们使用稍微不同的变量替换语法($ vs %)。 我还有一些不同的构建配置 - 调试/发布,32 位/64 位。

下面的代码确实有效,但我不得不重复发布和快照的步骤,一次启用一个。

stages:
    - stage


.upload_common:
    stage: stage
    tags: ["Win"]
    script: 
        - echo Uploading %TYPE%


.upload_snapshot:
    variables:
        TYPE: "Snapshot"
    except:
        - master

.upload_release:
    variables:
        TYPE: "Release"
    only:
        - master


upload_release:
    extends: 
        - .upload_common
        - .upload_release


upload_snapshot:
    extends: 
        - .upload_common
        - .upload_snapshot

当快照/发布配置乘以调试/发布、Mac/Win 和 32/64 位时,代码会变得更大。 我想保持最少的配置数量。

有条件地改变几个变量的能力将帮助我减少很多代码。

GitLab 13.7 中的另一个新增功能是rules:variables 这允许设置变量的一些逻辑:

job:
  variables:
    DEPLOY_VARIABLE: "default-deploy"
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      variables:                              # Override DEPLOY_VARIABLE defined
        DEPLOY_VARIABLE: "deploy-production"  # at the job level.
    - if: $CI_COMMIT_REF_NAME =~ /feature/
      variables:
        IS_A_FEATURE: "true"                  # Define a new variable.
  script:
    - echo "Run script with $DEPLOY_VARIABLE as an argument"
    - echo "Run another script if $IS_A_FEATURE exists"

不幸的是,到目前为止,YAML锚或GitLab-CI的extends似乎不允许在命令的script数组中进行组合。

我将内置变量CI_COMMIT_REF_NAME与全局或仅作业的before_script结合使用来解决类似的任务,而无需重复自己的工作。

这是我的解决方法示例,该方法解决了如何在交付或部署过程中为PROD和DEV动态地将环境变量设置为不同的值:

.provide ssh private deploy key: &provide_ssh_private_deploy_key
  before_script:
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
    - |
      if [ "$CI_COMMIT_REF_NAME" == "master" ]; then
        echo "$SSH_PRIVATE_DEPLOY_KEY_PROD" > ~/.ssh/id_rsa
        MY_DYNAMIC_VAR="we are in master (PROD)"
      else
        echo "$SSH_PRIVATE_DEPLOY_KEY_DEV" > ~/.ssh/id_rsa
        MY_DYNAMIC_VAR="we are NOT in master (DEV)"
      fi
    - chmod 600 ~/.ssh/id_rsa


deliver-via-ssh:
  stage: deliver
  <<: *provide_ssh_private_deploy_key
  script:
    - echo Stage is deliver
    - echo $MY_DYNAMIC_VAR
    - ssh ...

另外,请考虑以下解决方法以串联“脚本”命令: https : //stackoverflow.com/a/57209078/470108

希望它会有所帮助。

为其他作业准备变量的一个好方法是dotenv report artifact 不幸的是,这些变量在很多地方都不能使用,但是如果您只需要从其他作业脚本访问它们,则是这样:

# prepare environment variables for other jobs
env:
  stage: .pre
  script:
    # Set application version from GIT tag or fake it
    - echo "APPVERSION=${CI_COMMIT_TAG:-0.1-dev-$CI_COMMIT_REF_SLUG}+$CI_COMMIT_SHORT_SHA" | tee -a .env
  artifacts:
    reports:
      dotenv: .env

在此作业的脚本中,您可以有条件地准备环境值并将其写入文件,然后从中制作 dotenv 工件。 后续 - 或者更好的依赖- 作业将从那里获取脚本的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM