如何通过轮询SubVersion来配置Jenkins管道?

时间:2016-06-08 11:04:38

标签: svn jenkins triggers jenkins-pipeline

我们一直在使用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”构建触发器选项,但没有“源代码管理”部分,您可以在其中指定存储库。我们怎样才能做到这一点?

6 个答案:

答案 0 :(得分:6)

我找到的解决方案是:

  1. 将管道脚本移动到一个文件中(默认为JenkinsFile)并将其存储在SubVersion项目的根目录中。
  2. 将我的管道作业定义源设置为“从SCM管道脚本”,按照正常的Jenkins构建作业输入在SubVersion中查找项目的位置的详细信息,并将脚本路径设置为指向包含管道脚本的JenkinsFile
  3. 将管道作业的构建触发器设置为“Poll SCM”并输入计划。
  4. 手动运行管道作业
  5. 似乎是第4步,手动运行管道作业,导致poll触发器选择正确的存储库进行轮询。在那之前它似乎不知道在哪里看。

答案 1 :(得分:6)

使用Jenkins Declarative Pipeline脚本,您可以将作业配置为每10分钟轮询一次SVN存储库URL,如下所示:

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触发器应自动轮询与您的构建关联的所有SCM存储库URL,包括checkout步骤指定的URL,SCM的Declarative Pipeline脚本的URL以及Global Pipeline的URL库。如果您真的希望为每个修订版运行管道,那么您需要设置post-commit hook

答案 2 :(得分:4)

我认为您需要在构建阶段之前的 Checkout 阶段,该阶段包含SCM信息。这允许作业以所需的间隔轮询SCM 并运行管道。

您甚至可以使用Pipeline脚本,而无需将管道代码存储为SCM中的JenkinsFile。

以下是我在构建阶段之前的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']])
}

虽然适合我的管道工作。希望这会有所帮助。

答案 3 :(得分:1)

作为管道脚本不属于项目或在作业中定义的替代方法,您可以将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,没有详细信息。

答案 4 :(得分:1)

因此,我们遇到了很多问题,使它无法正常工作。这是我们解决问题的方法:

在Jenkins中,您进行管道作业。这项工作所需的唯一内容是:

  • POLL SCM(具有任意值,例如@monthly
  • 工作在哪里找到您的 Jenkins文件

其他所有设置都进入 Jenkinsfile 。但是:

  triggers {
pollSCM('@monthly')}

应该在您的 Jenkinsfile 中指定 STILL ,即使在您的工作中已经指定了。

但是,正如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]])}

答案 5 :(得分:-1)

事实

  • Jenkins管道没有可以选择从SCM触发。
  • Jenkins工作确实具有从SCM触发的选项。

=>实现此目的的最简单方法是:

  1. 创建一个从SCM触发的Jenkins JOB。
  2. 配置在创建Jenkins Job之后要触发的Jenkin管道。

就是这样!