【问题标题】:Conditional build solution in Azure DevOpsAzure DevOps 中的条件生成解决方案
【发布时间】:2019-01-19 07:24:13
【问题描述】:

我正在开发一个使用多个小型项目/解决方案的大型应用程序。每个解决方案都内置在它们各自的代理中。类似于下面的截图

现在的问题是,即使更改了单个项目文件,也会编译所有项目/解决方案。

为了减少 CI 构建时间,我想在构建中添加条件表达式,仅当它们各自的源发生更改时才会构建项目。

我知道这可以通过Custom condition using variable expressions 在 Azure DevOps 中实现。但我不确定如何检查相应的源代码是否已更改

有人知道variable expression我需要在这里写什么吗?

【问题讨论】:

  • 嗯,这取决于你的条件需要是什么
  • 我的要求是检查文件夹 xx 是否有任何代码更改,如果是则构建 abc 解决方案。这个表达式怎么写?
  • 自定义条件无法实现。

标签: continuous-integration azure-devops


【解决方案1】:

好吧,我看到你正在使用 Git 存储库,你可以通过以下方式做到这一点

作为第一步,您需要确定是否修改了哪个项目/解决方案。

你可以从我的answer here找到解决方案,在这里你可以看到我使用了一个简单的powershell脚本来拉出修改后的文件,并启用相应的变量。

用于提取修改文件的示例 Powershell 脚本

$files=$(git diff HEAD HEAD~ --name-only)
$temp=$files -split ' '
$count=$temp.Length
echo "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i++)
{
  $name=$temp[$i]
  echo "this is $name file"
  if ($name -like "SubFolderA/*")
    {
      Write-Host "##vso[task.setvariable variable=MicroserviceAUpdated]True"
    }
}

【讨论】:

  • 您对具有相同场景的 TFVC 回购有任何想法吗?
  • @DhartiSutariya 这仅适用于 git,对于 TFVC,您可以查看 this commands
【解决方案2】:

你不能在有条件的情况下做到这一点。条件用于在构建中执行任务。您正在 yaml 文件中寻找构建触发器:

trigger:
  branches:
    include:
      - master
  paths:
    include:
      - path\to\app\*

只有在 `path\to\app\ 文件夹下的任何内容发生更改时才会触发此构建。这样您就可以为每个应用创建一个构建,并且可以将这些构建隔离到已更改的特定文件。

https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pipeline

【讨论】:

  • 我无法为每个应用创建构建。这会破坏 CT 和 CD 管道
  • 我不知道什么是 ct,但这让您别无选择,您可以检查当前提交并查看更改了哪些文件并据此做出决定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多