首页 文章

如何只在Jenkins多分支管道作业中构建一个目录?

提问于
浏览
9

我有一个名为multibranch-test的github repo,有两个子目录Project1,Project2 .

PS C:\Repos\multibranch-test> tree . Folder PATH listing for volume Windows Volume serial number is 2085-6D3D C:\REPOS\MULTIBRANCH-TEST ├───Project1 └───Project2

每个子目录都有一个Jenkins文件和该项目的代码 .

在Jenkins中,我有两个multibranch管道作业 - 一个用于Project1,另一个用于Project2 . 在Project1的配置中,如果在Project2的子目录中推送了提交,我不希望推送通知或轮询来构建Project1 .

所以在Project1中我配置了附加行为:

  • Advanced clone behaviours :检查浅克隆

  • Sparse checkout path 设置为Project1#

  • Polling ignores commits in certain paths

  • Included Regions: Project1 / *

  • Excluded Regions: *

  • Build Configuration :脚本路径: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'
        }
    }

3 回答

  • 1

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

    我们有一个由GitHub提交钩子触发的主Jenkins作业 . 它计算出自上次提交以来发生了哪些变化,然后触发其他特定于服务的Jenkins作业 .

    我们还有一些我们正在使用的其他约定(比如服务,目录和Jenkins作业的命名约定),这里没有指定,但希望这会帮助某人 .

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

    • Jenkins工作和相应的Jenkinsfiles为monorepo中的每个服务 .

    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作业

    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

    默认的Jenkins行为是,如果项目的repo获得提交,则会重建项目,因此repo中的提交会为两个Jenkins项目生成事件并触发两个构建 . 看看詹金斯的文档:https://jenkins.io/doc/book/pipeline/

    从詹金斯的角度来看,很难判断改变是否进入了项目1或2 - 立即可见的是“新观看回购” .

    简单的解决方案是将repo拆分为每个项目的两个单独的repos . 由于它们应该单独构建,因此不应该成为问题 .

  • 0

    您可以为整个仓库创建一个作业,查看提交带给您的更改,然后触发项目1或2或两者的相应Jenkins文件

相关问题