1. 使用 PowerShell 脚本

在上一篇文章中我们学会了怎么使用扩展在编译前实时更改版本号。有些情况下我们希望不适用扩展,例如喜欢发明轮子,或者根本没有安装扩展的权限。这时候我们可以自己写 PowerShell 解决这个问题。

在 Pipeline 中添加一个 PowerShell 的任务,Type 选择 Inline,然后在 Script 里输入这段 PowerShell 脚本:

$ComponentPath = $Env:Build_SourcesDirectory
$VersionNumber = $Env:AssemblyVersion+"."+$Env:Build_BuildId+".0"
$ErrorActionPreference = "Stop"
Write-Output "ComponentPath""$ComponentPath""."
Write-Output "VersionNumber""$VersionNumber""."
$assemblyFiles = Get-ChildItem -Recurse -Path $ComponentPath -Include AssemblyInfo.cs | Where-Object { $_.fullname -notmatch "\\packages\\" }
$assemblyVersionRegex     = New-Object System.Text.RegularExpressions.Regex -ArgumentList '^\s*\[assembly:\s*AssemblyVersion\("[^"]*"\)\]',MultiLine
$assemblyFileVersionRegex = New-Object System.Text.RegularExpressions.Regex -ArgumentList '^\s*\[assembly:\s*AssemblyFileVersion\("[^"]*"\)\]',MultiLine
$assemblyInfoVersionRegex = New-Object System.Text.RegularExpressions.Regex -ArgumentList '^\s*\[assembly:\s*AssemblyInformationalVersion\("[^"]*"\)\]',Multiline
foreach ($file in $assemblyFiles)
{
    $content = [System.IO.File]::ReadAllText($file)
    $assemblyVersionReplacement     = [string]::Format("[assembly: AssemblyVersion(""{0}"")]",              $VersionNumber)
    $assemblyFileVersionReplacement = [string]::Format("[assembly: AssemblyFileVersion(""{0}"")]",          $VersionNumber)
    $assemblyInfoVersionReplacement = [string]::Format("[assembly: AssemblyInformationalVersion(""{0}"")]", $VersionNumber)
    $content = $assemblyVersionRegex.Replace($content, $assemblyVersionReplacement)
    $content = $assemblyFileVersionRegex.Replace($content, $assemblyFileVersionReplacement)
    $content = $assemblyInfoVersionRegex.Replace($content, $assemblyInfoVersionReplacement)
    [System.IO.File]::WriteAllText($file, $content)
    Write-Output "Updated file ""$file"" to have version ""$VersionNumber""."
}

上面这段 PowerShell 的作用是修改项目里的 AssemblyInfo.cs,将版本号改为 $Env:AssemblyVersion+"."+$Env:Build_BuildId+".0"。有了这个 Task,我们可以不再依赖扩展来实现这个功能。

需要注意的是,在 PowerShell 里使用 Azure Pipelines 的变量的格式是 $Env: + 变量名,变量名里的句号 . 要改为下划线 _,例如 $(Build.BuildId) 在 PowerShell 里的引用方式为 $Env:Build_SourcesDirectory

2. 使用任务组

下一步,为了不在每个 Pipeline 中复制粘贴这个 Task 及其中的 PowerShell 脚本,我们需要把这个 Task 做成一个公共的东西。这时候可以使用任务组 ,它可以将已在生成或发布管道中定义的一系列任务封装到可添加到生成或发布管道中的单个可重用任务,就像任何其他任务一样。不过需要注意的是 YAML 管道不支持任务组,任务组只能用在经典管道中。

创建任务组的方式如下图所示,在任务列表中选中一个或多个任务,然后在右键菜单中选中 Create task group,在弹出的对话框中输入名称,选择分类,最后点击 Create 完成创建。

创建任务组后,之前选中的任务就原地转换为新的任务组。

这个任务组的使用方式其它任务一样,在 Add tasks 里添加到 Pipeline 即可。

3. 管理任务组

在左边的菜单中选中 Task groups 进入任务组列表的页面,在列表中选中要管理的任务组进入任务组的详细页面。

Task 页中可以像在 Pipeline 中管理任务一样管理任务组的任务,也可以修改任务组的名称、分类、版本号等信息。

History 页中可以查看更改的历史记录。

References 页中可以看到任务组被引用的 Build pipelinesRelease PipelinesTask groups

4. 最后

任务组是一个很好用的功能,可惜在 YAML 管道中不能使用。有关任务组的更多内容可以参考官方文档:

Azure Pipelines 和 TFS 中的任务组

[Azure DevOps] 如何使用任务组的更多相关文章

  1. 使用ML.NET + Azure DevOps + Azure Container Instances打造机器学习生产化

    介绍 Azure DevOps,以前称为Visual Studio Team Services(VSTS),可帮助个人和组织更快地规划,协作和发布产品.其中一项值得注意的服务是Azure Pipeli ...

  2. 在Azure DevOps Server (TFS 2019) 流水线传递参数

    变量概述 在Azure DevOps Server的流水线中,变量是衔接不同任务和不通代理之间的桥梁,它可以使相对松散.各自独立的任务之间相关影响并共享数据.在流水线中使用变量,可以在各任务之间相互调 ...

  3. Azure DevOps Server:Git权限设置

    Azure DevOps Server 权限概述 在Azure DevOps Server (之前名称为TFS)中,权限是一个比较复杂的概念.从权限层级上来说,包括服务器级别.团队项目集合级别.团队项 ...

  4. 在Azure DevOps Server (TFS) 中修改团队项目名称

    概述 [团队项目]: 在Azure DevOps Server (原名TFS)中,团队项目(Team Project)是一个最基本的数据组织容器,包含了一个团队或者信息系统中的所有信息,包括源代码.文 ...

  5. 微软 Azure DevOps Server 2019 Update 1 (TFS 2019.1)

    1.概述 微软在2019年5月发布Azure DevOps Server 2019后不到2个月的时间里,就快速准备好了第一个升级包(2019 Update 1),并计划在几周后发布正式版本.也许你还没 ...

  6. Azure DevOps Server (TFS) 修改工作项附件大小限制

    1. 问题描述 当上传工作项附件时,系统提示"附件大小限制" 2.解决方案 2.1 默认设置 默认情况下,Azure DevOps Service和Team Foundation ...

  7. 如何利用Azure DevOps快速实现自动化构建、测试、打包及部署

    前两天有朋友问我,微软的Azure好用吗,适不适合国人的使用习惯,我就跟他讲了下,Azue很好用,这也是为什么微软云营收一直涨涨涨的原因,基本可以再1个小时内实现自动化构建.打包以及部署到Azure服 ...

  8. Azure Devops测试管理(上)

    因为最近测试人员合并到我这边开发组,对于如何能更好管理测试流程和测试与开发能更高效的完成任务,通俗的说如何能更敏捷,深入思考,然后就开始琢磨起TFS(也称之为VSTS/Azure Devops,因为我 ...

  9. 【Azure DevOps系列】什么是Azure DevOps

    DevOps DevOps是一种重视"软件开发人员(Dev)"和"IT运维技术人员(Ops)"之间沟通合作的文化,它促进开发和运营团队之间的协作,以自动化和可重 ...

随机推荐

  1. Hive解析Json数组超全讲解

    在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...

  2. Jenkins + Docker + ASP.NET Core自动化部署

    本来没想着要写这篇博客,但是在实操过程中,一个是被网络问题搞炸了心态(真心感觉网络能把人搞疯,别人下个包.下个镜像几秒钟搞定,我看着我的几KB小水管真是有苦说不出),另一个就是这里面坑还是有一些的,写 ...

  3. 【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法

    问题描述 在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:[Azure Developer]使用Microsoft Graph API 如 ...

  4. [知识路书]beta设计和计划

    [知识路书]beta设计和计划 一.需求再分析 根据用户反馈,是否发现之前的需求分析有偏差?为什么会出现这种偏差?beta阶段你们是否能真的分析清楚用户需求?如何做到? 根据alpha阶段的推广情况以 ...

  5. 折腾Linux内核编译

    计网提高实验.指导书给的是远古版本2.6.39.2,轻易在某hub上找到下载地址 查表 看起来Ubuntu 11.04离得最近,遂下一个镜像 懒得上google检索了,编译准备先follow这篇博客试 ...

  6. [Java] 数据分析--分类

    ID3算法 思路:分类算法的输入为训练集,输出为对数据进行分类的函数.ID3算法为分类函数生成分类树 需求:对水果训练集的一个维度(是否甜)进行预测 实现:决策树,熵函数,ID3,weka库 J48类 ...

  7. 用JIRA管理你的项目——(三)基于LDAP用户管理

    JIRA提供了基于LDAP方式的用户管理,也就是用户密码的管理交给LDAP,而JIRA只管理用户在系统中的角色. 要打开JIRA的LDAP设置,首先需要验证下你的LDAP服务是否正常! 几乎有所有的L ...

  8. SPI总线 通俗易懂讲解——(转载)

    SPI总线 MOTOROLA公司的SPI总线的基本信号线为3根传输线,即SI.SO.SCK.传输的速率由时钟信号SCK决定,SI为数据输入.SO为数据输出.采用SPI总线的系统如图8-27所示,它包含 ...

  9. 只需5分钟!一文读懂CSS布局(二) -- flex布局

    目录 简介 基本概念 容器属性 1. flex-direction 测试代码 2. flex-wrap 3. flex-flow 4. justify-content 5. align-items 6 ...

  10. GO学习-(14) Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类 ...