我有一个Git存储库,其中包含我想构建的代码,但我不允许在其根目录中添加Jenkinsfile
(它是Debian软件包,所以我无法向上游添加文件资源)。有没有办法将Jenkinsfile
存储在一个存储库中并让它从另一个存储库构建代码?由于我的代码库有几个分支要构建(每个Debian版本一个),这应该是一个多分支管道。在代码或Jenkinsfile
存储库中提交应触发构建。
奖金复杂性:我有几个这样的代码/打包存储库,我想为所有这些存储库重用相同的Jenkinsfile
。因此它应该以某种方式动态获取正确的Git URL以供使用。要构建的分支在所有存储库中具有相同的名称。
答案 0 :(得分:9)
简短回答是:不能使用multibranch pipeline
执行此操作。多分支管道仅设计(至少现在)以Pipeline script from SCM
样式执行特定管道,在项目的根目录中具有固定的Jenkinsfile
。
但是,您可以使用为多分支自由式项目制作的Multi-Branch Project插件。首先,您需要像使用multibranch freestyle configuration
一样定义multibranch pipeline configuration
。
选择此新项目,如下所示:
此类配置的行为与multibranch pipeline
类型完全相同,即它会为您创建一个文件夹,其中包含您的配置名称以及自动检测到的每个分支的子项目。
实施应该是小菜一碟:
SCM
存储库build-job
)并给予它是您的存储库信息,即Git URL和当前分支(您可以为此目的使用预定义变量$GIT_URL
和$GIT_BRANCH
)build-job
中,只需定义内联管道或从SCM检出的管道脚本,并在此脚本内部执行SCM检出并继续执行您需要构建的步骤。 build-job
管道内容的示例:
node() {
stage 'Checkout'
checkout scm: [$class: 'GitSCM', branches: [[name: '*/${GIT_BRANCH}']], userRemoteConfigs: [[url: '${GIT_URL}']]]
stage 'Build'
// Build steps...
}
当然,如果你的不同的多分支项目需要稍微区别对待,你也可以使用中间项目(让我们说build-project-A
,build-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 本身中,而不是在源代码控制中。