環境變數是實現流水線過程定製化的一種常見方法,可以在流水線的任何階段使用。本文介紹流水線環境變數,包括內建變數、自訂變數、通用變數組,以及如何在流水線中使用變數。
環境變數來源
內建變數
雲效流水線提供基本資料和代碼源相關內建變數,支援定製化流程。
|
功能模組 |
環境變數名 |
說明 |
|
基本資料 |
PIPELINE_ID |
流水線 ID |
|
BUILD_NUMBER |
流水線的運行編號,從1開始,按自然數自增 |
|
|
PIPELINE_NAME |
流水線名稱,如:前端專案發布 |
|
|
BUILD_REMARK |
流水線運行備忘 |
|
|
BUILD_EXECUTOR |
流水線觸發人,如:張三 |
|
|
BUILD_MESSAGE |
流水線觸發資訊,如:張三·頁面手動觸發 |
|
|
PROJECT_DIR |
運行命令的工作目錄,如:/root/workspace/1084-abc_docker-08191_b0wE |
|
|
DATETIME |
目前時間,如:2017-06-22-23-26-33 |
|
|
TIMESTAMP |
目前時間戳,如:1581581273232 |
|
|
代碼源(單個) |
CI_SOURCE_NAME |
代碼源名稱 |
|
CI_COMMIT_REF_NAME |
代碼源的分支名即流水線運行分支名或者 Tag 標籤名(根據使用者運行時選擇),如:master or V1.0 |
|
|
CI_COMMIT_TITLE |
最後一次提交的提交資訊 |
|
|
CI_COMMIT_SHA |
最後一次提交的代碼版本的 commit ID:如2bfb63d779e3648c91950f82d374a25784cdabaf |
|
|
CI_COMMIT_ID |
最後一次提交的代碼版本的 8 位 commit ID(Git情境) 最後一次提交的代碼版本的 Revision(SVN情境) |
|
|
代碼源 (多個) |
CI_SOURCE_NAME_n |
第n個代碼源名稱 |
|
CI_COMMIT_REF_NAME_n |
第n個代碼源的分支名或者 Tag 標籤名(根據使用者運行時選擇),如:master or V1.0 |
|
|
CI_COMMIT_TITLE_n |
第n個代碼源的最後一次提交的提交資訊 |
|
|
CI_COMMIT_SHA_n |
第n個代碼源的最後一次提交的代碼版本的 commit ID:如2bfb63d779e3648c91950f82d374a25784cdabaf |
|
|
CI_COMMIT_ID_n |
第n個代碼源的最後一次提交的代碼版本的 8 位 commit ID |
|
|
製品源 |
CI_SOURCE_NAME |
製品源名稱 |
|
CI_SOURCE_URL |
製品源地址,如:https://packages.aliyun.com/generic/flow_generic_repo/artifacts?artifactName=Artifacts_2778530&version=2024-01-05-16-28-23 |
|
|
CI_VERSION_NAME |
製品源的版本號碼名(根據使用者運行時選擇),如:2024-01-05-16-28-23 |
多個代碼源或製品源的資訊通過變數名+數字尾碼擷取。
以下樣本中環境變數依次為:第1個源,Git類型代碼源環境變數;第2個源,製品源環境變數;第3個源,SVN類型代碼源環境變數。運行流水線後,可在運行詳情的環境變數列表中查看各變數的實際值。多個代碼源或製品源的變數按數字尾碼區分,如 CI_COMMIT_REF_NAME_1、CI_COMMIT_REF_NAME_2 等。
CI_COMMIT_REF_NAME 變數的值取決於使用者在觸發流水線時選擇的具體分支或標籤。如果使用者手動觸發流水線並選擇了某個特定分支(如 master),則 CI_COMMIT_REF_NAME 的值為 master。如果使用者選擇了某個標籤(如 V1.0),則 CI_COMMIT_REF_NAME 的值為 V1.0。運行時選擇指的是使用者在觸發流水線時可以選擇不同的分支或標籤來運行流水線,變數值會根據選擇的不同而變化。
觸發流水線運行時,可在運行對話方塊中選擇具體的分支或標籤,所選值即為 CI_COMMIT_REF_NAME 變數的運行時值。
內建變數使用限制
使用內建變數時,注意以下限制和特殊情境:
-
多代碼源變數歧義風險:當流水線配置了多個代碼源時,不要直接使用無下標的
CI_COMMIT_REF_NAME、CI_COMMIT_SHA等變數。雖然系統預設取第一個代碼源的值,但結果不可預期。應始終使用帶數字尾碼的變數(如CI_COMMIT_REF_NAME_1、CI_COMMIT_REF_NAME_2)明確指定代碼源。 -
Git 變數擷取前提:
CI_COMMIT_TITLE、CI_COMMIT_SHA、CI_COMMIT_ID等 Git 相關內建變數,必須在流水線中添加"擷取代碼"步驟後才能擷取到值。若流水線未配置代碼拉取步驟,這些變數將為空白。 -
變數處理限制:雲效流水線不支援對系統內建變數(如
CI_COMMIT_ID)直接進行字串截取、正則提取等函數處理。如需對變數值進行加工,在 Shell 指令碼中先將其賦值給自訂變數,再對自訂變數進行操作。樣本如下:# 將內建變數賦值給自訂變數後再處理 MY_SHORT_ID=$(echo $CI_COMMIT_ID | cut -c1-8) echo "MY_SHORT_ID=$MY_SHORT_ID" >> "$FLOW_ENV" -
CI_WORKSPACE 適用範圍:
CI_WORKSPACE僅在當前構建環境有效。在主機部署(ECS)情境中,該變數可能無效或指向非預期路徑,不要依賴此變數定位 ECS 上的檔案。 -
缺失變數說明:內建變數不包含"當前倉庫專案名"或"完整 Git 地址"。如需這些資訊,可通過自訂變數手動設定,或結合 Codeup 網域名稱自行拼接 Git 倉庫地址。
自訂變數
除了流水線內建變數外,雲效Flow還支援使用者自訂流水線變數,以滿足更多定製化情境。流水線內自訂變數生效範圍僅限本流水線。選中流水線,點擊編輯,點擊變數和緩衝。雲效Flow支援字串和枚舉兩種類型變數。
其中包含字元變數和運行選擇變數兩個配置地區。
字元變數
-
在流水線變數和緩衝 > 字元變數處,單擊 建立變數,開啟建立變數彈窗。
-
輸入變數名稱和預設值,可以設定私密模式和運行時設定。
-
變數名稱:注意環境變數名稱不可使用橫杠符號 - 。
-
私密模式:控制變數是否對外公開。當變數設定為私密模式後,將無法查看變數的值,相應的執行日誌中也不會顯示。通常適用於使用者名稱,密碼等私密資訊情境。
-
運行時設定:控制變數值是否需要在流水線運行時設定。當變數設定為運行時設定後,流水線運行時需要設定變數的值。通常適用於需要動態配置流水線參數值情境。
-
-
可以添加更多變數,也可以刪除變數。
-
單擊添加後,需要儲存流水線才可以將變數儲存至流水線。儲存完畢後即可按情境 使用環境變數。
運行選擇變數
-
在流水線變數和緩衝 > 運行選擇變數處,單擊 建立變數,開啟建立變數彈窗。
-
輸入變數名稱和選項。
-
單擊添加選項可以為變數取值添加多個選項。
-
選項開啟預設值則該選項為該變數的預設取值。
-
-
單擊添加後,需要儲存流水線才可以將變數儲存至流水線。儲存完畢後即可按情境 使用環境變數。
-
在流水線點擊運行時需要選擇變數取值。
自訂變數最佳實務
-
命名衝突規避:自訂變數名應避免與系統預置變數名或常見構建參數衝突。例如,
image、tag等變數名可能與鏡像構建步驟的內建參數衝突,導致構建步驟報錯或行為異常。建議為自訂變數添加業務首碼(如APP_IMAGE、DEPLOY_TAG)以避免衝突。變數命名規則:以字母開頭,僅支援大小寫字母、數字和底線(_),長度 1~64 個字元,且不允許與預置變數名重複。 -
特殊字元轉義:當變數值包含
@、#、&等特殊字元時(如使用者名稱或密碼),直接在 URL 中拼接會導致格式錯誤。例如,密碼pass@123在 URLhttps://user:pass@123@host中會被錯誤解析。建議採用以下方案之一:-
對特殊字元進行 URL 編碼(如
@轉為%40),將pass@123編碼為pass%40123。 -
使用憑據管理或將變數設為私密模式,由系統自動處理認證資訊,避免手動拼接。
-
-
動態代碼源許可權:流水線不支援自動以執行者身份登入動態代碼倉庫。如需在流水線中訪問非預配置的代碼倉庫,建議將 Git 帳號和個人存取權杖(Token)配置為私密變數,在指令碼中通過變數引用完成認證;或使用流水線代碼源配置方式擷取代碼許可權。
-
YAML 變數轉義:在
kubectl apply等情境中,YAML 檔案中的${}文法會被流水線引擎誤識別為流水線變數並進行替換。解決方案:-
在流水線步驟配置中勾選變數校正選項,禁用自動變數解析。
-
使用轉義文法
$${變數名}保留原始字串。例如,YAML 中需要保留${2}時,在流水線配置中寫為$${2}。
-
通用變數組
通用變數組是企業統一管控的環境變數,流水線可以關聯使用。
-
在流水線變數和緩衝 > 通用變數組處,單擊 關聯變數組,下拉選擇變數組,單擊 確定 即可將變數組關聯到流水線。
-
在流水線通用變數組處可以查看流水線關聯的通用變數組,可以查看變數組詳情,可以解除變數組關聯。儲存完畢後即可按情境 使用環境變數。
使用環境變數
定義好變數後,可在流水線中通過${XXX}引用。變數生效邏輯如下:
-
變數優先順序:步驟輸出變數 > 流水線運行時輸入變數 > 流水線變數 > 通用變數組。
-
同一流水線關聯多個通用變數組,後關聯的變數組取值為準。
以下舉幾個典型的使用環境變數情境,如執行命令、主機部署、鏡像構建參數、設定檔參數、環境變數傳遞等使用環境變數情境。
執行命令使用變數
將設定檔a.conf中的 key 的參數值,從123更改為變數名稱為abc的環境變數值。
在Shell命令步驟中,通過 sed -i "s/key=123/key=${abc}/g" a.conf 命令將設定檔中的參數值替換為環境變數值。
$ cat a.conf
key=123
$ sed -i "s/key=123/key=${abc}/g" a.conf
$ cat a.conf
key=abc_value

在流水線變數和緩衝中,將變數 abc 的預設值設定為 abc_value。
主機部署使用變數
可以在部署指令碼中直接通過${XXX}引用環境變數控制主機部署邏輯。運行流水線後,在主機部署步驟的日誌中查看。運行流水線後,可在主機部署步驟的日誌中查看環境變數的引用結果,確認變數值已正確傳遞。
鏡像構建參數使用變數
鏡像構建時如需使用流水線環境變數作為構建參數,則可按照以下方式進行配置。
-
在鏡像構建步驟中使用指定容器環境,在構建參數中添加自訂參數,通過
${XXX}形式將環境變數賦值給構建參數。構建參數會以--build-arg的形式傳遞到build命令的參數中。
在鏡像構建步驟的構建參數中,添加自訂參數如 abc=${abc},該參數將以 --build-arg 形式傳遞到 Docker build 命令中。

-
在 Dockerfile 中,通過
ARG argName引用變數。
FROM <base-image>
ARG argName
RUN echo $argName
設定檔參數使用變數
如果您的設定檔中某個參數,需要通過環境變數進行修改,例如:程式碼程式庫設定檔a.conf中有參數username,希望用流水線的環境變數進行替換,則可按照以下方式進行配置。
-
修改設定檔
a.conf中內容username = ${abc}。 -
將
abc的參數值配置在流水線的環境變數中,預設值設定為my_name_is_hanmeimei。 -
在流水線中新增工作,在工具中找到並添加替換檔案中的環境變數 步驟,填寫設定檔的源檔案路徑。目標檔案路徑非必填(如果填寫了目標檔案路徑,則會產生一個新的設定檔;不填寫則直接修改原檔案)。
此處源檔案路徑配置為 a.conf,目標檔案路徑配置為 b.conf。
-
查看修改效果如下:
a.conf中的username被修改為b.conf中的my_name_is_hanmeimei。注意:因為 Flow 流水線同一個任務才會共用工作區,因此修改設定檔變數步驟需要和您後續使用設定檔的步驟放在該流水線的同一個任務中。
環境變數傳遞
在流水線配置頁定義的環境變數為預置的固定環境變數,在流水線實際運行過程中,會出現以流水線運行時的輸出定義的環境變數,並將其傳遞給後續的步驟或任務中使用的情境。對應情境有以下兩種:
-
任務內環境變數傳遞:步驟一產生自訂環境變數 -> 步驟二使用。
-
任務間環境變數傳遞:任務一產生環境變數 -> 任務二使用。
值得注意的是,在使用不同的構建環境時需要使用不同的文法。不同構建環境的環境變數注入文法如下:預設環境使用 echo 'USER_abc=123' > .env(變數需以 USER_ 開頭);指定容器環境或預設VM環境使用 echo "yaojia_Test=myParam" >> "$FLOW_ENV"。

在任務一中通過添加步驟 > 工具 > 設定變數,將環境變數提升為流水線層級變數。
指定容器環境或預設VM環境
任務內環境變數傳遞
這種情境主要是單個任務節點內的環境變數共用,比如步驟一產生變數 yaojia_Test=myParam,步驟二通過 ${yaojia_Test} 引用。
您可以在前序步驟中通過echo "yaojia_Test=myParam" >> "$FLOW_ENV"將環境變數輸出到$FLOW_ENV中完成環境變數注入。
# 步驟二執行日誌
echo $yaojia_Test
myParam
# [Success]
任務間環境變數傳遞
這種情境主要是流水線內多個任務節點的環境變數共用,比如任務一產生變數 yaojia_Test=myParam,任務二通過 ${yaojia_Test} 引用。
-
您可以在任務一的步驟中通過將環境變數輸出到
$FLOW_ENV中完成環境變數注入。 -
在任務一中,將環境變數設定為流水線層級的環境變數。
-
在任務二中通過 ${yaojia_Test} 使用該環境變數。
任務一完成變數注入和提升後,任務二即可通過 ${yaojia_Test} 引用。
# 任務二執行日誌
echo $yaojia_Test
myParam
# [Success]
環境變數傳遞注意事項
-
寫入模式防覆蓋:向
.env或$FLOW_ENV寫入變數時,必須使用追加模式(>>)。如果誤用覆蓋模式(>),後寫入的變數會覆蓋前面已寫入的所有變數,導致變數丟失。# 正確:追加模式寫入多個變數 echo "VAR_A=value_a" >> "$FLOW_ENV" echo "VAR_B=value_b" >> "$FLOW_ENV" # 錯誤:覆蓋模式會導致 VAR_A 丟失 echo "VAR_A=value_a" > "$FLOW_ENV" echo "VAR_B=value_b" > "$FLOW_ENV" -
同步驟讀取限制:通過
echo寫入.env或$FLOW_ENV的環境變數,在當前步驟內無法立即通過$KEY讀取。變數在當前步驟結束後才會載入到流水線上下文中。如需驗證變數是否寫入成功,在後續步驟中讀取驗證。 -
K8s 發布傳參方案:在 Shell 指令碼中定義的變數,在後續的 Kubernetes 發布步驟中可能擷取不到或取到預設值。解決方案:在 Shell 步驟後增加設定變數步驟,將需要傳遞的變數顯式賦值給新的變數名,供 K8s 發布步驟引用。
-
動態提取版本號碼樣本:以下樣本示範如何從構建產物(如
pom.xml)中動態提取版本號碼並傳遞給後續步驟:# 從 pom.xml 提取版本號碼並寫入環境變數 VERSION=$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/') echo "APP_VERSION=$VERSION" >> "$FLOW_ENV" # 後續 Docker 構建步驟可通過 ${APP_VERSION} 引用該版本號碼 -
變數設定報錯排查:如果在指定容器環境中設定變數不生效或報錯,檢查以下幾點:
-
是否已正確添加設定變數步驟。
-
寫入文法是否符合當前環境規範(預設環境使用
.env,指定容器環境或預設VM環境使用$FLOW_ENV)。 -
變數名是否符合命名規則(以字母開頭,僅支援大小寫字母、數字和底線)。
-
常見問題
如何通過環境變數實現多環境差異化部署或動態選擇構建目標?
多環境差異化部署
可以通過為不同階段(開發、測試、生產)配置獨立的流水線,並在各流水線中設定不同的自訂變數來實現差異化部署。例如:
-
開發環境流水線:設定
DEPLOY_ENV=dev、CONFIG_PATH=/config/dev。 -
測試環境流水線:設定
DEPLOY_ENV=test、CONFIG_PATH=/config/test。 -
生產環境流水線:設定
DEPLOY_ENV=prod、CONFIG_PATH=/config/prod。
在部署指令碼中通過 ${DEPLOY_ENV} 和 ${CONFIG_PATH} 引用對應環境的配置,實現同一套代碼在不同環境的差異化部署。
動態選擇構建目標
流水線不支援在介面直接選擇構建特定 Jar 包或服務。變通方案為:
-
在流水線中添加運行時設定類型的自訂變數(如
BUILD_MODULE),設定為運行時輸入。 -
在構建命令中通過變數動態指定服務類別目錄路徑,例如
mvn -pl ${BUILD_MODULE} -am package。 -
配置製品上傳路徑為
${BUILD_MODULE}/target/*.jar,僅上傳該變數對應的構建產物。
運行流水線時,在運行對話方塊中輸入需要構建的模組名稱即可。