[英]In Jenkins, how to checkout a project into a specific directory (using GIT)
很抱歉'svn' 风格 - 我们正在从 SVN 迁移到 GIT(包括我们的 CI Jenkins 环境)。
我们需要的是能够让 Jenkins 检出(或者我应该说是克隆?)GIT 项目(存储库?)到特定目录中。 我们已经尝试了一些 refspecs 魔法,但理解和成功使用并不是很明显。
此外,如果在同一个 Jenkins 项目中我们需要将多个私有 GitHub 存储库签出到项目根目录下的几个单独的目录中,我们该怎么做?
我们已经安装了 GitHub 插件。 希望我们的措辞是正确的。
在新的 Jenkins 2.0 管道(以前称为工作流插件)中,这与以下方面不同:
这里我特指的是 Multibranch Pipeline 2.9 版。
主存储库
这是包含您的Jenkinsfile
的存储库。
在管道项目的配置屏幕中,输入您的存储库名称等。
不要使用“附加行为”>“签出到子目录” 。 这会将您的Jenkinsfile
放在Jenkins 找不到的子目录中。
在Jenkinsfile
,使用dir()
检出子目录中的主存储库:
dir('subDir') {
checkout scm
}
附加存储库
如果您想查看更多存储库,请使用流水线语法生成器自动生成 Groovy 代码片段。
在管道项目的配置屏幕中:
env.BRANCH_NAME
包含主存储库的分支名称。Jenkinsfile
。我同意@Łukasz Rżanek 我们可以使用git 插件
但是,我使用 option: checkout to a sub-direction 启用如下:
在Source Code Management 中,勾选 Git
单击添加按钮,选择结帐到子目录
Jenkins 的默认git 插件可以很好地完成这项工作。
在向项目添加新的 git 存储库(项目配置 >源代码管理> 检查 GIT 选项)后,导航到插件设置的底部,就在存储库浏览器区域的上方。 应该有一个高级按钮。 单击它后,应出现一个新表单,其值描述为本地子目录 repo (optional) 。 将此设置为folder
将使插件将存储库检出到相对于您的工作区的文件夹中。 通过这种方式,您可以根据需要在项目中拥有任意数量的存储库,所有存储库都位于不同的位置。
或者,如果您使用的项目允许这样做,您可以使用 GIT 子模块,它们类似于 SVN 中的外部路径。 在GIT Book 中有一个关于这个主题的部分。 如果这不会违反某些政策,子模块使用起来相当简单,为您提供了强大的方式来控制将要导入的位置、版本/标签/分支,并且它将在您的本地存储库中可用,并为您提供更好的可移植性。
显然,GIT 插件支持检出子模块,因此 Jenkins 可以非常有效地使用它们。
值得研究 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>'
......
}
}
此外,如果在同一个 Jenkins 项目中,我们需要将几个私有的 GitHub 存储库签出到项目根目录下的几个单独的目录中。 请问我们怎么办?
Jenkin 的多个 SCM 插件很好地为我解决了几个存储库问题。 我刚刚开始了一个项目构建,它在一个公共文件夹下检查了四个不同的 git 存储库。 (我有点不愿意使用 Łukasz Rżanek 之前建议的git 超级项目,因为 git 没有子模块就足够复杂了。)
从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]
]
])
只需在 git 操作中添加“dir wrapper”:
dir('subDir') {
checkout scm
}
我没有使用github插件,但从介绍页面来看,它或多或少有点像gerrit-trigger插件。
您可以安装 git 插件,它可以帮助您检查您的项目,如果您想在一个 jenkins 作业中包含多个项目,只需将 Repository 添加到您的作业中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.