81

对不起'svn'风格 - 我们正在从SVN迁移到GIT(包括我们的CI Jenkins环境)。

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

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

我们已经安装了 GitHub 插件。希望我们的措辞正确。

4

9 回答 9

57

在新的 Jenkins 2.0 管道(以前称为工作流插件)中,这样做的方式不同:

  • 主存储库
  • 其他附加存储库

这里我特指Multibranch Pipeline 2.9版。

主存储库

这是包含您的Jenkinsfile.

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

不要使用Additional Behaviors > Check out to a sub-directory。这会将您放在Jenkins 找不到Jenkinsfile的子目录中。

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

dir('subDir') {
    checkout scm
}

其他存储库

如果您想查看更多存储库,请使用管道语法生成器自动生成 Groovy 代码片段。

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

  1. 选择管道语法。在Sample Step下拉菜单中,选择checkout: General SCM
  2. 选择您的 SCM 系统,例如Git。填写有关您的存储库或软件仓库的常用信息。
  3. 请注意,在多分支管道中,环境变量 env.BRANCH_NAME包含主存储库的分支名称。
  4. Additional Behaviors下拉菜单中,选择 Check out to a sub-directory
  5. 单击生成 Groovy。Jenkins 将显示与您指定的 SCM 结帐相对应的 Groovy 代码片段。
  6. 将此代码复制到您的管道脚本或Jenkinsfile.
于 2016-11-03T01:30:26.483 回答
50

我同意@Łukasz Rżanek 的观点,我们可以使用git 插件

但是,我使用选项:checkout to a sub-direction 启用如下:
Source Code Management中,勾选 Git
click add button,选择checkout to a sub-directory

在此处输入图像描述

于 2015-03-03T09:26:35.677 回答
48

Jenkins的默认git 插件很好地完成了这项工作。

将新的 git 存储库(项目配置 >源代码管理> 检查 GIT 选项)添加到项目后,导航到插件设置的底部,就在存储库浏览器区域的上方。应该有一个高级按钮。单击它后,应该会出现一个新表单,其值描述为Local subdirectory for repo (optional)。将此设置为folder将使插件将存储库检出到相对于您的工作区的文件夹中。通过这种方式,您可以在项目中根据需要在不同的位置拥有任意数量的存储库。

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

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

于 2012-03-20T17:26:53.923 回答
23

值得研究 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>'
        ......
    }
}
于 2016-10-07T07:45:42.897 回答
6

此外,如果在同一个 Jenkins 项目中,我们需要将几个私有 GitHub 存储库检出到项目根目录下的几个单独的目录中。请问我们该怎么做?

Jenkins的Multiple SCMs Plugin很好地为我解决了几个存储库问题。我刚刚开始了一个项目构建,它在一个公共文件夹下检查了四个不同的 git 存储库。(我有点不愿意使用Łukasz Rżanek之前建议的 git 超级项目,因为 git 在没有子模块的情况下已经足够复杂了。)

于 2013-02-21T17:46:22.047 回答
2

从url中找到repoName,然后checkout到指定目录。

String url = 'https://github.com/foo/bar.git';
String[] res = url.split('/');
String repoName = res[res.length-1];
if (repoName.endsWith('.git')) repoName=repoName.substring(0, repoName.length()-4);

checkout([
  $class: 'GitSCM', 
  branches: [[name: 'refs/heads/'+env.BRANCH_NAME]],
  doGenerateSubmoduleConfigurations: false,
  extensions: [
    [$class: 'RelativeTargetDirectory', relativeTargetDir: repoName],
    [$class: 'GitLFSPull'],
    [$class: 'CheckoutOption', timeout: 20],
    [$class: 'CloneOption',
        depth: 3,
        noTags: false,
        reference: '/other/optional/local/reference/clone',
        shallow: true,
        timeout: 120],
    [$class: 'SubmoduleOption', depth: 5, disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', shallow: true, trackingSubmodules: true]
  ],
  submoduleCfg: [],
  userRemoteConfigs: [
    [credentialsId: 'foobar',
    url: url]
  ]
])
于 2021-02-24T09:45:09.457 回答
2

只需将“dir wrapper”添加到 git 操作:

dir('subDir') {
    checkout scm
}
于 2021-07-12T09:57:14.110 回答
-1

在新的管道流程中,下图可能会有所帮助..

在此处输入图像描述

于 2018-04-16T16:28:15.510 回答
-9

我没有使用 github 插件,但是从介绍页面来看,它或多或少有点像 gerrit-trigger 插件。

你可以安装 git 插件,它可以帮助你检查你的项目,如果你想在一个 jenkins 工作中包含多个项目,只需将 Repository 添加到你的工作中。

于 2012-03-19T09:58:49.967 回答