Заставьте Jenkins с декларативным конвейером работать с магистралью SVN, а также с ветвями

Я хочу настроить задание Jenkins с декларативным конвейером из Jenkinsfile, используя Subversion в качестве SCM, который должен

  • выполнить запланированный опрос SCM для обнаружения изменений в магистрали
  • быть запускаемым вручную для создания магистрали или любой ветки по выбору

Поэтому я настроил задание Jenkins с параметром List Subversion tags (и другими), который собирает существующие ветки SVN из URL-адреса SVN и позволяет пользователю выбрать одну из них. Выбранное значение сохраняется в переменной, например $svnBranch, и я определил «багажник» в качестве значения по умолчанию.

Затем эта переменная используется для создания результирующего URL-адреса SCM, например

svn+ssh://svn.mydomain.org/Reponame/projectname/$svnBranch/componentname

Теперь вот проблема:

Эта настройка работает до тех пор, пока задание запускается вручную. Но если он запускается по расписанию cron, Jenkins продолжает обнаруживать изменения SCM каждый раз и всегда запускает новую сборку. Журнал опроса SCN показывает

Workspace doesn't contain Reponame/projectname/$svnBranch/componentname. Need a new build.

Таким образом, проблема, очевидно, вызвана тем, что Дженкинс не разрешает переменную при опросе SCM на наличие изменений. Чтобы проверить это предположение, я изменил задание на использование фиксированной строковой переменной, и снова произошло то же самое.

Мне было интересно, можно ли решить проблему, переместив логику опроса и проверки в Jenkinsfile. Идея заключалась бы в том, чтобы всегда опрашивать ствол, но проверять и строить на основе $svnBranch, но я не уверен, как это сделать. Можно ли определить разные URL-адреса SCM для опроса и проверки? Согласно моим исследованиям, все URL-адреса оформления заказа в Jenkinsfile будут автоматически использоваться для опроса, так как же это сделать?

Любое другое рабочее решение также приветствуется.

Обратите внимание, что есть похожий вопрос Jenkins Pipeline — опрос SVN, который наткнулся на ту же проблему, но не нашел решения, которое соответствовало бы моему сценарию.

Также обратите внимание, что в JENKINS-10628 сообщается о проблеме: триггер сборки SCM неправильно работает с переменными в URL-адресе SVN, который описывает мою проблему, но, как говорят, она решена с помощью новой версии плагина Subversion с 2015 года. Я обновился до последней версии 2.16.0, но это не решило проблему.


102
1

Ответ:

Решено

Это решение, которое я нашел (я открыт для лучших - например, я не доволен настройкой одного и того же URL-адреса SCM в двух разных местах):

Во-первых, в задании Jenkins в разделе Pipeline из SCM я настроил URL-адрес магистрали, который не содержит переменной. Этот URL-адрес будет использоваться для опроса изменений в транке.

svn+ssh://svn.mydomain.org/Reponame/projectname/trunk/componentname

Во-вторых, я создал эту функцию, чтобы заменить часть «магистраль» на имя ветки:

def call(Map param = [ : ]) {
    if ( param.branch == null ) {
        return param.trunkUrl                                     
    }
    url = param.trunkUrl.replaceAll('/trunk(?=/|$)', '/'+param.branch)  // replaces /trunk if followed by / or if at end of url
    return url
}

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

Затем это используется для получения URL-адреса оформления заказа с выбранным svnBranch в пользовательском интерфейсе:

    environment {
        // Set actual checkout url, because SVN_URL_1 will always contain the fixed url of the trunk used for polling
        checkoutUrl = composeSvnUrl(trunkUrl: env.SVN_URL_1, branch: env.svnBranch)
    }

Наконец, я добавил этап оформления заказа (в качестве первого этапа) в свой Jenkinsfile:

        stage('Checkout') {
            steps {
                /* Checkout for actual build (may be different if started manually) */
                checkout(
                    poll: false, changelog: false, // = do not use this for polling 
                    scm: [
                        $class: 'SubversionSCM', 
                        quietOperation: false,
                        additionalCredentials: [], 
                        excludedCommitMessages: '', 
                        excludedRegions: '', 
                        excludedRevprop: '', 
                        excludedUsers: '', 
                        filterChangelog: false, 
                        ignoreDirPropChanges: false, 
                        includedRegions: '', 
                        locations: [[
                            credentialsId: 'id.from.jenkins.credentials', 
                            depthOption: 'infinity',
                            ignoreExternalsOption: true, 
                            local: '.', 
                            remote: checkoutUrl, 
                        workspaceUpdater: [$class: 'CheckoutUpdater']               
                    ]
                     
                )
                
            }
        }

Важными частями являются:

poll: false, changelog: false означает, что Дженкинс не должен использовать эту информацию о проверке для опроса. Как упоминалось в Pipeline: SCM Step — checkout: Check out from version control в самом низу страницы:

Если «Включить в опрос» отключено и «Включить в список изменений» отключено, то при проведении опроса изменения, обнаруженные в этом репозитории, будут игнорироваться.

workspaceUpdater: [$class: 'CheckoutUpdater'], вероятно, также важно, так как это очистит рабочее пространство перед повторной проверкой.