【问题标题】:Azure Devops - run build only in the folder that have changesAzure Devops - 仅在有更改的文件夹中运行构建
【发布时间】:2020-06-11 12:17:44
【问题描述】:

我有一些火花作业,它们是在 scala 上编写并使用 maven 构建的。 现在按照这样的路径走

/src/job1/<<build data>>
/src/job2/<<build data>>
.....

此构建数据包含代码、pom.xml、测试和其他每个作业传递给 maven 所需的想法。

我们有一个根文件夹,其中有一个构建所有代码的父 pom.xml,但我不想每次都构建所有代码。我希望能够仅测试和构建更改作业的代码。

我认为可能的唯一方法是仅在检测到更改的文件夹中运行构建测试,但如果不为每个文件夹创建一个 azure devops 构建,我似乎无法做到这一点,有什么想法吗?

TL:DR - 如何将 azure devops 中发生更改的文件夹路径传递给构建过程?

【问题讨论】:

    标签: azure maven azure-devops devops


    【解决方案1】:

    感谢您的意见。我可以用你在 git 上的输入来做到这一点,我意识到我们正在使用 gitflow 工作流,每次我们向主分支(意味着部署)提出拉取请求时,都会通过启动“Merged PR”创建提交,这样我可以比较最近的两次提交并检查发生了什么变化。

    我的表现如何:

        # This part uses this to get the latest two pull requests hashes
        $last_pr_commit=git log  --grep="^Merged PR" -n 1  --pretty=format:"%h" --abbrev=200
        $second_last_pr_commit=git log -n 1  --grep="^Merged PR"  --oneline --abbrev=200 $last_pr_commit^...HEAD~2 --pretty=format:"%h"
    
        # This get  the path of the files
        $result=git diff $last_pr_commit $second_last_pr_commit --name-only
    

    然后我只构建我感兴趣的那些。

        ForEach ($line in $($result -split "`r`n"))
        {
            # In my case I only need the two first parts of path
            $folderPath=$line.split('/')[0]+'/'+$line.split('/')[1]
            if ($line.contains('.scala')){
                # Running the tests and packaging
                mvn package $folderPath
            }
        }
    

    这是 powershell,但它可以与 bash 一起更改 for 循环。

    谢谢

    【讨论】:

      【解决方案2】:

      如何将azure devops中发生变化的文件夹路径传递给构建过程?

      我们可以添加一个 powershell 脚本来检查文件夹或路径,例如:

      $editedFiles = git diff HEAD HEAD~ --name-only
      echo "$($editedFiles.Length) files modified:"
      $editedFiles | ForEach-Object {
         echo $_
          Switch -Wildcard ($_ ) {
              '/src/job1' { 
                    Write-Output "##vso[task.setvariable variable=job1]True"
               }        
              '/src/job2' { 
                    Write-Output "##vso[task.setvariable variable=job2]True" }
          }
      }
      

      此脚本设置变量,然后在管道构建任务或构建管道中的自定义条件中引用这些变量:

      and(succeeded(), eq(variables['job1'], 'True'))
      

      您可以查看this similar 线程以了解一些详细信息。

      希望这会有所帮助。

      【讨论】:

      • 我看到了那个帖子,我的问题是我需要这个结构来处理大量的项目。其中一些正在运行大约 30-40 个作业,我不想一一配置。我相信您没有回答我的问题,但可以使用 git 来回答。谢谢
      • @LuizFernandoLobo,是的,如果你有大量的项目,这个解决方案真的不是很好。但如果你不想一一配置那些项目或作业,恐怕目前没有办法解决这个问题。
      【解决方案3】:

      您可以通过创建一个执行以下操作的脚本来解决此问题:

      • 在构建中获取变更集/提交以检查哪些文件已更改。
      • 根据文件更改,您可以定义逻辑来决定应该构建哪个文件夹、运行测试等。

      此解决方案将要求您构建所有逻辑来决定构建和测试哪些文件夹。

      【讨论】:

        猜你喜欢
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-05
        相关资源
        最近更新 更多