环境变量是实现流水线过程定制化的一种常见方法,可以在流水线的任何阶段使用。本文介绍流水线环境变量,包括内置变量、自定义变量、通用变量组,以及如何在流水线中使用变量。
环境变量来源
内置变量
云效流水线提供基本信息和代码源相关内置变量,支持定制化流程。
|
功能模块 |
环境变量名 |
说明 |
|
基本信息 |
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 变量的运行时值。
自定义变量
除了流水线内置变量外,云效Flow还支持用户自定义流水线变量,以满足更多定制化场景。流水线内自定义变量生效范围仅限本流水线。选中流水线,点击编辑,点击变量和缓存。云效Flow支持字符串和枚举两种类型变量。
其中包含字符变量和运行选择变量两个配置区域。
字符变量
-
在流水线变量和缓存 > 字符变量处,单击 新建变量,打开新建变量弹窗。
-
输入变量名称和默认值,可以设置私密模式和运行时设置。
-
变量名称:注意环境变量名称不可使用横杠符号 - 。
-
私密模式:控制变量是否对外公开。当变量设置为私密模式后,将无法查看变量的值,相应的执行日志中也不会显示。通常适用于用户名,密码等私密信息场景。
-
运行时设置:控制变量值是否需要在流水线运行时设置。当变量设置为运行时设置后,流水线运行时需要设置变量的值。通常适用于需要动态配置流水线参数值场景。
-
-
可以添加更多变量,也可以删除变量。
-
单击添加后,需要保存流水线才可以将变量保存至流水线。保存完毕后即可按场景 使用环境变量。
运行选择变量
-
在流水线变量和缓存 > 运行选择变量处,单击 新建变量,打开新建变量弹窗。
-
输入变量名称和选项。
-
单击添加选项可以为变量取值添加多个选项。
-
选项打开默认值则该选项为该变量的默认取值。
-
-
单击添加后,需要保存流水线才可以将变量保存至流水线。保存完毕后即可按场景 使用环境变量。
-
在流水线点击运行时需要选择变量取值。
通用变量组
通用变量组是企业统一管控的环境变量,流水线可以关联使用。
-
在流水线变量和缓存 > 通用变量组处,单击 关联变量组,下拉选择变量组,单击 确定 即可将变量组关联到流水线。
-
在流水线通用变量组处可以查看流水线关联的通用变量组,可以查看变量组详情,可以解除变量组关联。保存完毕后即可按场景 使用环境变量。
使用环境变量
定义好变量后,可在流水线中通过${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]