Jenkins multibranch管道与来自不同存储库的Jenkinsfile

时间:2016-08-19 14:19:04

标签: jenkins jenkins-pipeline

我有一个Git存储库,其中包含我想构建的代码,但我不允许在其根目录中添加Jenkinsfile(它是Debian软件包,所以我无法向上游添加文件资源)。有没有办法将Jenkinsfile存储在一个存储库中并让它从另一个存储库构建代码?由于我的代码库有几个分支要构建(每个Debian版本一个),这应该是一个多分支管道。在代码或Jenkinsfile存储库中提交应触发构建。

奖金复杂性:我有几个这样的代码/打包存储库,我想为所有这些存储库重用相同的Jenkinsfile。因此它应该以某种方式动态获取正确的Git URL以供使用。要构建的分支在所有存储库中具有相同的名称。

5 个答案:

答案 0 :(得分:9)

简短回答是:不能使用multibranch pipeline执行此操作。多分支管道仅设计(至少现在)以Pipeline script from SCM样式执行特定管道,在项目的根目录中具有固定的Jenkinsfile

但是,您可以使用为多分支自由式项目制作的Multi-Branch Project插件。首先,您需要像使用multibranch freestyle configuration一样定义multibranch pipeline configuration。 选择此新项目,如下所示:

New Freestyle multi-branch project

此类配置的行为与multibranch pipeline类型完全相同,即它会为您创建一个文件夹,其中包含您的配置名称以及自动检测到的每个分支的子项目。

实施应该是小菜一碟:

  1. 在multibranch配置中指定您的SCM存储库
  2. 调用另一个构建作为构建/后构建的一部分,就像在标准的自由式项目中一样,除了你必须调用一个参数化的工作(让我们称之为build-job)并给予它是您的存储库信息,即Git URL和当前分支(您可以为此目的使用预定义变量$GIT_URL$GIT_BRANCH
  3. build-job中,只需定义内联管道或从SCM检出的管道脚本,并在此脚本内部执行SCM检出并继续执行您需要构建的步骤。 build-job管道内容的示例:
  4. node() {
      stage 'Checkout'
      checkout scm: [$class: 'GitSCM', branches: [[name: '*/${GIT_BRANCH}']], userRemoteConfigs: [[url: '${GIT_URL}']]]
    
      stage 'Build'
      // Build steps...
    }
    

    当然,如果你的不同的多分支项目需要稍微区别对待,你也可以使用中间项目(让我们说build-project-Abuild-project-B,......)转而调用泛型build-job管道)

    此解决方案的一个主要缺点是,您只需要一个工作负责所有构建,这使得调试变得更加困难。如果成功/错误,你仍然会让你的multibranch项目变为蓝色/红色,但你必须回到调用build-job来找到构建的真正问题。

答案 1 :(得分:1)

您可以使用此插件 https://github.com/jenkinsci/pipeline-multibranch-defaults-plugin/blob/master/README.md 我们需要在jenkins上配置jenkinsfile,而不是在回购的每个分支上

答案 2 :(得分:0)

我有2.121版,您可以通过两种方式进行操作:

方法1

在多分支管道配置>构建配置>模式下>选择“自定义脚本”,然后在文件名下方放置“标记文件”,该文件名将用于标识您要为其构建的分支。

然后,在“管道”>“定义”中的下面,选择“来自SCM的管道脚本”,然后输入“ SCM”信息,以查找如何找到包含要运行的脚本的“ Jenkinsfile”。它可以在同一仓库中,您可以在其中找到创建作业的分支(如果您输入了相同的GitHub仓库的信息),但是我找不到一种方法来表明您只是对该文件使用同一分支。

方法2

与上述相同,在多分支管道配置>生成配置>模式下>选择“自定义脚本”,然后在文件名下方放置“标记文件”,该文件名将用于标识您要为其构建的分支。

然后,在“管道”>“定义”中的下面,选择“管道脚本”,并在文本框中添加一些Groovy,以加载所需的内容或运行已加载到工作区中的某些脚本。

答案 3 :(得分:0)

在我的情况下,我有一个设想方案,其中有一个基于gradle的gitlab项目,该项目也依赖于另一个基于gradle的gitlab预测(相同的仪表板,但不同的提交,不同的开发人员)。

我已经在我的Jenkinsfile文件中添加了以下几行(视情况而定)

stage('Build') { 
            steps {
                git branch: 'dev', credentialsId: 'jenkins-generated-ssh-key', url: 'git@gitlab.project.com:root/coreProject.git'
                sh './gradlew clean'  
            }                 
        }

注意:警惕句子的顺序。 如果您对如何创建jenkins-generated-ssh-key有疑问,请询问我

答案 4 :(得分:0)

我发现的最好方法是使用 Remote Jenkinsfile Provider 插件。 https://plugins.jenkins.io/remote-file/

这将在 Build Configuration>Mode 下添加一个选项“by Remote Jenkinsfile Provider plugin”,然后您可以指向 Jenkinsfile 所在的另一个存储库。我发现这是一个比 Pipeline Multibranch Defaults Plugin 更好的解决方案,后者让您将 Jenkins 文件存储在 Jenkins 本身中,而不是在源代码控制中。