在Jenkins中,如何将项目签出到特定目录(使用GIT)

vie*_*bel 60 git hudson github jenkins jenkins-plugins

抱歉'svn'风格 - 我们正处于从SVN迁移到GIT(包括我们的CI Jenkins环境)的过程中.

我们需要的是能够让Jenkins结帐(或者我应该说克隆?)GIT项目(存储库?)到一个特定的目录中.我们已经尝试了一些refspecs魔术,但是理解和使用成功并不是很明显.

此外,如果在同一个Jenkins项目中我们需要在项目根目录下将几个私有GitHub存储库签出到几个单独的目录中,我们怎么能这样做呢?

我们安装了GitHub插件.希望我们把事情说得对.

bio*_*inh 46

我同意@ŁukaszRżanek我们可以使用git插件

但是,我使用选项:checkout到子方向启用如下:
源代码管理中,勾选Git
单击添加按钮,选择签出到子目录

在此输入图像描述

  • 但是您不能为不同的存储库设置不同的文件夹。 (2认同)

Łuk*_*nek 40

Jenkins 的默认git插件可以很好地完成这项工作.

将新的git存储库(项目配置> 源代码管理 >检查GIT选项)添加到项目后,导航到插件设置的底部,就在存储库浏览器区域的上方.应该有一个高级按钮.单击它后,将出现一个新表单,其值描述为repo的Local子目录(可选).将此设置为folder将使插件将存储库签出到相对于工作空间的文件夹中.这样,您可以根据需要在项目中拥有尽可能多的存储库,所有这些存储库都位于不同的位置.

或者,如果您正在使用的项目允许,您可以使用GIT子模块,这类似于SVN中的外部路径.在GIT Book中有一个关于这个主题的部分.如果这不符合某些策略,子模块使用起来相当简单,为您提供了强大的方法来控制将要导入的位置,版本/标签/分支,它将在您的本地存储库中可用,并为您提供更好的可移植性.

显然,GIT插件支持检出子模块,因此Jenkins可以非常有效地使用它们.

  • repo_设置只有一个_Local子目录适用于所有存储库,因此这不适合管理多个存储库.请参阅https://issues.jenkins-ci.org/browse/JENKINS-13086. (16认同)
  • 我甚至没有使用Git插件2.4.2看到这个选项.这个答案是4岁,所以可能已删除选项?(但我确实看到了@outolinh的另一个答案中提到的"Checkout to a sub-directory",但这适用于所有存储库. (6认同)
  • "checkout to subirectory"位于git插件的"Additional Behaviors"部分.但是,这仍然限制了每个作业只有一个git存储库.如果每个作业需要多个git存储库,请使用Jenkins管道. (4认同)

Joh*_*hee 39

在新的Jenkins 2.0管道(以前称为Workflow Plugin)中,这对于:

  • 主存储库
  • 其他额外的存储库

这里我特指的是Multibranch Pipeline版本2.9.

主存储库

这是包含您的存储库Jenkinsfile.

在管道项目的" 配置"屏幕中,输入存储库名称等.

不要使用其他行为>签出到子目录.这将把你Jenkinsfile放在Jenkins无法找到它的子目录.

Jenkinsfile,使用以下命令检查子目录中的主存储库dir():

dir('subDir') {
    checkout scm
}
Run Code Online (Sandbox Code Playgroud)

其他存储库

如果要查看更多存储库,请使用Pipeline Syntax生成器自动生成Groovy代码段.

在管道项目的" 配置"屏幕中:

  1. 选择管道语法.在Sample Step下拉菜单中,选择checkout:General SCM.
  2. 选择您的SCM系统,例如Git.填写有关存储库或软件仓库的常规信息.
  3. 请注意,在Multibranch Pipeline中,环境变量 env.BRANCH_NAME包含主存储库的分支名称.
  4. Additional Behaviors下拉菜单中,选择 Check out to a sub directory
  5. 单击Generate Groovy.Jenkins将显示与您指定的SCM签出对应的Groovy代码段.
  6. 将此代码复制到管道脚本或Jenkinsfile.

  • 这里的代码片段:`checkout([$ class:'GitSCM',branches:[[name:'*/branchname']],doGenerateSubmoduleConfigurations:false,extensions:[[$ class:'RelativeTargetDirectory',relativeTargetDir:'MyDirectory'] ],submoduleCfg:[],userRemoteConfigs:[[credentialsId:'myId',url:'https://github.com/jenkinsci/jenkins.git']]])` (10认同)
  • 除此之外,如果您使用主存储库执行此操作,您可能还需要使用本文中所示的“skipDefaultCheckout”选项以避免两次签出 https://devops.stackexchange.com/a/1074 (3认同)

小智 17

值得研究的是Pipeline插件.使用该插件,您可以将多个VCS项目签出到相对目录路径中.事先为每个VCS结帐创建一个目录.然后向新签出的VCS工作区发出命令.在我的情况下,我使用git.但你应该明白这个想法.

node{
    def exists = fileExists 'foo'
    if (!exists){
        new File('foo').mkdir()
    }
    dir ('foo') {
        git branch: "<ref spec>", changelog: false, poll: false, url: '<clone url>'
        ......
    }
    def exists = fileExists 'bar'
    if (!exists){
        new File('bar').mkdir()
    }
    dir ('bar') {
        git branch: "<ref spec>", changelog: false, poll: false, url: '<clone url>'
        ......
    }
    def exists = fileExists 'baz'
    if (!exists){
        new File('baz').mkdir()
    }
    dir ('baz') {
        git branch: "<ref spec>", changelog: false, poll: false, url: '<clone url>'
        ......
    }
}
Run Code Online (Sandbox Code Playgroud)


Alb*_*rto 6

此外,如果在同一个Jenkins项目中,我们需要在项目根目录下将几个私有GitHub存储库签出到几个单独的目录中.我们怎么能这样做?

詹的多的SCM插件已经解决了几个问题库对我来说非常漂亮.我刚刚完成了一个项目构建,它检查了一个公共文件夹下的四个不同的git repos.(我有点不愿意使用ŁukaszRżanek 之前建议的 git超级项目,因为git足够复杂而没有子模块.)