Использование конвейера Jenkins для проверки нескольких репозиториев git в одном задании

#git #jenkins #jenkins-pipeline

#git #дженкинс #jenkins-pipeline

Вопрос:

Я использую плагин Jenkins Multiple SCM для извлечения трех репозиториев git в три подкаталога в моем задании Jenkins. Затем я выполняю один набор команд для создания единого набора артефактов с информацией и кодом, взятыми из всех трех репозиториев.

Множественный SCM теперь устаревает, и в тексте рекомендуется перейти на конвейеры. Я пытался, но не могу понять, как заставить это работать.

Вот структура каталогов, которую мне интересно видеть на верхнем уровне моего каталога заданий Jenkins:

 $ ls
Combination
CombinationBuilder
CombinationResults
  

В каждом из этих трех подкаталогов извлечено одно репозиторий git. С множественным SCM я использовал git, а затем добавил поведение «извлекать в подкаталог». Вот моя попытка с помощью сценария конвейера:

 node('ATLAS amp;amp; 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, похоже, выполняется в каталоге верхнего уровня рабочей области (что имеет некоторый смысл), и, согласно синтаксису, также, похоже, не существует режима извлечения в подкаталог.

Комментарии:

1. Jenkins делает это настолько сложным, что это похоже на молоток и зубило по сравнению с TeamCity, что делает эту функцию такой элегантной.

2. Это 2022 год, и я считаю, что этот плагин устарел. Каков текущий способ использования нескольких репозиториев в одном задании?

3. @stackMeUp несколько репозиториев в одном и том же задании имеет смысл, например, при использовании составных сборок Gradle

Ответ №1:

Вы можете использовать dir команду для выполнения шага конвейера в подкаталоге:

 node('ATLAS amp;amp; 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')
}
  

Комментарии:

1. Отлично, это сработало, спасибо! Я постепенно изучаю конвейеры. Я бы хотел, чтобы все программное обеспечение просто выбирало один DSL для выполнения рабочего процесса. Мне пришлось многому научиться. 🙂

2. как вернуться в каталог $ WORKSPACE / каталог pipeline? Я должен вернуться в глобальный контекст, чтобы выполнить некоторые сценарии. Каталог переключает контекст и оставляет его там. Последняя команда ‘ls’ напечатает содержимое репозитория CombinationBuilder.

3. Как вы используете разные учетные данные для репозиториев? То есть, скажем, мое «основное» репозиторий (которое Дженкинс отслеживает для запуска задания) находится в Bitbucket, и я хочу клонировать существующий репозиторий Github внутри сборки, как мне указать один набор кредитов для Bitbucket и другой для Github?

4. Чтобы использовать разные учетные данные, используйте необязательный параметр ‘credentialsId’ в команде git. например, git url: 'https://github.com/AtlasBID/CombinationBuilder.git', credentialsId: 'foo' где ‘foo’ — это идентификатор учетных данных от Jenkins.

5. @haridsv, документация для git находится здесь: jenkins.io/doc/pipeline/steps/git

Ответ №2:

Вы можете извлечь эти три репозитория git в три подкаталога, выполнив шаг SCM проверки три раза следующим образом:

 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']]
        ])

}
  

Комментарии:

1. Для меня это было идеальным решением, поскольку у меня есть сложные варианты.

2. фантастические расширения: [[$ class: ‘RelativeTargetDirectory’, relativeTargetDir: ‘CalibrationResults’]], было то, что мне было нужно, просто скажите имя папки, в которую будет помещен клонированный репозиторий, спасибо.

3. Плагин git предупреждает об использовании этого расширения в конвейере: «Это расширение не должно использоваться в конвейере Jenkins (ни декларативном, ни скриптовом). Конвейер Jenkins уже предоставляет стандартные методы для извлечения в подкаталог. Используйте ws и dir в конвейере Jenkins, а не это расширение «.

Ответ №3:

Вот мой

     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'
            }
        }
    }
  

Комментарии:

1. Для меня это сработало как по волшебству! Спасибо.

2. очень полезный ответ

3. Похоже, для этого требуется плагин Git Parameter

4. вы можете упростить это, команда mkdir не нужна, поскольку dir() создаст каталог, если он не существует

Ответ №4:

Если в вашем репозитории есть подмодули, используйте 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']]])


                }
            }
        }

    }

}
}
  

Сгенерировано с помощью генератора фрагментов git для проверки

Комментарии:

1. Есть идеи, как извлекать подмодули в данной ветке?

Ответ №5:

Вы можете просто добавить шаг оболочки, который выполняет клонирование и перемещает его в подкаталог по вашему выбору.

 git clone https://$bitbucketUsername:$bitbucketPassword@<yourbitbucketserver>/scm/projectname/reponame1.git
mv reponame1 new_subdir_name1

git clone https://$bitbucketUsername:$bitbucketPassword@<yourbitbucketserver>/scm/projectname/reponame2.git
mv reponame2 new_subdir_name2