1. 简介

Jenkins 是一个强大的自动化服务器,提供了多种方式来调整任务参数、执行条件等。在本文中,我们将介绍几种在 Jenkins 中调度任务的方法。

我们将从一个最简单的任务开始,比如输出一段文本消息。然后逐步演进到通过代码仓库(如 GitHub、Bitbucket 等)中的变更自动触发任务。最后,我们还会讨论如何在任务调度中考虑时区的问题。

2. 初始配置

在开始之前,我们假设以下几点:

  • Jenkins 的全局工具配置中已添加了名为 JDK9.0.1Maven3.5.2 的 JDK 与 Maven;
  • 已有一个配置好的 Maven 项目托管在 Bitbucket 或其他 SCM 仓库中,并且我们有访问权限;
  • Jenkins 已正确安装并运行。

如果与你的环境不一致,可以根据实际情况修改示例中的配置名称。

3. 调度一个简单任务

在 Jenkins 中创建一个自由风格任务(Freestyle Project),进入其配置页面,找到 Build Triggers 部分。

勾选 Build periodically,此时会出现一个 Schedule 输入框。我们可以在此输入符合 cron 格式的调度规则。

例如,输入:

*/2 * * * *

表示每两分钟执行一次任务。

提示:点击输入框旁的问号图标,可以查看 cron 表达式说明。

保存后,任务将在两分钟内开始第一次执行。一段时间后,在任务的 Build History 中可以看到多个构建记录。

pipeline script build triggers section

job status

4. 创建一个轮询 SCM 的任务

接下来,我们创建一个任务,它会定期轮询 SCM 仓库(如 Bitbucket),并在检测到变更时执行构建。

4.1 构建触发器配置

Build Triggers 部分,取消勾选 Build periodically,改为勾选 Poll SCM

Schedule 输入框中填写:

*/5 * * * *

表示每 5 分钟轮询一次仓库。

poll scm

4.2 仓库配置

Source Code Management 部分选择 Git,填写仓库地址,并点击 Add 添加凭据。

选择 Username with Password 类型,填写用户名和密码。

Add User

选择刚刚添加的凭据,并确保分支为 */master

Source Code Management

4.3 构建脚本

Build 部分添加一个 Execute Shell 步骤,输入:

mvn clean install

保存任务后等待 5 分钟,任务应自动执行一次构建。

查看 Console Output,应能看到类似如下输出:

maven console output

构建成功后,控制台会显示 BUILD SUCCESS

5. 创建一个基于 Pipeline Script 的任务

我们还可以创建一个 Pipeline 类型的任务,它不会定时执行,而是在 SCM 仓库有提交时自动触发。

5.1 创建 Pipeline 任务

点击 Jenkins 首页的 New Item,选择 Pipeline,命名为 PipelineAsScriptJob

进入配置页面后,找到 Build Triggers 部分。

5.2 构建触发器配置

勾选 Build when a change is pushed to Bitbucket(需要安装 Bitbucket 插件)。

pipeline script build triggers section

5.3 Pipeline 脚本配置

Pipeline 部分选择 Pipeline Script,点击 Pipeline Syntax 链接生成脚本。

生成以下脚本片段:

  • checkout: General SCM:生成代码拉取脚本;
  • withMaven: Provide Maven environment:配置 Maven 环境;
  • node: Allocate nodestage: Stage:定义构建阶段。

将所有片段整合为如下脚本:

node('master') {
    stage('scm') {
        checkout([$class: 'GitSCM', 
          branches: [[name: '*/master']], 
          doGenerateSubmoduleConfigurations: false, 
          extensions: [], 
          submoduleCfg: [], 
          userRemoteConfigs: [[credentialsId: 'e50f564f-fbb7-4660-9c95-52dc93fa26f7', 
          url: 'https://[email protected]/projects/springpocrepo.git']]])
    }

    stage('build') {
        withMaven(jdk: 'JDK9.0.1', maven: 'Maven3.5.2') {
            sh 'mvn clean install'
        }
    }
}

将其粘贴到 Pipeline Script 输入框中。

pipeline script all together

5.4 配置 Webhook

登录 Bitbucket,进入仓库设置页面,找到 Webhooks,添加一个新的 Webhook:

  • 标题随意;
  • URL 应为 Jenkins 提供的 webhook 接口地址,格式为:
http://jenkins-url/bitbucket-hook/

⚠️ 注意结尾必须有斜杠 /

选择 Repository Push 事件作为触发条件。

webhook 1-1

GitHub 的配置类似,可参考 GitHub Webhooks 文档

5.5 测试运行

提交一次代码变更后,Jenkins 应自动触发构建。查看 Build History,可以看到新的构建任务,状态为 pending

构建完成后,查看 Console Output,应显示如下信息:

pipeline script console output

6. 使用 Jenkinsfile 的任务

我们还可以将 Pipeline 脚本写在项目仓库中的 Jenkinsfile 中,而不是直接在 Jenkins 配置里写脚本。

6.1 创建 Pipeline 任务

新建一个 Pipeline 任务,命名为 PipelineWithJenkinsfile

Pipeline 部分选择 Pipeline script from SCM,SCM 选择 Git,填写仓库地址和凭据。

确保 Script Path 默认为 Jenkinsfile

jenkinsfile pipeline config

6.2 编写 Jenkinsfile

在仓库中添加一个名为 Jenkinsfile 的文件,内容如下:

node('master') {
    stage('scm') {
        checkout scm
    }
    stage('build') {
        withMaven(jdk: 'JDK9.0.1', maven: 'Maven3.5.2') {
            sh 'mvn clean install'
        }
    }
}

提交该文件后,Jenkins 将自动触发构建。

与之前方式不同的是,Pipeline 脚本现在是项目源码的一部分,而不是 Jenkins 配置的一部分。

7. 在指定时区调度任务

Jenkins 支持在 cron 表达式中指定时区,适用于 Jenkins 2.60.2 及以上版本。

例如,设置任务在保加利亚时间(Sofia)每周一凌晨 3 点执行:

TZ=Europe/Sofia
0 3 * * 0

可以通过 Linux 系统的 /usr/share/zoneinfo/ 路径查看可用时区列表:

$ tree /usr/share/zoneinfo/
/usr/share/zoneinfo/
├── Africa
│   ├── Abidjan
│   ├── Accra
...
├── Europe
│   ├── Amsterdam
│   ├── Andorra
│   ├── Astrakhan
│   ├── Athens
│   ├── Belfast
│   ├── Belgrade
│   ├── Berlin
...

旧版本 Jenkins 可通过外部脚本或 API 来实现时区感知的调度。

8. 总结

本文介绍了 Jenkins 中任务调度的多种方式:

  • 定时任务(Build periodically);
  • SCM 轮询任务(Poll SCM);
  • Pipeline 任务结合 SCM Webhook;
  • 使用 Jenkinsfile;
  • 时区感知的调度。

通过这些方法,我们可以灵活地控制任务的执行时机,从而更好地集成到 CI/CD 流程中。

如果你希望任务在代码变更时自动构建,推荐使用 Webhook + Pipeline 的方式;如果只是定时执行,使用 cron 即可。对于多团队协作项目,使用 Jenkinsfile 是更推荐的做法。


原始标题:Scheduling a Job in Jenkins