使用 Jenkins 管道将多个 git 存储库检出到同一作业中
Using a Jenkins pipeline to checkout multiple git repos into same job
我正在使用 Jenkins Multiple SCM 插件将三个 git 存储库检出到我的 Jenkins 作业的三个子目录中。然后我执行一组命令来构建一组工件,其中包含从所有三个存储库中提取的信息和代码。
Multiple SCM现在折旧了,文中建议转向pipelines。我试过了,但我不知道如何让它工作。
这是我感兴趣的 Jenkins 工作目录顶层目录结构:
$ ls
Combination
CombinationBuilder
CombinationResults
这三个子目录中的每一个都签出了一个 git 回购协议。对于多 SCM,我使用了 git,然后添加了 "checkout to a subdirectory" 行为。这是我对管道脚本的尝试:
node('ATLAS && Linux') {
sh('[ -e CalibrationResults ] || mkdir CalibrationResults')
sh('cd CalibrationResults')
git url: 'https://github.com/AtlasBID/CalibrationResults.git'
sh('cd ..')
sh('[ -e Combination ] || mkdir Combination')
sh('cd Combination')
git url: 'https://github.com/AtlasBID/Combination.git'
sh('cd ..')
sh('[ -e CombinationBuilder ] || mkdir CombinationBuilder')
sh('cd CombinationBuilder')
git url: 'https://github.com/AtlasBID/CombinationBuilder.git'
sh 'cd ..'
sh('ls')
sh('. CombinationBuilder/build.sh')
}
然而,git 命令似乎在工作区的顶级目录执行(这有一定道理),而且根据语法,似乎也没有 checkout-to -子目录行为。
您可以使用 dir
命令在子目录中执行管道步骤:
node('ATLAS && Linux') {
dir('CalibrationResults') {
git url: 'https://github.com/AtlasBID/CalibrationResults.git'
}
dir('Combination') {
git url: 'https://github.com/AtlasBID/Combination.git'
}
dir('CombinationBuilder') {
git url: 'https://github.com/AtlasBID/CombinationBuilder.git'
}
sh('ls')
sh('. CombinationBuilder/build.sh')
}
如果您的存储库有子模块,请使用 git checkout
pipeline {
agent {label 'master'}
stages{
stage("Demo"){
steps{
echo 'Hello World'
}
}
stage("Source"){
parallel{
stage('CalibrationResults'){
steps{
echo 'Checking out CalibrationResults'
checkout([$class: 'GitSCM', branches: [[name: '*/CI-CD-Demo']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', depth: 0, noTags: true, reference: '', shallow: false, timeout: 60], [$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', timeout: 60, trackingSubmodules: true], [$class: 'RelativeTargetDirectory', relativeTargetDir: 'server-core'],[$class: 'CheckoutOption', timeout: 60]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/AtlasBID/CalibrationResults.git']]])
}
}
stage('Combination'){
steps{
echo 'Checking out server spoke'
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', depth: 0, noTags: true, reference: '', shallow: false, timeout: 60], [$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', timeout: 60, trackingSubmodules: true], [$class: 'RelativeTargetDirectory', relativeTargetDir: 'server-spoke'], [$class: 'CheckoutOption', timeout: 60]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/AtlasBID/CombinationBuilder.git']]])
}
}
}
}
}
}
使用 Checkout git 代码段生成器生成
您可以像这样使用检出 SCM 步骤三次将这三个 git 存储库检出到三个子目录中:
stage('Checkout') {
// Get CalibrationResults from GitHub
checkout([
$class: 'GitSCM',
branches: [[name: 'refs/heads/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'CalibrationResults']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/CalibrationResults.git']]
])
// Get Combination from GitHub
checkout([
$class: 'GitSCM',
branches: [[name: 'refs/heads/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'Combination']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/Combination.git']]
])
// Get CombinationBuilder from GitHub
checkout([
$class: 'GitSCM',
branches: [[name: 'refs/heads/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'CombinationBuilder']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/CombinationBuilder.git']]
])
}
这是我的
stage('CheckoutModule1') {
steps {
sh 'mkdir -p Module1'
dir("Module1")
{
git branch: "develop",
credentialsId: 'aaa',
url: 'git@a.com:b/module1.git'
}
}
}
stage('CheckoutModule2') {
steps {
sh 'mkdir -p Module2'
dir("Module2")
{
git branch: "develop",
credentialsId: 'aaa',
url: 'git@a.com:b/module2.git'
}
}
}
我正在使用 Jenkins Multiple SCM 插件将三个 git 存储库检出到我的 Jenkins 作业的三个子目录中。然后我执行一组命令来构建一组工件,其中包含从所有三个存储库中提取的信息和代码。
Multiple SCM现在折旧了,文中建议转向pipelines。我试过了,但我不知道如何让它工作。
这是我感兴趣的 Jenkins 工作目录顶层目录结构:
$ ls
Combination
CombinationBuilder
CombinationResults
这三个子目录中的每一个都签出了一个 git 回购协议。对于多 SCM,我使用了 git,然后添加了 "checkout to a subdirectory" 行为。这是我对管道脚本的尝试:
node('ATLAS && Linux') {
sh('[ -e CalibrationResults ] || mkdir CalibrationResults')
sh('cd CalibrationResults')
git url: 'https://github.com/AtlasBID/CalibrationResults.git'
sh('cd ..')
sh('[ -e Combination ] || mkdir Combination')
sh('cd Combination')
git url: 'https://github.com/AtlasBID/Combination.git'
sh('cd ..')
sh('[ -e CombinationBuilder ] || mkdir CombinationBuilder')
sh('cd CombinationBuilder')
git url: 'https://github.com/AtlasBID/CombinationBuilder.git'
sh 'cd ..'
sh('ls')
sh('. CombinationBuilder/build.sh')
}
然而,git 命令似乎在工作区的顶级目录执行(这有一定道理),而且根据语法,似乎也没有 checkout-to -子目录行为。
您可以使用 dir
命令在子目录中执行管道步骤:
node('ATLAS && Linux') {
dir('CalibrationResults') {
git url: 'https://github.com/AtlasBID/CalibrationResults.git'
}
dir('Combination') {
git url: 'https://github.com/AtlasBID/Combination.git'
}
dir('CombinationBuilder') {
git url: 'https://github.com/AtlasBID/CombinationBuilder.git'
}
sh('ls')
sh('. CombinationBuilder/build.sh')
}
如果您的存储库有子模块,请使用 git checkout
pipeline {
agent {label 'master'}
stages{
stage("Demo"){
steps{
echo 'Hello World'
}
}
stage("Source"){
parallel{
stage('CalibrationResults'){
steps{
echo 'Checking out CalibrationResults'
checkout([$class: 'GitSCM', branches: [[name: '*/CI-CD-Demo']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', depth: 0, noTags: true, reference: '', shallow: false, timeout: 60], [$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', timeout: 60, trackingSubmodules: true], [$class: 'RelativeTargetDirectory', relativeTargetDir: 'server-core'],[$class: 'CheckoutOption', timeout: 60]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/AtlasBID/CalibrationResults.git']]])
}
}
stage('Combination'){
steps{
echo 'Checking out server spoke'
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', depth: 0, noTags: true, reference: '', shallow: false, timeout: 60], [$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', timeout: 60, trackingSubmodules: true], [$class: 'RelativeTargetDirectory', relativeTargetDir: 'server-spoke'], [$class: 'CheckoutOption', timeout: 60]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/AtlasBID/CombinationBuilder.git']]])
}
}
}
}
}
}
使用 Checkout git 代码段生成器生成
您可以像这样使用检出 SCM 步骤三次将这三个 git 存储库检出到三个子目录中:
stage('Checkout') {
// Get CalibrationResults from GitHub
checkout([
$class: 'GitSCM',
branches: [[name: 'refs/heads/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'CalibrationResults']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/CalibrationResults.git']]
])
// Get Combination from GitHub
checkout([
$class: 'GitSCM',
branches: [[name: 'refs/heads/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'Combination']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/Combination.git']]
])
// Get CombinationBuilder from GitHub
checkout([
$class: 'GitSCM',
branches: [[name: 'refs/heads/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'CombinationBuilder']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: '6463627-ab54-4e42-bc29-123458', url: 'https://github.com/AtlasBID/CombinationBuilder.git']]
])
}
这是我的
stage('CheckoutModule1') {
steps {
sh 'mkdir -p Module1'
dir("Module1")
{
git branch: "develop",
credentialsId: 'aaa',
url: 'git@a.com:b/module1.git'
}
}
}
stage('CheckoutModule2') {
steps {
sh 'mkdir -p Module2'
dir("Module2")
{
git branch: "develop",
credentialsId: 'aaa',
url: 'git@a.com:b/module2.git'
}
}
}