You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:42:20