我有一个Jenkins文件,我已使用cron
设置pipelineTriggers
参数。我似乎无法弄清楚如何禁用作业从合并到repo的主分支。 Jenkinsfile中是否有一种方法可以禁用scm更改中的自动构建?
答案 0 :(得分:22)
如果您正在使用Multibranch Pipeline,您应该可以在作业的配置页面上执行此操作:
这会阻止对master
分支的更改触发相应作业的构建。
答案 1 :(得分:4)
使用multibranch管道,我无法找到防止下一个构建被触发的方法。作为一种解决方法,我将以下代码添加到我的Jenkinsfile(使用脚本语法),如果唯一的更改包含" [ci-skip]"则中止以下构建。在提交消息中:
def abortBuildIfTriggeredBySkippableCommit() {
def changeSetCount = 0;
def ciSkipCount = 0;
if (currentBuild.changeSets != null) {
for (changeSetList in currentBuild.changeSets) {
for (changeSet in changeSetList) {
changeSetCount++;
if (changeSet.msg.contains('[ci-skip]')) {
ciSkipCount++;
}
}
}
}
if (changeSetCount > 0 && changeSetCount == ciSkipCount) {
currentBuild.result = 'NOT_BUILT'
error("Stopping to prevent auto trigger. All commits contained [ci-skip]")
}
}
请注意,此代码假定您使用的是git插件,currentBuild.changeSets
中的对象将为GitChangeSetList。
答案 2 :(得分:1)
我偶然发现了这一点。 IMO是一个可接受的解决方案,它是检查源代码时提交消息的过滤器 - 此功能适用于常规作业,但缺少多分支管道,请参阅https://issues.jenkins-ci.org/browse/JENKINS-48296。
对于那些不使用git插件的人来说,这种方法是脚本管道的一种解决方法(受到scarswell的回答):
def abortBuildIfTriggeredBySkippableCommit() {
lastCommitMessage = sh(
script: "${gitBinary} --no-pager log -1 --pretty=%B",
returnStdout: true
)
if (lastCommitMessage != null &&
lastCommitMessage.toString().contains('[maven-release-plugin]')) {
currentBuild.result = 'ABORTED'
error("Stopping build, it was triggered by the maven release plugin")
}
}
答案 3 :(得分:0)
如果您正在使用SCM中的Pipeline脚本,请在Jenkins文件中注释掉触发器部分(SCMPoll / BuildPeriodically选项),如下所示。
//触发{cron(' H / 15 * * * *')} // pipelineTriggers([pollSCM(' H / 15 * * * *')])
如果您使用的是Pipeline脚本,请定期禁用PollSCM / Build(无论使用哪个)选项。
答案 4 :(得分:0)
这就是我想出的。我希望得到一些不那么混乱的东西,但这确实有效:
我将此作为构建的属性:
properties([
pipelineTriggers([cron('H H 7 * *')])
])
然后我有了这个定义构建源的函数:
// check if the job was started by a timer
@NonCPS
def jobStartedByWhat() {
def startedByWhat = ''
try {
def buildCauses = currentBuild.rawBuild.getCauses()
for ( buildCause in buildCauses ) {
if (buildCause != null) {
def causeDescription = buildCause.getShortDescription()
echo "shortDescription: ${causeDescription}"
if (causeDescription.contains("Started by timer")) {
startedByWhat = 'timer'
}
if (causeDescription.contains("Started by user")) {
startedByWhat = 'user'
}
}
}
} catch(theError) {
echo "Error getting build cause: ${theError}"
}
return startedByWhat
}
def startedByWhat = jobStartedByWhat()
然后我可以在运行时评估该函数,这样如果构建因为合并到master而被触发,它将不会实际运行:
node {
try {
checkout scm
if (env.BRANCH_NAME == 'master') {
if (startedByWhat == 'timer' || startedByWhat == 'user') {
..... RUN THE BUILD .....
} else {
.... EXIT WITHOUT RUNNING THE BUILD ....
答案 5 :(得分:0)
可以通过禁用git的webhook通知来禁用scm构建触发器。
答案 6 :(得分:0)
在詹金斯工作中,您可以导航到高级源代码管理
Dont trigger build on commit notification
这将禁用由SCM更改启动
答案 7 :(得分:0)
对于仍在寻找解决方案的人,请转到多分支管道的配置,在属性策略下,选择“抑制自动 SCM 触发”。
注意:这在 Jenkins 的 cloudbees 版本上可用。我不确定,这是否重要。 https://support.cloudbees.com/hc/en-us/articles/360026953651-Preventing-builds-from-getting-triggered-when-creating-a-new-multibranch-Pipeline-or-Organization-Folder?page=29