我有一个叫做multibranch-test的github存储库,带有两个子目录Project1,Project2。
PS C:\Repos\multibranch-test> tree .Folder PATH listing for volume WindowsVolume serial number is 2085-6D3DC:\REPOS\MULTIBRANCH-TEST├───Project1└───Project2
每个子目录都有一个Jenkinsfile和该项目的代码。

在 Jenkins ,我有两个多分支管道工作-一个用于Project1,一个用于Project2。在Project1的配置中,如果在Project2的子目录中推送了提交,则我不希望通过推送通知或轮询来构建Project1。

因此,在Project1中,我配置了其他行为:

  • 高级克隆行为:检查浅克隆
  • 稀疏结帐路径设置为Project1#
  • 轮询将忽略某些路径中的提交
  • 包含的区域: Project1/*
  • 排除地区: *
  • 构建配置:脚本路径:Project1/Jenkinsfile

  • 发生的事情是,如果我将提交推送到子目录Project2中的master,则将同时生成Project1和Project2作业。我只想构建Project2。有人可以指出我做错了什么吗?

    两个项目的Jenkinsfiles相似,如下所示:
    #!groovy
    node  {
        stage ('checkout') {
            checkout scm
        }
    
        stage ('build') {
            dir ('Project1') {
                bat 'powershell -Command gci'
                bat 'powershell -Command gci env:'
                bat 'powershell -File .\\Project1.ps1'
            }
        }
    

    最佳答案

    这对我们来说是一个很大的麻烦,但是我们能够通过一些变通办法解决它。

    我们有一个由GitHub提交钩子(Hook)触发的Jenkins主工作。它找出自上一次提交以来发生了什么变化,然后触发其他特定于服务的Jenkins作业。

    我们还使用了一些其他约定(例如,服务,目录和Jenkins作业的命名约定),但希望能对您有所帮助。

    以下是解决方案中每个组件的分割:

  • Jenkins作业和monorepo中每个服务的相应Jenkinsfiles。
  • C:\REPOS\MULTIBRANCH-TEST\Project1\Jenkinsfile(您的构建逻辑在这里)C:\REPOS\MULTIBRANCH-TEST\Project2\Jenkinsfile(您的构建逻辑在这里)
  • 一个shell脚本,获取自上次提交以来更改的列表(从this blog post改编)。
  • C:\REPOS\MULTIBRANCH-TEST\change-sets.sh
        #!/usr/bin/env bash
    
        changeSets=(`git diff-tree --name-status HEAD`)
        for(( i=0; i<${#changeSets[@]}; i++))
        do
          if [ ${changeSets[$i]} == "M" ]
          then
            echo ${changeSets[$i+1]}
          fi
        done
    
  • 一个基于GitHub的Jenkins作业提交钩子(Hook)
  • C:\REPOS\MULTIBRANCH-TEST\Jenkinsfile
        #!/usr/bin/env groovy
    
        pipeline {
            agent any
    
            stages {
    
                stage('Define Services to Build') {
                    steps {
                        script {
    
                            def SERVICES_TO_BUILD = sh script:"./change-sets.sh", returnStdout: true
                            SERVICES_TO_BUILD.split("\n").each {
                                echo "Triggering build for ${it}"
                                try {
                                    build job: "${it}", propagate: false, wait: false
                                } catch (ex) {
                                    echo "Failed to trigger build for ${it}: ${ex.message}"
                                }
    
                            }
                        }
                    }
                }
            }
        }
    

    10-06 16:13