簡體   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