在Azure DevOps Server的流水线中,变量是衔接不一样任务和不通代理之间的桥梁,它可使相对松散、各自独立的任务之间相关影响并共享数据。在流水线中使用变量,能够在各任务之间相互调用关键性的数据。顾名思义,变量是一个能够在流水线中变化值。在CI/CD的执行流水线中,咱们都须要使用到各类用途的字符、数字,对象这些字符、数据的定义,咱们能够采用变量的方式实现,而不须要在代码中硬编码。系统在运行流水线的过程当中,将这些定义的变量自动替换为我须要的值。例如在线部署过程当中,咱们将用户名和密码等信息存储在变量中,这样不只让配置过程更加直观,还提升的流水线的重用性。python
在DevOps Server 的变量中,有一部分变量是系统自动设置的,咱们不能自由修改,例如生成名称、生成编号等。这些系统预先定义的变量,通常在命名格式上有固定的前缀, 例如system、build、Agent等。例如Build.DifinitionName,标识生成流水线的名称。shell
在这篇文章中,咱们主要介绍如何管理和使用用户自定义的变量,以及在不一样的代理、不一样的流水线中,咱们如何使用这些变量。bash
能够在生成流水线和发布流水线中分别定义变量。以下图,咱们在生产流水线定义变量:ui
1)在生成流水线清单中选择须要编辑流水线编码
2)选择编辑按钮命令行
3)选择变量按钮3d
4)点击添加按钮,新增变量。代理
咱们通常使用点(.)或者下划线(_)隔开变量中的单词,以便提升变量的可读性,例如user.name,login.name。日志
5)在变量的值中填写默认值。也能够参考后面的内容,在流水线执行过程当中为变量赋值。code
咱们能够在各类流水线任务中读取变量值,也能够流水线中为变量赋值。Azure DevOps Server提供了多种机制,可让用户在流水线中读取变量值:
1)在流水线读取参数。
能够将变量值做为参数的方式传输到任务脚本中,例如在命令行、python、PowerShell等中使用变量
下图是在Python脚本中读取自定义的变量
当任务执行的时候,能够在日志中看到输出的变量值
2)在流水线中设置变量值
若是在流水线中,须要按照需求更改变量值,可使用Azure DevOps Server 提供的接口来修改变量值。例如PowerShell的脚本以下
Write-Host "##vso[task.setvariable variable=login.name]zhanghongjun" Write-Host "##vso[task.setvariable variable=login.password;issecret=true]mypassword"
使用shell脚本以下:
#!/bin/bash echo "##vso[task.setvariable variable=login.name]zhanghongjun" echo "##vso[task.setvariable variable=login.password;issecret=true]mypassword"
若是须要在流水线中共享变量,可使用变量组。使用变量组存储要在多个管道中控制和可用的值。变量组在Pipelines Hub的“库”选项卡中定义和管理。建立变量组的操做以下:
有很多用户提出了这个问题,是否能够在不一样的流水线之间传递变量值,答案是不能,至少目前版本DevOps Server 2019不能。
在下面的这样一个场景中,有这样的需求:咱们使用Maven编译和打包项目代码,在部署过程使用容器Docker做为部署环境;须要建立Docker镜像时,使用Maven的POM文件中的版本号做为容器的名称,这样用户就很是方便的可以查询到镜像中部署的软件版本。为了解决这样的问题,目前咱们使用的解决方案是在编译过程当中使用脚本获取POM文件中的版本号,而后将其用来命名Maven的数据文件名称,例如company-cms-1.0.1.jar;而后在制做镜像的过程当中,分析这个名称,使用其中的版本号做为镜像名称。
微软DevOps MVP 张洪君 http://www.cnblogs.com/danzhang
--End--