环境变量是实现流水线过程定制化的一种常见方法,可以在流水线的任何阶段使用。本文介绍流水线环境变量,包括内置变量、自定义变量、通用变量组,以及如何在流水线中使用变量。
环境变量来源
内置变量
云效流水线提供基本信息和代码源相关内置变量,支持定制化流程。
|
功能模块 |
环境变量名 |
说明 |
|
基本信息 |
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"。
在任务一中通过添加步骤 > 工具 > 设置变量,将环境变量提升为流水线级别变量。
默认环境
任务内环境变量传递
这种场景主要是单个任务节点内的环境变量共享,比如步骤一生成变量USER_abc=123,步骤二通过 ${USER_abc} 引用。
您可以在前序步骤中通过echo 'USER_abc=123' > .env将环境变量输出到.env中完成环境变量注入。注意:在.env文件中的环境变量需要以USER_开头。
# 步骤一:注入环境变量
echo 'USER_abc=123' > .env
# 步骤二:引用环境变量
echo $USER_abc
123
# 步骤一:写入环境变量到 .env
echo 'USER_abc=123' > .env
# 步骤二:读取环境变量
echo $USER_abc
123
任务间环境变量传递
这种场景主要是流水线内多个任务节点之间的环境变量共享,比如任务一生成变量 USER_abc=123,任务二通过 ${USER_abc} 引用。
-
您可以在任务一的步骤中通过将环境变量输出到
.env中完成环境变量注入。注意:在.env文件中的环境变量需要以USER_开头。 -
在任务一中,将环境变量设置为流水线级别的环境变量。
-
在任务二中通过 ${USER_abc} 使用该环境变量。
流水线配置两个任务节点,任务一完成变量注入和设置后,任务二即可通过 ${USER_abc} 引用该变量。
# 任务二执行日志
echo $USER_abc
123
# [Success]
指定容器环境或默认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,仅上传该变量对应的构建产物。
运行流水线时,在运行对话框中输入需要构建的模块名称即可。