142

使用 Jenkins 1.501 和 Jenkins Git 插件 1.1.26

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

现在我需要将 3 个 git 存储库中的所有项目检出到 Jenkins 从站上的同一个工作区中。我在以下位置定义了每个 git repo:源代码管理:多个 SCM。但是每次签出一个 repo 时,都会删除以前的 repo(及其相关项目)。

我读过这个:

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

但它并没有真正帮助。我试图在本地子目录下为所有回购指定相同的文件夹(可选),但它给出了相同的结果。

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

4

9 回答 9

82

使用多个 SCM 插件:

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

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

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

  • 如果您使用的是 ant,就像现在带有构建目标的 build.xml 文件不在工作区的根目录中而是在子目录中,您必须在“Invoke Ant”配置中反映这一点。为此,在“Invoke ant”中,按“高级”并填写“构建文件”输入文本,包括 build.xml 所在的子目录的名称。

希望有帮助。

于 2013-06-28T13:20:43.987 回答
76

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

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

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

于 2013-02-13T00:14:01.417 回答
52

由于不推荐使用多个 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 子模块而不是像这样的自定义管道。

于 2017-04-07T08:39:29.023 回答
20

我成功地将Multiple SCMs Plugin与 Git Plugin 与 Jenkins 结合使用。

于 2013-05-23T00:15:41.740 回答
7

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

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

于 2018-08-30T18:03:47.023 回答
5

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

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

git submodule add <repository URI path to clone>

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

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

于 2016-08-30T15:25:37.007 回答
2

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

主要项目:

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} 
于 2019-02-08T14:52:51.340 回答
0

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

于 2014-11-13T21:25:12.030 回答
0

使用 Jenkins + Git 插件可以在一个工作区中一次检查多个 repo (可能仅在较新的版本中?)。

在“Source-Code-Management”部分,不要选择“Git”,而是选择“Multiple SCMs”并添加几个git repositories。

确保除了一个作为“附加行为”之外的所有操作都添加了“签出到子目录”并指定一个单独的子目录。

于 2019-09-09T11:10:56.170 回答