我有一个声明性的管道,并且有多个阶段,例如下面通过webhook触发的事件。
我想在某个时间执行并安排阶段B,该阶段也可以通过webhook触发而无需运行。显然,它需要在通过webhook触发时运行,并且还需要在预定时间运行。我可以在Jenkins中创建单独的工作或管道而无需处理吗?
stage('A'){
when{
beforeAgent true
expression{return env.GIT_BRANCH == "origin/development"}
}
steps{
script{
//Do something
}
stage ('B'){
when {
beforeAgent true
expression{return env.GIT_BRANCH == "origin/development"}
steps {
script {
//Run Tests
}
}
}
stage('C'){
when{
beforeAgent true
expression{return env.GIT_BRANCH == "origin/development"}
}
steps{
script{
//Do something
}
答案 0 :(得分:0)
不是以一种干净或一流的方式,但是是的,您可以有效地做到这一点。
对于至少已运行一次的任何作业,您可以单击上一次运行的“重播”。
然后将在文本编辑框中显示Jenkinsfile。此时,您可以对Jenkinsfile进行任何编辑(如果需要,可以粘贴到完全不相关的Jenkinsfile中),Jenkins将执行修改后的版本。对于您的特定情况,您可以删除所有不想重新运行的阶段,而只留下想要的一个(或两个,等等)。
答案 1 :(得分:0)
您可以找到导致管道运行的原因。这可能是cron
触发器,手动触发器,代码提交触发器,webhook触发器,对GitHub的注释,上游作业等(取决于安装的插件,列表可能很长。)
这里是代码示例,用以了解触发器是什么。本示例设置环境变量TRIGGERED_BY
。
def checkForTrigger() {
def timerCause = currentBuild.rawBuild.getCause(hudson.triggers.TimerTrigger.TimerTriggerCause)
if (timerCause) {
echo "Build reason: Build was started by timer"
env.TRIGGERED_BY = 'timer'
return
}
def userCause = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)
if (userCause) {
echo "Build reason: Build was started by user"
env.TRIGGERED_BY = 'user'
return
}
def remoteCause = currentBuild.rawBuild.getCause(hudson.model.Cause$RemoteCause)
if (remoteCause) {
echo "Build reason: Build was started by remote script"
env.TRIGGERED_BY = 'webhook'
return
}
// etc.
println "We haven't caught any of triggers, might be a new one, here is the dump"
def causes = currentBuild.rawBuild.getCauses()
println causes.dump()
}
我认为一个构建可能有多个触发器,如果这样的话,子句的顺序很重要。
一旦弄清了这个问题,就只能在触发器符合您的定义的情况下运行阶段。
stage ('B'){
when {
beforeAgent true
anyOf {
expression{return env.GIT_BRANCH == "origin/development"}
environment name: 'TRIGGERED_BY', value: 'timer'
environment name: 'TRIGGERED_BY', value: 'webhook'
}