将多个git仓库签出到同一Jenkins工作区中


127

使用Jenkins 1.501和Jenkins Git插件1.1.26

我有3个不同的git仓库,每个仓库都有多个项目。

现在,我需要将所有3个git仓库中的项目签出到Jenkins从属服务器的同一工作区中。我在以下代码中定义了每个git repo:源代码管理:多个SCM。但是每次签出一个回购协议时,先前的回购协议(及其关联项目)都会被删除。

我读过这个:

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

但它并没有真正的帮助。我尝试为所有存储库在本地子目录下为存储库指定相同的文件夹(可选),但结果相同。

如果使用Jenkins根本不可能做到这一点,我想可以使用一些预构建步骤/脚本来将项目移至正确的位置。不能修改项目的构建配置。

Answers:


69

使用Jenkins + Git插件,无法在一个工作空间中一次签出多个仓库。

解决方法是,您可以有多个上游作业,每个作业都签出一个存储库,然后复制到最终项目工作区(在多个级别上都是Problematic),或者您可以设置一个Shell脚本步骤,将每个需要的存储库签出。构建时的作业工作区。

以前,Multiple SCM插件可以解决此问题,但现在不建议使用。在“多个SCM插件”页面中:“用户应迁移到https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin。管道提供了一种更好的签出多个SCM的方法,并且受Jenkins支持核心开发团队。”


为什么第一种方法有问题?拆分工作似乎是一种好习惯。
CurtainDog

1
通常,这是一个好习惯,但是当您需要在同一物理位置进行多个结帐时,维护就成为一个巨大的问题。例如,如果您要创建一个分支版本,则必须克隆4个作业,然后分别更改每个作业的路径。当然,有一些插件可以帮助您解决此问题,但是仅从单个作业中签出到相对路径会更容易。然后,您可以根据需要克隆任意数量而无需更改设置。
CIGuy

1
您需要从正确答案中更改它,因为它不再相关了。
Dvir669 '16

2
管道要求您学习新的DSL,对于我们想要做的非常简单的工作(从多个存储库中检出代码)来说,这有点过多。坚持使用Multiple SCM插件,直到在Jenkins管道DSL周围出现不错的GUI。我可以报告说,它与Jenkins 2.17的运行情况很好
Burak Arslan

2
我只是在多个存储库中遇到了相同的问题。我现在正在使用Pipeline插件,即使我像@BurakArslan一样对新的DSL持怀疑态度。实际上,它还没有我想像的那么糟糕,并带有一个相当不错的代码片段生成器。在仅使用了2个小时之后,我现在实际上更喜欢这种方法,因为我最终可以将管道构建脚本与其余代码一起提交给git。

81

使用多个SCM插件:

  • 为您需要检出的每个存储库(主项目或依赖项目)创建一个不同的存储库条目。

  • 对于每个项目,在“高级”菜单(第二个“高级”菜单中,每个存储库都有两个标记为“高级”的按钮),找到“用于仓库的本地子目录(可选)”文本字段。您可以在其中将项目复制到的“工作区”目录中的子目录。您可以映射我的开发计算机的文件系统。

“第二高级菜单”不再存在,而是需要使用“添加”按钮(在“其他行为”部分上),然后选择“签出到子目录”

  • 如果您使用的是ant,则现在build.xml文件的构建目标不在工作区的根目录中,而是在子目录中,您必须在“ Invoke Ant”配置中反映出来。为此,请在“调用蚂蚁”中按“高级”,然后填写“构建文件”输入文本,包括build.xml所在子目录的名称。

希望有帮助。


3
这必须已经过时。在编写多个SCM插件时,GIT片段不包含可选的子路径。
AlexeiOst 2014年

12
在每个存储库中,都有一个名为“添加”的下拉列表。在其中,您可以找到选项“签出到子目录”,该选项执行相同的操作。
叶烨

1
我按照您的指南提供了多个SCM插件和git,但还有另一个有趣的问题。似乎不想为不同的存储库正确检出同一分支(开发)。它尝试通过哈希检出提交(仅在第一个存储库中有效)。关于如何解决这个问题的任何想法?
Lefteris 2015年

多个SCM插件的最大问题是:“提交后类型触发器当前不起作用(至少对于Subversion而言,因此,必须配置'cron'类型轮询)。”
grayaii 2015年

1
管道要求您学习新的DSL,对于我们想要做的非常简单的工作(从多个存储库中检出代码)来说,这有点过多。坚持使用Multiple SCM插件,直到在Jenkins管道DSL周围出现不错的GUI。我可以报告说它与Jenkins 2.17的运行情况很好
Burak Arslan

41

由于不建议使用多个SCM插件

使用Jenkins Pipeline,可以检出多个git repos,并在使用gradle构建之后

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

您可能要考虑使用git子模块,而不是像这样的自定义管道。


谢谢!!!该dir块是关键,我无法弄清楚,为什么我只看到了最近期的克隆我的工作的工作空间回购。
bonh,

如何在多个供应链管理中考虑“变化”的概念?仅仅是构成工作的所有回购中看到的更改的总和吗?如果可能的话,最好逐个逐项列出它们,23 changes from repo XXX, 3 changes from repo YYY或者沿这些思路更紧凑一些。
jxramos

20

我在Jenkins上成功使用了多个SCM插件和Git插件。


3
谢谢,那太好了,我能够将2个bitbucket路径放入存储库部分,现在如何告诉repo 1检出“ develop”分支和repo 2检出“ fixes”分支?我在jenkins中看到要建立部分的分支,如何在分支说明符中设置存储库名称和Refsec(“ any”为空白),以便每个人都可以签出我想要的相应分支?还是我正在做它,我应该单击显示“多个SCM”的布尔值?
pelos

@pelos您能找到解决方案吗?
Govind

目前,我们不使用yml文件,而是使用常规任务完成了两个不同的工作流程
pelos

5

根据存储库之间的关系,另一种方法是将另一个存储库(一个存储库)作为git子模块添加到其中一个存储库。git子模块用于创建对其他存储库的引用。除非您--recursive在克隆“超级项目”(正式术语)时指定了标志,否则不会克隆那些子模块存储库。

这是将子模块添加到当前项目中的命令:

git submodule add <repository URI path to clone>

我们正在使用Jenkins v1.645,而git SCM将为超级项目开箱即用地进行递归克隆。瞧,您可以在同一Jenkins作业工作区的各自目录中获得超级项目文件和所有从属(子模块)回购文件。

不能保证这是正确的方法,而不是一种方法。


5

Jenkins: 多个SCM-已弃用。GIT插件-不适用于多个存储库。

脚本/流水线作为代码-是必经之路。


2

我也有这个问题。我在其他项目上使用Trigger / call构建解决了该问题。对于每个存储库,我使用参数调用下游项目。

主要项目:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

然后,对于每个存储库,我这样调用一个下游项目:

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

下游项目:Linux-Tag-Checkout:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 

1

在一个工作区检查了在同一时间超过一个回购协议可能的詹金斯+ Git的插件(也许只有在最近的版本?)。

在“源代码管理”部分中,不要选择“ Git”,而要选择“多个SCM”并添加几个git存储库。

确保将除“添加到子目录”之外的所有动作添加为“其他行为”,并指定一个子目录。


我相信通过这种方式,您正在使用(不建议使用)Multiple SCM插件,而不是普通的Git插件。
罗伯特·

0

我们正在使用git-repo管理我们的多个GIT存储库。还有一个Jenkins Repo插件,允许将git-repo管理的全部或部分存储库签出到同一Jenkins作业工作区。


您如何完全解决此问题中提出的问题?我已经安装了您提到的插件,并了解了repo和该插件,但是我看不到如何设置Jenkins来克隆两个存储库以在一个项目中执行...
GreenAsJade

为了使用Repo,需要创建仅包含清单文件的特殊存储库。在此文件中,指定有关其他存储库的所有信息。清单文件的确切格式在git-repo项目的docs / manifest-format.txt文件中进行了描述(gerrit.googlesource.com/git-repo/+/master/docs/…)。在配置Jenkins Repo作业的一部分时-您指定“清单”存储库的位置以及(可选)“清单”文件的名称(您可能有多个)。清单中指定的所有存储库都将被克隆。
vladisld
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.