首页 文章

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

提问于
浏览
103

使用Jenkins 1.501和Jenkins Git插件1.1.26

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

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

我读过这个:

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

但它并没有真正帮助 . 我试图在 Local subdirectory for repo (optional) 下为所有回购指定相同的文件夹,但它给出了相同的结果 .

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

7 回答

  • 57

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

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

    我肯定会推荐后一种方法,因为您不必担心工作区位置是否发生变化(您可以使用$ WORKSPACE环境变量) .

    2014年编辑:这个答案已经过时,不再反映最佳做法 . 请参阅以下有关Multiple SCM's插件的答案 .

    2016 EDIT2:不推荐使用Multiple SCM插件 . 从Multiple SCM插件页面:“用户应该迁移到https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin . 管道提供了一种更好的方法来检查多个SCM,并得到Jenkins核心开发团队的支持 . ”

  • 2

    使用多个SCM插件:

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

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

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

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

    希望有所帮助 .

  • 23

    由于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/)
      }
    }
    }
    

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

  • 19

    我将Multiple SCMs Plugin与Git插件一起成功地与Jenkins一起使用 .

  • 0

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

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

    git submodule add <repository URI path to clone>

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

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

  • 3

    Jenkins: 多个SCM - 已弃用 . GIT插件 - 不适用于多个回购 .

    脚本/管道作为代码 - 是要走的路 .

  • 75

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

相关问题