当前位置: 首页 > 知识库问答 >
问题:

如何将 Jenkins 流水线配置为通过轮询 SubVersion 触发?

阚英睿
2023-03-14

一段时间以来,我们一直在使用 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存储库时运行此管道。管道配置确实有一个“轮询 SCM”生成触发器选项,但没有“源代码管理”部分,您可以在其中指定存储库。我们如何才能做到这一点?

共有3个答案

符佐
2023-03-14

作为管道脚本不是项目的一部分或在作业中定义的替代方法,您可以添加 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,在页面的末尾没有详细信息。

况鸿雪
2023-03-14

我发现有效的解决方案是:

  1. 将管道脚本移动到文件中(默认为JenkinsFile)并将其存储在SubVersion中我的项目的根目录中。
  2. 将我的管道作业定义源设置为“来自SCM的管道脚本”,按照正常的Jenkins构建作业输入在SubVersion中查找我的项目的详细信息,并将脚本路径设置为指向包含管道脚本的JenkinsFile。
  3. 将管道作业的构建触发器设置为“轮询SCM”并输入计划。
  4. 手动运行管道作业

这似乎是第4步,手动运行管道作业,导致轮询触发器选择要轮询的正确存储库。在此之前,它似乎不知道去哪里看。

那存
2023-03-14

使用Jenkins声明性管道脚本,您可以将作业配置为每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']
                ])
            }
        }
    }
}

< code>pollSCM触发器应自动轮询与您的版本关联的所有SCM资源库URL,包括< code>checkout步骤指定的URL、SCM中声明性管道脚本的URL以及全局管道库的URL。但是,如果您真的想让管道为每一个版本运行,您将需要设置一个提交后挂钩。

 类似资料:
  • 问题内容: 我们一直在使用Jenkins进行持续集成。一个典型的构建作业在“源代码管理”部分中指定SVN存储库和凭据,然后在“构建触发器”部分中启用“轮询SCM”,轮询时间表为每10分钟(H / 10 * * ) 。我们已经更新到Jenkins的最新版本,并且正在寻求建立管道版本。典型的管道脚本如下所示: 当手动触发管道作业时,一切运行正常,但是,我们希望每次将新修订签入SVN存储库时都运行该管道

  • 我正在使用jenkins dsl插件多分支管线作业(https://jenkinsci.github.io/job-dsl-plugin/#path/multibranchPipelineJob)以创建多分支管道。我创建了jenkinsfile,它处理每个分支的构建作业。我不知道如何通过管道将github推送触发器作为代码启用。我能找到的所有示例都使用jenkins web UI或pollscm选

  • 问题内容: elasticsearch :6.1.2 我有一个通过JSON进行的输入查询,并且想使用高级Java API 使用该查询数据来构建搜索请求。 我试图通过以下方式构造构建器: 但这会产生: 由以下原因引起:org.elasticsearch.ElasticsearchException:org.elasticsearch.common.xcontent.NamedXContentRegi

  • Netty4是否可以直接将写入通道,而不经过处理程序?

  • 问题内容: 我正在尝试设置要触发的版本的版本说明,因为我正在启动该版本,到目前为止我还没有运气。 我遇到了一个解决方案将文本添加到由Jenkins远程API触发的构建页面中,我有点以这种方式工作(第一个命令将启动构建,第二个命令将设置最后一个的描述)建立): 但是,问题是,如果我刚刚启动的构建被排队/没有立即启动,“ lastBuild”将不引用我刚刚启动的构建,而是之前的那个(仍在构建中)。 所

  • 问题内容: 我们正在使用标准的git flow分支模型(develop,master ,release- , hotfix- 等)。 作为我们工作流程的一部分,我们希望通过jenkins设置“一键式”发行版。 我正在看jgitflow-maven-plugin。我可以设置此插件以从jenkins一键发布吗?如果是这样,有哪些配置选项? 特别是,我可以做这样的事情吗? 并且有一种方法告诉它从最新的-