如何配置Jenkins定时轮询SCM但不触发任务执行?
Jenkins DSL/CasC配置问题:SCM轮询触发所有任务执行
问题场景
首次使用Jenkins DSL管理任务,所有任务通过CasC加载。期望配置:
- 每15分钟轮询GitLab仓库的SCM,仅用于保持任务配置更新
- 多数任务手动触发执行
- 仅3个任务每日定时执行
但实际情况:每次向develop分支提交代码,所有任务都会被触发执行。
现有配置
CasC Jenkins配置文件
jobs: - script: > folder('App/scheduled') - file: /var/jenkins_home/pipelines/pull_app_server_deploy_m23_dev_devops_daily
拉取任务DSL配置(pull_app_server_deploy_m23_dev_devops_daily)
pipelineJob("App/scheduled/M23 dev_devops daily deploy") { disabled(false) definition { cpsScm { scm { git { remote { url("https://gitlab.domain.com/Common/tools/jenkins.git") credentials("*******************************") } branch('develop') } } scriptPath("jobs/app_server_deploy_m23_dev_devops_daily") } } triggers { scm('H/15 * * * *') } }
实际流水线任务脚本
env.agentName = "" pipeline { agent any triggers { cron('0 15 * * 1-5') } stages { stage ('Decide which agent') { steps { script { env.agentName = "co-dev-deploy01" echo "Will execute on ${env.agentName}" } } } stage ('App Deploy') { options { timeout(time: 3600, unit: 'SECONDS') } steps { node ( agentName as String ) { dir("/opt/home/p4/tools/ansible/ML/2023/deploy_conf") { ansiblePlaybook([ credentialsId: 'co-ssh', inventory: "inventory/dev_devops", playbook: 'deploy_app_server.yml', vaultCredentialsId: "vault_dev_devops_passwd", colorized : true, extraVars : [ deploy_env: "dev_devops", cl_to_deploy: "latest", build_type: "debug-opt", deploy_cluster: "all", restart_wait_time: "1", restart_mysql_schema_clear: "None", individual_schemas: "", mysql_soft_fail_enable: false, redis_restart: true, redis_hard_stop: true, clean_build: false, branch: "DL" ] ]) } } } } } }
GUI显示的构建触发器
build periodically (0 15 * * 1-5) <-- 符合预期 Poll SCM (H/15 * * * *) <-- 仅需轮询,无需触发执行
解决方案
1. 纠正对Poll SCM触发器的理解
Poll SCM触发器的核心作用是检测代码仓库变更后自动触发任务构建,并非单纯“轮询更新任务配置”。你给所有任务都加了这个触发器,所以develop分支有提交时,所有任务都会被触发执行。
2. 实现“定期更新任务配置”的正确方式
如果要让Jenkins定期拉取DSL脚本更新任务定义,应该在**种子任务(加载所有DSL的入口任务)**上配置Poll SCM,让种子任务定期扫描仓库的DSL脚本,自动更新所有子任务的配置。而不是给每个子任务都加Poll SCM触发器。
3. 调整任务触发器配置
- 多数手动触发的任务:移除DSL配置中的
triggers { scm('H/15 * * * *') }块,只保留手动触发选项。 - 3个定时执行的任务:仅保留
cron触发器,去掉SCM触发器,避免代码变更触发意外执行。 - 特殊需求任务:如果某个任务确实需要在代码变更时自动构建,再单独给它添加SCM触发器。
4. 仓库结构无需重构
当前仓库仅包含develop和main分支的结构完全够用,不需要重构,只需调整触发器配置即可解决问题。
内容的提问来源于stack exchange,提问作者New2Python
相关产品推荐
相关产品推荐

