将多个git repos签出到同一个Jenkins工作区

u12*_*123 116 git jenkins

使用Jenkins 1.501和Jenkins Git插件1.1.26

我有3个不同的git repos,每个都有多个项目.

现在我需要将3 git repos中的所有项目签出到Jenkins slave上的相同工作区.我已经定义了每个git repo:源代码管理:多个SCM.但每次签出回购时,前一个回购(及其相关项目)都会被删除.

我读过这个:

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

但它并没有真正帮助.我试图在所有repos的repo(可选)的Local子目录下指定相同的文件夹,但它给出了相同的结果.

如果使用Jenkins根本不可能,我猜一些预构建步骤/脚本可以用来将项目移动到正确的位置.它不是修改项目的构建配置的选项.

GaR*_*eTa 78

使用多个SCM插件:

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

  • 对于每个项目,在"高级"菜单(第二个"高级"菜单中,每个存储库有两个标记为"高级"的按钮),找到"repo(可选)的本地子目录"文本字段.您可以在"workspace"目录中指定要将项目复制到的子目录.您可以映射我的开发计算机的文件系统.

"第二个高级菜单"不再存在,而是需要做的是使用"添加"按钮(在"附加行为"部分),然后选择"签出到子目录"

  • 如果您正在使用ant,现在build.xml文件的构建目标不在工作区的根目录中但在子目录中,则必须在"Invoke Ant"配置中反映出来.为此,在"调用ant"中,按"高级"并填写"构建文件"输入文本,包括build.xml所在子目录的名称.

希望有所帮助.

  • 在每个存储库中都有一个名为"添加"的下拉列表.在其中,您可以找到"Checkout to a sub-directory"选项,该选项执行相同的操作. (10认同)
  • 这必须过时.在编写多个SCM插件时,GIT代码段不包含可选的子路径. (3认同)

CIG*_*Guy 64

使用Jenkins + Git插件无法在单个工作区中一次检出多个repo.

作为一种解决方法,您可以拥有多个上游作业,每个作业都签出一个仓库,然后复制到最终的项目工作区(有多个级别有问题),或者您可以设置一个shell脚本步骤,检查每个需要的仓库到构建时的作业工作区.

以前,Multiple SCM插件可以帮助解决此问题,但现在已弃用.从Multiple SCM插件页面:"用户应该迁移到https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin.Pipeline提供了一种更好的方法来检查多个SCM,并得到Jenkins的支持核心开发团队."

  • 管道要求您学习一个新的DSL,这对于我们希望它做的非常简单的工作(从多个存储库中检出代码)来说有点太多了.坚持使用Multiple SCM插件,直到Jenkins管道DSL周围出现一个像样的GUI.我可以报告它与Jenkins 2.17一起工作正常 (2认同)
  • 我只是在多个存储库中遇到了相同的问题。我现在正在使用Pipeline插件,即使我像@BurakArslan一样对新的DSL持怀疑态度。实际上,它还没有我想像的那么糟糕,并带有一个相当不错的代码片段生成器。在仅使用了2个小时之后,我现在实际上更喜欢这种方法,因为我最终可以将管道构建脚本与其余代码一起提交给git。 (2认同)

Jok*_*ker 35

由于不推荐使用Multiple SCMs Plugin.

使用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/)
  }
}
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!!!`dir` 块是关键,我不明白为什么我只能在我的工作工作区中看到最新克隆的存储库。 (3认同)

Fre*_*rdt 19

我和Jenkins一起使用了多个SCM插件和Git插件.

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

Aru*_*gal 7

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

脚本/管道即代码 - 是要走的路。


mik*_*ang 5

根据存储库的关系,另一种方法是将其他存储库(存储库)作为git子模块添加到其中一个存储库.git子模块创建对其他repos的引用.除非您--recursive在克隆"超级项目"(官方术语)时指定标记,否则不会克隆这些子模块存储库.

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

git submodule add <repository URI path to clone>

我们正在使用Jenkins v1.645,并且git SCM将开箱即用,为超级项目执行递归克隆.您可以在同一个Jenkins作业工作区中的各自目录中获取超级项目文件和所有相关(子模块)repo文件.

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