我们一直在使用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”构建触发器选项,但没有“源代码管理”部分,您可以在其中指定存储库。我们怎样才能做到这一点?
答案 0 :(得分:6)
我找到的解决方案是:
似乎是第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中,您进行管道作业。这项工作所需的唯一内容是:
@monthly
)其他所有设置都进入 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)
事实
=>实现此目的的最简单方法是:
就是这样!