Как настроить конвейер Jenkins, который будет запускаться при опросе SubVersion?

Мы уже давно используем Jenkins для непрерывной интеграции. Типичное задание на сборку указывает хранилище SVN и учетные данные в разделе "Управление исходным кодом", затем в разделе "Триггеры сборки" мы включаем "Опрос SCM" с расписанием опроса каждые 10 минут (H/10 * * * *), Мы обновились до последней версии Jenkins и собираемся настроить конвейерные сборки. Типичный конвейерный скрипт выглядит так:

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. Конфигурация конвейера имеет опцию триггера сборки "poll SCM", но не имеет раздела "Управление исходным кодом", где вы можете указать свой репозиторий. Как мы можем достичь этого?

5 ответов

Решение

Решение, которое я нашел для работы:

  1. Переместите конвейерный скрипт в файл (по умолчанию JenkinsFile) и сохраните его в корне моего проекта в SubVersion.
  2. Установите для моего источника определения задания конвейера значение "Конвейерный сценарий из SCM", введите сведения о том, где найти мой проект в SubVersion согласно обычному заданию сборки Jenkins, и задайте путь сценария, чтобы он указывал на файл JenkinsFile, содержащий скрипт конвейера.
  3. Установите триггер сборки задания конвейера на "Опрос SCM" и введите расписание.
  4. Вручную запустить работу конвейера

Казалось, что это шаг 4, вручную запускающий конвейерное задание, которое заставило триггер опроса подобрать правильный репозиторий для опроса. До этого казалось, что он не знает, где искать.

Используя сценарий декларативного конвейера 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 ваших глобальных библиотек конвейеров. Если вы действительно хотите, чтобы конвейер запускался для каждой ревизии, вам нужно вместо этого установить хук после фиксации.

В качестве альтернативы, когда сценарий конвейера не является частью проекта или определен в задании, вы можете добавить 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/ в самом конце страницы без подробностей.

Таким образом, у нас было много проблем, чтобы заставить это работать. Вот как мы решили проблему:

В Дженкинс ты работаешь наконвейере. Единственное содержание, которое требуется в этой работе:

  • 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]])}

Я думаю, что перед этапом сборки вам нужен этап Checkout, состоящий из информации SCM. Это позволяет заданию опрашивать SCM с нужным интервалом и запускать конвейер.

Вы даже можете использовать конвейерный сценарий, не имея конвейерных кодов для хранения в качестве 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']])
}

Работает для моей работы трубопровода, хотя. Надеюсь это поможет.

факты

  • Jenkins Pipeline не может быть вызван из SCM.
  • У Дженкинса Джоба есть возможность быть вызванным из SCM.

=> Самый простой способ достичь этого:

  1. Создайте задание Jenkins, которое запускается из SCM.
  2. Настройте конвейер Jenkin, который будет запускаться после сборки проекта Jenkins Job.

Это оно!

Другие вопросы по тегам