Как настроить Jenkins Pipeline для запуска опроса SubVersion?
Мы используем Jenkins для непрерывной интеграции в течение некоторого времени.
Типичное задание сборки задает репозиторий SVN и учетные данные в разделе "Управление исходным кодом", затем в разделе "Build Triggers" мы включаем "Poll SCM" с расписанием опроса каждые 10 минут (H/10 * * * *),
Мы обновили до последней версии Jenkins и надеемся настроить сборки трубопроводов. Типичный конвейер script выглядит следующим образом:
node {
stage 'Build'
build job: 'MyApplication Build'
stage 'Deploy to test environment'
build job: 'MyApplication Deploy', parameters: [
[$class: 'StringParameterValue', name: 'DatabaseServer', value: 'DatabaseServer1'],
[$class: 'StringParameterValue', name: 'WebServer', value: 'WebServer1']
]
stage 'RunIntegrationTests'
build job: 'MyApplication Test', parameters: [
[$class: 'StringParameterValue', name: 'DatabaseServer', value: 'DatabaseServer1'],
[$class: 'StringParameterValue', name: 'WebServer', value: 'WebServer1']
]
}
Когда задание конвейера запускается вручную, все работает нормально, однако мы хотели бы, чтобы этот конвейер запускался каждый раз, когда новая ревизия проверяется в репозитории SVN. Конфигурация конвейера имеет параметр запуска "опроса SCM", но не имеет раздела "Управление исходным кодом", где вы можете указать свой репозиторий. Как мы можем достичь этого?
Ответы
Ответ 1
Решение, которое я нашел для работы, это:
- Переместите конвейер script в файл (по умолчанию это JenkinsFile) и сохраните его в корне моего проекта в SubVersion.
- Задайте источник определения источника конвейера "Pipeline script из SCM", введите сведения о том, где найти мой проект в SubVersion в соответствии с нормальным заданием сборки Jenkins, и установите путь script для указания на JenkinsFile содержащий трубопровод script.
- Установите триггер сборки задания конвейера в "Опрос SCM" и введите расписание.
- Вручную выполнить работу с конвейером
Казалось, что это шаг 4, вручную выполнив задание на конвейер, из-за которого триггер опроса забирает правильный репозиторий для опроса. До этого он, похоже, не знал, где искать.
Ответ 2
Используя сценарий декларативного конвейера Jenkins, вы можете настроить задание для опроса URL-адреса хранилища SVN каждые 10 минут следующим образом:
pipeline {
agent any
triggers {
pollSCM 'H/10 * * * *'
}
stages {
stage('checkout') {
steps {
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[credentialsId: 'mySvnCredentials', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'http://example.com/svn/url/trunk']], workspaceUpdater: [$class: 'CheckoutUpdater']])
}
}
}
}
Триггер pollSCM
должен автоматически опрашивать все URL-адреса репозитория SCM, связанные с вашей сборкой, включая URL-адреса, указанные в шагах checkout
, URL-адрес сценария декларативного конвейера от SCM и URL-адрес ваших глобальных библиотек конвейеров. Если вы действительно хотите, чтобы конвейер запускался для каждой ревизии, вам нужно вместо этого установить хук после фиксации.
Ответ 3
Мне кажется, вам нужен этап Checkout до этапа Build, который состоит из информации SCM. Это позволяет заданию опроса SCM на желаемом интервале и запускать конвейер.
Вы даже можете использовать Pipeline script, не имея кодов конвейера для хранения как JenkinsFile в SCM.
Ниже мой код сценария SVN Checkout до этапа Сборка:
stage('Checkout') {
checkout([$class: 'SubversionSCM',
additionalCredentials: [],
excludedCommitMessages: '',
excludedRegions: '',
excludedRevprop: '',
excludedUsers: 'buildbot',
filterChangelog: false,
ignoreDirPropChanges: false,
includedRegions: '',
locations: [[credentialsId: 'b86bc2b6-994b-4811-ac98-0f35e9a9b114',
depthOption: 'infinity',
ignoreExternalsOption: true,
local: '.',
remote: "http://svn/something/trunk/"]],
workspaceUpdater: [$class: 'UpdateUpdater']])
}
Работает только для моей работы с конвейером. Надеюсь, это поможет.
Ответ 4
В качестве альтернативы, когда конвейер script не является частью проекта или не задан в задании, вы можете добавить poll: true
на этапе проверки.
Пример:
stage('checkout') {
checkout(
changelog: true,
poll: true, /*This is the important option*/
scm: [
$class: 'SubversionSCM',
filterChangelog: false,
ignoreDirPropChanges: false,
locations: [...], /*ommited for obvious reasons*/
workspaceUpdater: [$class: 'CheckoutUpdater']
])
}
После первого запуска он начнет опрос с этого SCM также как из SCM, где конвейер, если это так.
Этот параметр задокументирован в https://jenkins.io/doc/pipeline/steps/workflow-scm-step/#code-checkout-code-general-scm, в самом конце страницы без подробностей.
Ответ 5
Таким образом, у нас было много проблем, чтобы заставить это работать. Вот как мы решили проблему:
В Дженкинс ты работаешь на конвейере. Единственное содержание, которое требуется в этой работе:
- POLL SCM (с некоторым произвольным значением, таким как
@monthly
) - Где работа должна найти ваш Jenkinsfile
Все остальные настройки входят в файл Jenkinsfile. Тем не мение:
triggers {
pollSCM('@monthly')}
Должно ли все еще быть указано в вашем Jenkinsfile, даже если это уже указано в вашей работе.
Однако, как сказал zionyx, вам нужно оформить заказ, прежде чем делать что-либо еще. В нашем случае мы хотели избежать этого по многим причинам. К счастью, это все еще работает, если у вас есть: depthOption: 'empty'
.
Наконец, вам нужно вручную запустить первый запуск задания.
Мы сделали небольшую функцию, которую вы можете использовать:
def checkoutSVN(Boolean ignoreExternalsOption, String local, String remote, String updater) {
checkout([$class: 'SubversionSCM',
additionalCredentials:
[[credentialsId: 'get-this-from-your-jenkins',
realm: '<https://your-server> CollabNet Subversion Repository']],
excludedCommitMessages: '',
excludedRegions: '',
excludedRevprop: '',
excludedUsers: '',
filterChangelog: false,
ignoreDirPropChanges: false,
includedRegions: '',
locations: [[credentialsId: 'get-this-from-your-jenkins',
depthOption: 'empty',
ignoreExternalsOption: ignoreExternalsOption,
local: local,
remote: remote]],
quietOperation: false,
workspaceUpdater: [$class: updater]])}
Ответ 6
факты
- Jenkins Pipeline не имеет возможности быть запущенным из SCM.
- Дженкинс Работа имеет возможность быть Инициированными от SCM.
=> Самый простой способ достичь этого:
- Создайте задание Jenkins, которое запускается из SCM.
- Настройте конвейер Jenkin, который будет запускаться после сборки проекта Jenkins Job.
Это!