Как настроить 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.

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

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

Это!