1. 简介
Jenkins 是一个强大的自动化服务器,提供了多种方式来调整任务参数、执行条件等。在本文中,我们将介绍几种在 Jenkins 中调度任务的方法。
我们将从一个最简单的任务开始,比如输出一段文本消息。然后逐步演进到通过代码仓库(如 GitHub、Bitbucket 等)中的变更自动触发任务。最后,我们还会讨论如何在任务调度中考虑时区的问题。
2. 初始配置
在开始之前,我们假设以下几点:
- Jenkins 的全局工具配置中已添加了名为
JDK9.0.1
和Maven3.5.2
的 JDK 与 Maven; - 已有一个配置好的 Maven 项目托管在 Bitbucket 或其他 SCM 仓库中,并且我们有访问权限;
- Jenkins 已正确安装并运行。
如果与你的环境不一致,可以根据实际情况修改示例中的配置名称。
3. 调度一个简单任务
在 Jenkins 中创建一个自由风格任务(Freestyle Project),进入其配置页面,找到 Build Triggers 部分。
勾选 Build periodically,此时会出现一个 Schedule 输入框。我们可以在此输入符合 cron 格式的调度规则。
例如,输入:
*/2 * * * *
表示每两分钟执行一次任务。
✅ 提示:点击输入框旁的问号图标,可以查看 cron 表达式说明。
保存后,任务将在两分钟内开始第一次执行。一段时间后,在任务的 Build History 中可以看到多个构建记录。
4. 创建一个轮询 SCM 的任务
接下来,我们创建一个任务,它会定期轮询 SCM 仓库(如 Bitbucket),并在检测到变更时执行构建。
4.1 构建触发器配置
在 Build Triggers 部分,取消勾选 Build periodically,改为勾选 Poll SCM。
在 Schedule 输入框中填写:
*/5 * * * *
表示每 5 分钟轮询一次仓库。
4.2 仓库配置
在 Source Code Management 部分选择 Git,填写仓库地址,并点击 Add 添加凭据。
选择 Username with Password 类型,填写用户名和密码。
选择刚刚添加的凭据,并确保分支为 */master
。
4.3 构建脚本
在 Build 部分添加一个 Execute Shell 步骤,输入:
mvn clean install
保存任务后等待 5 分钟,任务应自动执行一次构建。
查看 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 插件)。
5.3 Pipeline 脚本配置
在 Pipeline 部分选择 Pipeline Script,点击 Pipeline Syntax 链接生成脚本。
生成以下脚本片段:
checkout: General SCM
:生成代码拉取脚本;withMaven: Provide Maven environment
:配置 Maven 环境;node: Allocate node
和stage: 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 输入框中。
5.4 配置 Webhook
登录 Bitbucket,进入仓库设置页面,找到 Webhooks,添加一个新的 Webhook:
- 标题随意;
- URL 应为 Jenkins 提供的 webhook 接口地址,格式为:
http://jenkins-url/bitbucket-hook/
⚠️ 注意结尾必须有斜杠 /
。
选择 Repository Push 事件作为触发条件。
GitHub 的配置类似,可参考 GitHub Webhooks 文档。
5.5 测试运行
提交一次代码变更后,Jenkins 应自动触发构建。查看 Build History,可以看到新的构建任务,状态为 pending。
构建完成后,查看 Console Output,应显示如下信息:
6. 使用 Jenkinsfile 的任务
我们还可以将 Pipeline 脚本写在项目仓库中的 Jenkinsfile
中,而不是直接在 Jenkins 配置里写脚本。
6.1 创建 Pipeline 任务
新建一个 Pipeline 任务,命名为 PipelineWithJenkinsfile
。
在 Pipeline 部分选择 Pipeline script from SCM,SCM 选择 Git,填写仓库地址和凭据。
确保 Script Path 默认为 Jenkinsfile
。
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 是更推荐的做法。