如何区分Jenkins中自动触发与Perforce触发的构建任务?
解决方案:区分Jenkins任务的两种触发方式并执行不同步骤
以下是几种实用方法,帮你区分Perforce提交触发和定时触发的构建,按需执行不同步骤:
方法一:通过自定义参数传递触发标识(最可控)
你之前尝试传递参数失败,大概率是Jenkins任务未开启参数化构建,按以下步骤配置:
开启Jenkins任务的参数化构建
打开任务配置页,找到「参数化构建过程」,添加一个布尔参数,命名为P4Triggered,默认值设为false。修正curl命令的JSON格式
原命令的payload拼接存在语法问题,修改为正确的JSON格式(避免转义错误):curl --header 'Content-Type: application/json' \ --request POST --user $JUSER:$JPASS \ --data '{ "change": "'"$CHANGE"'", "p4port": "'"$P4PORT"'", "P4Triggered": true }' \ $JSERVER/p4/change(注:用
'"$VAR"'的方式将shell变量嵌入JSON,确保变量值正确解析)在构建步骤中添加条件判断
在shell构建步骤中,根据参数值执行不同逻辑:# 执行编译步骤(两种触发都需要) echo "开始编译..." make compile # 判断是否为定时触发,若是则执行打包 if [ "$P4Triggered" != "true" ]; then echo "开始打包(定时触发专属步骤)..." make package fi
方法二:利用Jenkins内置的BUILD_CAUSE环境变量
Jenkins会自动根据触发方式设置BUILD_CAUSE环境变量,常见值:
- 定时触发:
TIMERTRIGGER - SCM(Perforce)触发:
SCMTRIGGER - 远程HTTP触发:
REMOTETRIGGER
先确认触发对应的BUILD_CAUSE值
在构建步骤中添加echo命令,查看实际值:echo "当前构建触发原因:$BUILD_CAUSE"执行一次Perforce触发和定时触发的构建,记录对应的变量值。
添加条件判断逻辑
根据记录的值编写脚本:make compile # 定时触发时执行打包 if [ "$BUILD_CAUSE" = "TIMERTRIGGER" ]; then make package fi
方法三:通过触发者用户标识判断
定时触发的构建,触发者通常是SYSTEM;而Perforce触发的HTTP请求使用了$JUSER认证,触发者会是该用户账号。利用BUILD_USER环境变量判断:
make compile if [ "$BUILD_USER" = "SYSTEM" ]; then # 定时触发执行打包 make package fi
内容的提问来源于stack exchange,提问作者Marcos Pereira
相关产品推荐
相关产品推荐

