前置

通常,在 Jenkinsfile 中使用 Git 仓库是这样的:

stage('Checkout git repo') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repo-url'
]]
])
}
}

以上写法的结果是远程 Git 仓库中所有内容都被检出到当前工作目录下,因此我们才能像下面这样(不用切换目录而)直接运行一些命令:

stage('generate version number') {
steps {
VERSION_NUBMER = sh(script: "git describe --always", returnStdout: true).trim()
}
}

将 Git 仓库检出到指定文件夹

如果要同时拉取多个 Git 仓库,面临的首要问题是如何将 Git 仓库检出到指定文件夹。对此,可以通过使用 $class: 'RelativeTargetDirectory' 解决,具体代码如下:

stage('Checkout git repo') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repo-url'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'repo-folder'
]]
])
}
}

这样一来,远程 Git 仓库中所有内容将被检出到 ./repo-folder 文件夹下;后续我们若想在 Git 项目目录下操作,就需要先 cd ./repo-folder 了,例如:

stage('generate version number') {
steps {
VERSION_NUBMER = sh(script: "cd ./repo-folder && git describe --always", returnStdout: true).trim()
}
}

检出多 Git 仓库

在解决了将 Git 仓库检出到指定文件夹这一问题后,检出多 Git 仓库这一需求就稍显容易,下面以检出repoA、repoB、repoC三个仓库为例:

stage('Checkout multiple git repos') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repoA-url'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'repoA-folder'
]]
]) checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repoB-url'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'repoB-folder'
]]
]) checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repoC-url'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'repoC-folder'
]]
])
}
}

上面代码的结果就是工作目录下有了 repoA-folderrepoB-folderrepoC-folder 三个文件夹。

同时

截止现在,还没有达到我们的最终目的。本文标题叫做“Jenkinsfile 同时检出多个 Git 仓库”,但现在我们仅仅做到了“多个”还没有做到“同时”,为此我们需要使用Jenkins Pipeline语法中的 parallel 关键字。

stage('Checkout multiple git repos') {
parallel {
stage('repoA') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repoA-url'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'repoA-folder'
]]
])
}
} stage('repoB') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repoB-url'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'repoB-folder'
]]
])
}
} stage('repoC') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: 'develop']],
userRemoteConfigs: [[
credentialsId: 'ssh-private-key-id',
url: 'project-git-repoC-url'
]],
extensions: [[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'repoC-folder'
]]
])
}
}
}
}

参考


最新文章

  1. Linux 信号量详解一
  2. ae arcgis engine 关于面转线的方法和注意事项
  3. Knockoutjs 实践入门 (1) 属性绑定
  4. Jump Game 的三种思路 - leetcode 55. Jump Game
  5. [问题2015S14] 复旦高等代数 II(14级)每周一题(第十五教学周)
  6. 解决:新版火狐浏览器3d打不开
  7. Android 核心分析之十三Android GWES之Android窗口管理
  8. 设置一个POJO的某个属性的默认值
  9. Linux内核spin_lock与spin_lock_irq分析
  10. session与cookie的关系
  11. java 每天一练(二)
  12. 开涛spring3(6.9) - 对JDBC的支持 之 7.1 概述
  13. 【BootStrap】 布局组件 II
  14. 深度神经网络(DNN)是否模拟了人类大脑皮层结构?
  15. python数据结构-如何统计序列中元素的频度
  16. Leetcode 191.位1的个数 By Python
  17. 《DSP using MATLAB》Problem 5.18
  18. mybatis-generator-maven逆向工程
  19. python_分布式进程中遇到的问题
  20. 插入标识列identity_insert

热门文章

  1. 【ASP.NET Core】在Blazor中获取 HTTP 上下文信息
  2. KingbaseES lag 和 lead 函数
  3. C# 脚本与Unity Visual Scripting 交互,第一步(使用C# 脚本触发Script Graph的事件)(Custom Scripting Event)
  4. 6.第五篇 安装keepalived与Nginx
  5. Beats: Filebeat和pipleline processors
  6. Fluent插件管理
  7. input 禁用历史下拉框
  8. oneplus8手机蓝牙连接tws耳机无法双击退出语音助手
  9. Java学习之路:HelloWorld
  10. Selenium+Python系列 - 开发环境搭建