大家好,我是本期的微软MVP实验室研究员贠乾。Azure Pipeline 本身已经提供了内置变量。不同于上述方式,今天我将带来如何在 Azure DevOps Pipeline 运行时创建、使用动态临时变量,实现变量的动态自定义。接下来让我们在实验中一探究竟吧!

思路浅析

在我们分享的 Azure Terraform 系列文中有介绍到关于 Terraform 的状态文件远程存储的问题,我们在  Azure DevOps Pipeline 的 Task Job 加 azure_cli_script 执行内联脚本(该脚本帮我们创建好 Terraform 状态文件存储所需要的 Azure Resource Group、 Azure Storage Account、Azure KeyVault 等资源)。大家需要注意的是,内联脚本中有使用动态变量,该变量临时存储 Azure Storage Account 的 Account Key,如下图所示:

本篇文章,我继续带领大家分析如何在 Azure DevOps Pipeline 运行中创建使用动态临时变量,使用动态临时变量替换 Azure Pipeline 管道变量。

项目整体架构图

Pipeline 变量定义、输出

在此阶段,我们需要利用 azure_cli_script 任务,创建动态临时变量,输出参数,其中最主要的是将动态临时变量输出,Task yaml 如下所示

输出的变量用于同一个 stage,不同 job

- stage: scriptjobs:- job: azure_cli_scriptsteps: - task: AzureCLI@2displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'name: 'output_variable'inputs:azureSubscription: 'Microsoft Azure Subscription(xxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)'scriptType: 'bash'addSpnToEnvironment: truescriptLocation: 'inlineScript'inlineScript: |# create azure resource groupaz group create --location eastasia --name $(terraform_rg)
​# create azure storage accountaz storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS
​# create storage account container for tf state az storage container create --name $(storage_account_container) --account-name $(storage_account)
​# query storage key and set variableACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv)
​# create azure keyvaultaz keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false
​# set keyvault secret,secret value is ACCOUNT_KEYaz keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault)  --value $ACCOUNT_KEY
​# set secret varivale and add to environmentecho "##vso[task.setvariable variable=ACCOUNT_KEY;isOutput=true]$ACCOUNT_KEY"#echo "##vso[task.setvariable variable=ACCOUNT_KEY;issecret=true;isOutput=true]$ACCOUNT_KEY"
​- job: same_stage_echodependsOn: azure_cli_scriptvariables:ACCOUNT_KEY: $[dependencies.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]steps:- task: Bash@3displayName: 'Bash :output temporary variables in different jobs on the same stage'inputs:targetType: 'inline'script: |# echo ACCOUNT_KEYecho "ACCOUNT_KEY is $ACCOUNT_KEY"

输出变量用于不同 stage

- stage: echo_varibaledependsOn: scriptjobs:- job: different_stage_echovariables:ACCOUNT_KEY: $[stageDependencies.script.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]steps:- task: Bash@3displayName: 'Bash :output temporary variables in same jobs on the same stage'inputs:targetType: 'inline'script: |# echo ACCOUNT_KEYecho "ACCOUNT_KEY is $ACCOUNT_KEY"

以下为完整的 azure-pipelines-1.yaml

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
​
trigger:
- remote_stats
​
pool:vmImage: ubuntu-latest
​
stages:
- stage: scriptjobs:- job: azure_cli_scriptsteps: - task: AzureCLI@2displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'name: 'output_variable'inputs:azureSubscription: 'Microsoft Azure Subscription(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx)'scriptType: 'bash'addSpnToEnvironment: truescriptLocation: 'inlineScript'inlineScript: |# create azure resource groupaz group create --location eastasia --name $(terraform_rg)
​# create azure storage accountaz storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS
​# create storage account container for tf state az storage container create --name $(storage_account_container) --account-name $(storage_account)
​# query storage key and set variableACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv)
​# create azure keyvaultaz keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false
​# set keyvault secret,secret value is ACCOUNT_KEYaz keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault)  --value $ACCOUNT_KEY
​# set secret varivale and add to environmentecho "##vso[task.setvariable variable=ACCOUNT_KEY;isOutput=true]$ACCOUNT_KEY"#echo "##vso[task.setvariable variable=ACCOUNT_KEY;issecret=true;isOutput=true]$ACCOUNT_KEY"
​- job: same_stage_echodependsOn: azure_cli_scriptvariables:ACCOUNT_KEY: $[dependencies.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]steps:- task: Bash@3displayName: 'Bash :output temporary variables in different jobs on the same stage'inputs:targetType: 'inline'script: |# echo ACCOUNT_KEYecho "ACCOUNT_KEY is $ACCOUNT_KEY"
​
- stage: echo_varibaledependsOn: scriptjobs:- job: different_stage_echovariables:ACCOUNT_KEY: $[stageDependencies.script.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]steps:- task: Bash@3displayName: 'Bash :output temporary variables in same jobs on the same stage'inputs:targetType: 'inline'script: |# echo ACCOUNT_KEYecho "ACCOUNT_KEY is $ACCOUNT_KEY"
  • 重点:管道内变量与动态临时变量使用区别

  • Pipeline 管道内使用方式:$(变量名称)

  • 动态临时变量使用方式:$变量名称

配置 Pipeline 管道变量

使用 Azure CLI 创建 Azure Storage Account、Azure Key Vault 的内联脚本中使用管理内变量控制参数

变量名 变量值
terraform_rg Web_Test_TF_RG
storage_account cnbatetfstorage
storage_account_container tf-state
keyvault cnbate-terraform-kv
keyvault_sc terraform-stste-storage-key
container_key container_key

运行 Pipeline,查看配置输出

由于我们已经在 azure-pipelines-1.yaml 文件中指定了工作分支 “remote_stats”,当我们只要触发 “remote_stats” 分支的 “push” 或者 “pull_request” 动作都会触发 Azure DevOps Pipeline 的运行。

相同 stage 内的 job 输出:

不同 stage 的 job 输出:

总结

本期实验,我们学习了如何在 Azure DevOps Pipeline 运行期间创建的动态临时变量以及变量的输出,使得我们更加灵活的在任意 job 中声明自定义的动态临时变量,并将动态临时变量应用到任意的 job 中,这种方式有区别与Pipeline 管道内变量,尤其是在定义阶段和使用语法上,详细内容参考官方文档。

相关链接:

  • 在脚本中设置变量

    https://docs.microsoft.com/zh-cn/azure/devops/pipelines/process/set-variables-scripts?WT.mc_id=AZ-MVP-5004191&view=azure-devops&tabs=bash

  • github 代码地址

    https://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager

  • Terraform 在 Azure DevOps 中的使用系列https://www.cnblogs.com/AllenMaster/category/1876925.html


微软最有价值专家(MVP)

微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。29年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。

MVP 是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP 致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用 Microsoft 技术。
更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn

关注微软中国MSDN了解更多

在脚本中设置变量

动态临时变量为 Azure DevOps Pipeline 变量自定义锦上添花相关推荐

  1. Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  2. 使用Azure DevOps Pipeline实现.Net Core程序的CD

    上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI.这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD. 实现本次目标我们除了A ...

  3. 使用Azure DevOps Pipeline实现.Net Core程序的CI

    上次介绍了Azure Application Insights,实现了.net core程序的监控功能.这次让我们来看看Azure DevOps Pipeline功能.Azure DevOps Pip ...

  4. Git Flow分支策略与Azure DevOps相关功能简介

    想了很久,还是写这么一篇文章来总结一下有关分支策略和DevOps的一些内容吧.其实,DevOps相关的内容并不是我的工作范围,不过对于敏捷开发.DevOps.项目管理等等这一系列的与开发过程相关的内容 ...

  5. Linux库概念及相关编程(动态库、静态库、环境变量)

    分文件编程: 好处:分模块编程思想,功能和责任划分清楚便与调试,main函数简洁,代码易于阅读. 编程时头文件有的是使用<>这个符号括起来的,有的是" "使用的是双引号 ...

  6. 不用临时变量,交换两个变量的值

    不用临时变量,交换两个变量的值 a=a^b;     b=a^b;     a=a^b; 或者   a=a+b;     b=a-b;     a=a-b;

  7. 动态修改el-input样式;动态修改elmentUI元素样式;css变量

    场景:正常我们动态修改div元素的样式,使用:style和:class即可:但是我们想要动态修改element的组件样式时候,例如el-input字体颜色,由于el-input的样式嵌套很深,我们需要 ...

  8. kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载

    1. 前言 前前后后学习kubernetes也有一个来月了,关于kubernetes的博客也写了有十多篇.但是技术如果无法落地到实际的应用场景终归是纸上谈兵,所以就有了这一出:通过结合kubernet ...

  9. ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

    通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了.本文我会对使用Azure DevOps进行C ...

最新文章

  1. springCloud Zuul网关
  2. Linux网络服务:Samba服务与实现
  3. hexo 修改yelee文章标题字体颜色
  4. SAP Spartacus Focusdirective继承自Lockdirective,静态代码分析
  5. 律师坚称技术无罪:“钉钉打卡神器”开发者二审被改判四年
  6. 通过 Chrome Workspace 调试本地项目
  7. Springboot2 搭建 高性能Websocket服务器
  8. php html script,html script标签怎么用
  9. perl语言中的AWK之基础篇
  10. 关于某题左列定宽右列宽度自适应布局的学习
  11. vue 单页面(SPA) history模式调用微信jssdk 跳转后偶尔 “invalid signature“错误解决方案
  12. atitit.研发管理--标准化流程总结---java开发环境与项目部署环境的搭建工具包总结...
  13. 30分钟 带你浅入seajs源码
  14. win10非核心版本的计算机上
  15. mysql join 从库_Mysql实现跨库join查询
  16. 艾泰(UTT)WiFi短信验证:无线上网热点短信认证设置流程
  17. 2011年8月8日我搬到cnblog http://www.cnblogs.com/liuning8023/ (搬家的好日子啊)
  18. 用Python教你画一棵绝美碎花树~学会就能送给喜欢的人啦
  19. 关于线性回归分析的理解
  20. c语言实现按键的抖动与消除,【Verilog HDL 训练】第 09 天(按键消抖)

热门文章

  1. 计算机编程人员英语翻译,计算机编程英语怎么说,电脑中常用的英文翻译
  2. apicloud 导入通讯录获取人名与电话 拨打电话
  3. 递归算法-数字三角形
  4. 【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
  5. 算法——称重一次求出次品箱数
  6. 共情式沟通:如何让沟通具有穿透人心的力量
  7. linux block framework(1) - 块设备概念
  8. 5G工业无线路由器的PLC无线组网应用
  9. Study_microblog笔记Part 1--开始web应用
  10. 我的世界进服务器显示检查版本时间,《我的世界》国服新版本常见问题汇总 文件设置及内容讲解...