簡體   English   中英

GitLab CI 在另一個變量中設置一個變量

[英]GitLab CI Setting a variable within another variable

我有一個類似這樣的 CI 腳本設置,包含 3 個文件:

# file Vars
.def-vars:
    STAGING_SSH_DEST: mysite.com
    PROJECT_ROOT: myRoot
# file gitlab-ci
variables:
    extends: .def-vars
    STAGING_SSH_DEST: myrealsite.com
    PROJECT_ROOT: /myRealRoot

deploy-stage:
    extends: .deploy
    variables:
        SSH_DESTINATION: $STAGING_SSH_DEST
# file deploy
.deploy:
    variables:
        SSH_DESTINATION: mysite.com
        RSYNC_DESTINATION: $SSH_DESTINATION:$PROJECT_ROOT

我將我的文件和變量分開,以增加腳本的可重用性。

我的想法是,因為我有多個站點目的地,暫存產品,我希望能夠將 ssh 目的地傳遞給每個目的地,並讓工作自行找出 rsync。 問題是,變量擴展並沒有像我想象的那樣工作。

在部署腳本中,我添加了一個打印並得到以下內容:

$ echo $SSH_DESTINATION            # This is the variable name local to job
   myrealsite.com                  # Yep! printed the passed in value
$ echo $RSYNC_DESTINATION          # $SSH_DESTINATION:$PROJECT_ROOT
   $STAGING_SSH_DEST:/myRealRoot   # That is the name of the variable passed in

root 和 SSH_DESTINATION 打印得很好。 追加兩者時,前者似乎擴展了一次太少了。

我已經有了在腳本部分中創建 rsync 變量的想法,但我想避免這種情況,因為我希望能夠在不編輯.deploy作業的情況下覆蓋 rsync 變量。

如何做到這一點?

Gitlab CI 變量存在問題,阻止您使用extends設置正確擴展變量。 您解決此問題的選擇是:

  • before_script的幫助下使用此解決方案,發布在上述問題中。 存在一些限制,但對於簡單的東西,它工作得很好。
 before_script:
   - export VAR1="${CI_PIPELINE_ID}"
   - export VAR2="test-${VAR1}"
  • 通過.env 工件下游管道做一些准備工作。 這個更難設置,但它允許創建動態任務(和管道),例如在成功構建后產生多階段部署。

使用GitLab 15.6 (2022 年 11 月),“在另一個變量中設置一個變量”應該更容易

支持 CI/CD 變量中的特殊字符

以前,很難在 CI/CD 變量中使用$字符,因為$通常表示另一個變量的開始。
GitLab 會將其解釋為變量並嘗試對其進行擴展。

在此版本中,我們引入了variable: expand:關鍵字,它允許您將變量標記為“原始”。
原始變量可以包含任何特殊字符,並且在傳遞給 GitLab 運行程序時不會擴展。

https://about.gitlab.com/images/15_6/special_character_support.png -- 支持 CI/CD 變量中的特殊字符

請參閱文檔問題

和:

variables:expand

variables:
  VAR1: value1
  VAR2: value2 $VAR1
  VAR3:
    value: value3 $VAR1
    expand: false

    The result of VAR2 is value2 value1.
    The result of VAR3 is value3 $VAR1.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM