Azure Dev-ops管道-有条件地执行任务

时间:2019-11-05 18:33:46

标签: azure azure-devops azure-pipelines

我们有一个Azure Pipline,用于部署我们的代码。 (与BigData有关)。

我们不需要每次都部署一些任务。仅当某些文件已更改时,我们才需要这样做。所以我在想跟随。

  • 通过git命令检查特定文件在上次提交中是否已更改。
  • 如果是这样,请将特定变量设置为true否则为false
  • 现在,对于部署任务,使用custom condition并检查true的上述变量

问题 我无法执行git command,因为从没有build pipeline目录的.git复制了工件。

我试图克隆git目录,但是,凭据的配置方式无法克隆。

有另一种方法可以解决此问题。

  

仅在更改了特定文件后,才在发布管道中执行某些任务。

3 个答案:

答案 0 :(得分:0)

您可以将git repo添加为其他工件:

enter image description here

答案 1 :(得分:0)

Tl; Dr有很多方法可以将它们缝合在一起

  1. 如@Shayki所述,将git repo添加到您的发布管道工件中
  2. 使用--no-checkout选项将git repo手动添加到发布管道中
  3. 在构建中执行git操作,并在工件中包含一些标志文件
  4. 在构建中执行git操作并标记构建(首选)
  5. .git目录插入工件中

将git repo添加到您的发布管道工件中

将Git存储库作为工件添加到发布管道中,将允许部署代理访问源代码管理(包括代码文件),以便您可以在发布阶段进行查询。

手动将git repo添加到您的发布管道中

我认为Azure DevOps UI不会为您提供仅克隆.git目录的选项,这将阻止您的部署代理实际拥有源代码。但是,如果“允许脚本访问oAuth令牌”,则应该能够使用git clone --no-checkout url通过powershell手动克隆存储库。

在工件中包含一些标志文件

其他途径将是在生成工件的构建管道上进行决策,并使用工件发布一个开关文件,该文件指示发行版不应该执行预期的任务。

标记构建

执行此操作的方法可能有所不同,但我不知道。如果git中的搜索表明发行版需要做额外的工作,请使用RESTapi来add a tag进行构建。不要忘记在构建作业中设置“允许脚本使用oAuth令牌”。然后在发布管道中创建一个FullMin阶段,其中full具有额外的任务,而min没有。

enter image description here

在这些阶段中,您可以使用基于构建标记的工件过滤器功能。 enter image description here


enter image description here

如果您不想(或不能)使用单独的阶段并使用工件过滤器,则可以通过powershell get the tags使用问题中提到的自定义条件。

.git目录插入工件中

如果您完全决定在发布管道上做出决定,并且无法从那里访问存储库,则将构建中的.git目录推送到(新的?)构件中,然后然后在发布管道上使用它。 (这似乎是一个真正的技巧,我不确定它是否可以正常工作)。

答案 2 :(得分:0)

我找到了两种方法可以实现这一目标。我使用Powershell,但可以根据自己的喜好进行更改。

在构建管道中运行git diff:

$CSV_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.csv"}
$Ps1_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.ps1"}

然后运行您的条件

方法1

添加一个构建标记,然后在Release中将其设置为阶段条件。我首选的舞台控制方法。

构建

#Set Build Tag
if ($CSV_FileName) {
 Write-Host "##vso[build.addbuildtag]CSV"
}
if ($PS1_FileName) {
 Write-Host "##vso[build.addbuildtag]PS1"
}

发布

Stage Artifact Filter: Branch | Include | <TagName>

方法2

绑定变量组同时执行构建和发布管道。这样可以对每个任务的条件进行更精细的控制,但是有点笨重。确保在发行版末尾的“变量”组中重置“变量”。

构建

#Update Variable Group
if ($CSV_FileName) {
 echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
 az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>

 az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
}
if ($PS1_FileName) {
 echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
 az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>

 az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
}

发布

Task Condition: and(succeeded(), eq(variables['VariableName'], 'Value'))