一个存储库中有多个jenkinsfile

时间:2018-03-23 10:53:35

标签: jenkins jenkins-pipeline

我们在Github存储库中有一个包含多个Jenkins文件的项目:

my-project
  app
    Jenkinsfile
  lib1
    Jenkinsfile
  lib2
    Jenkinsfile

我们创建了3个Jenkins管道,每个管道都引用了一个Jenkins文件。 enter image description here

问题:当“lib2”中有新的提交时,如何避免触发“app”和“lib1”管道?我们不希望每次提交都运行N个作业。

我已经看到问题在https://issues.jenkins-ci.org/browse/JENKINS-43749中得到了解决,但我还没有找到解决方案。

4 个答案:

答案 0 :(得分:4)

最近更新:

我后来使用以下代码段修复了此问题: 如果看到命令dir('servicelayer'),使用它移动到目录中,执行git命令以查找提交之间的差异并引发标志。这样,我已经在一个存储库中管理了3个Jenkins文件。

stage('Validation') {
steps {
        //Moving in to the directory to execute the commands
        dir('servicelayer') {
            script {
                //Using the git command to check the difference between previous successful commit. ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} is an environment variable comes with GIT Jenkins plugin
                //There is a drawback though, if it is the first time you are running this job, this variable is not available and fails the build
                //For the first time i had to use ${env.GIT_COMMIT} itself at both places to pass the build. A hack but worth it for future builds.

                def strCount = sh(returnStdout: true, script: "git diff --name-only ${env.GIT_COMMIT} ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} | grep servicelayer | wc -l").trim()
                if(strCount=="0") {
                    echo "Skipping build no files updated"
                    CONTINUE_BUILD = false
                } else {
                    echo "Changes found in the servicelayer module"
                }
            }
        }
    }

}

旧答案:

您可以通过2种方式来做到这一点:

a)通过添加“其他行为”->“轮询特定区域中的忽略提交”来配置构建作业 此行为使您可以添加不想轮询以触发构建作业的“白名单区域”或“黑名单区域”。

b)编写一个自定义的shell脚本,以验证每次提交更改的文件并验证位置。然后可以将此Shell脚本添加到您的Jenkinsfile中,无论是声明式还是脚本式,您都可以相应地调整行为。

我将建议选项a),因为它也更易于配置和维护。希望这会有所帮助。

enter image description here

答案 1 :(得分:2)

我实现了在单个存储库中具有多个管道(Jenkinsfile)。它不是hacky,但并非完全无关紧要,需要最新版本的Jenkins和更新的Lockable Resources plugin,并且可能需要在构建过程中执行其他步骤。

  • 创建一个仅“源代码管理”项目。在詹金斯 术语可以是一个Freestyle项目,只关心 保持源代码更新,并带有SCM部分和已触发的代码 配置(示例名称“ MyProjectSCM”)。就我而言,我有一个git 带有轮询计划的存储库。确保未选中“如有必要,执行并发构建”标志;

  • 在项目存储库中,提交一个或多个Jenkins管道,例如“ JenkinsfileBuild”,“ JenkinsfileRelease”。确保管道:

    1. skipDefaultCheckout部分中有options

    2. 在配置的SCM项目(“ MyProjectSCM”)上具有触发器;

    3. 在构建期间锁定SCM项目。

       pipeline {
           agent any
      
           options {
               disableConcurrentBuilds()   
               skipDefaultCheckout()
           }
      
           triggers {
               upstream(upstreamProjects: 'MyProjectSCM')
           }
      
           stages {
               stage('Build') {
                   lock('MyProjectSCM') {
                       steps {
                           echo 'Build within MyProjectSCM lock...'
                       }
                   }
               }
           }
       }
      
  • 创建管道项目,每个在存储库中提交的Jenkins文件一个。管道应具有已配置的“来自SCM的管道脚本”(在此示例中,管道可以命名为“ MyProject_Build”,已配置“ JenkinsfileBuild”),并且已选中“轻量检出”标志(实际上是默认设置):

enter image description here

“ MyProject_Build”管道中的skipDefaultCheckout指令将阻止在该工作空间中签出存储库,奇怪的是,“轻量签出”标志本身不足以阻止签出。因为“ MyProject_Build”工作空间实际上是空的,所以您必须通过环境变量或相对路径来引用构建脚本中仅SCM项目目录。 lock指令很有用,因此在实际构建项目时不会进行新的提交。

答案 2 :(得分:1)

我建议使用多分支管道插件,然后指定适当的jenkinsfile的路径。因此,您将拥有三个管道作业,一个用于应用程序,lib1和lib2。

enter image description here

答案 3 :(得分:-3)

如果所有内容都在同一个存储库下,并且在同一分支下,jenkins将在执行pull请求/提交时触发该分支中的所有作业。您可以使用multibranch pipeline,其中每个分支可以包含不同的Jenkinsfile,因此只有在创建了pull request / commit的地方才会触发那些管道作业