每次手动打包部署累成狗?Jenkins的计划构建功能能让你准时下班,告别996。
简单来说,Jenkins计划构建就是给你的构建任务设置一个"闹钟",当闹钟响起时,Jenkins会自动执行你预设的构建任务。这就像是雇佣了一个不知疲倦的机器人助手,它会在你设定的时间点准时开始工作,无论是深夜、周末还是节假日。
计划构建在实际项目中有着广泛的应用场景:
每日夜间构建:在代码提交较为频繁的开发阶段,可以设置夜间自动构建,第二天早上团队就能看到最新版本的构建结果和测试报告。定期测试执行:对于需要长时间运行的测试套件,可以安排在周末或系统空闲时段执行。发布版本自动化:在固定发布周期的项目中,可以提前设置发布构建任务,到点时自动打包和部署。依赖资源可用性检查:定期检查项目依赖的外部资源是否可用。Jenkins提供了多种类型的计划构建方式,每种都有其适用场景,让我们一起来了解一下。
定时构建是最基本也是最常用的计划构建方式,它使用类UNIX的cron表达式来定义执行时间。想象一下,这就像是给你的构建任务设置一个高级版日历闹钟,不仅可以设置每天响铃,还能设置复杂的规则,比如"每周一到周五的上午10点和下午4点"。
在Jenkins任务配置页面中,找到"构建触发器"部分,勾选"Build periodically"选项,然后在"日程表"输入框中填写cron表达式即可。
Cron表达式格式
Jenkins使用的cron表达式由5个字段组成,字段之间用空格或制表符分隔:
分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期几(0-7,0和7都代表星期日)
Cron特殊符号
*:匹配所有值。例如
* * * * *表示每分钟执行一次。
H:散列值,用于负载均衡。例如
H * * * *表示每小时执行,但不会与其他使用相同表达式的任务同时运行。
/X:间隔步进。例如
H/15 * * * *表示每隔15分钟执行一次。
A,B:枚举多个值。例如
0 10,16 * * *表示每天上午10点和下午4点执行。
定时构建示例
H/30 * * * *:每30分钟构建一次
H H/2 * * *:每2小时构建一次
0 8 * * *:每天早上8点构建一次
0 8,12,22 * * *:每天的8点、12点、22点,一天构建3次
H/3 0-23 * * 1-5:每3分钟构建一次,每天0点至23:59,周一至周五执行该任务
轮询SCM与定时构建类似,但它只会在检测到源码变更时才触发构建。这就像是安排了一个聪明的保安,他不仅会按时巡逻,而且只在发现有人进入大楼时才拉响警报。
在"构建触发器"部分勾选"轮询SCM",然后同样使用cron表达式设置检查频率。
示例:
H/5 * * * *:每5分钟检查一次源码变化
这种方式的优点是避免了不必要的构建,节省了资源,特别适合在代码提交不频繁的项目中使用。
对于需要更底层控制或者跨系统触发的场景,可以通过系统级cron服务调用Jenkins API来实现计划构建。
操作步骤:
获取Jenkins任务的API Token:登录Jenkins → 点击用户头像 → Configure → API Token → 生成新token编辑系统cron文件:运行
crontab -e,添加如下行(以每天凌晨2点执行任务为例):
0 2 * * * /usr/bin/curl -X POST "http://your_server_ip:8080/job/your_job_name/build?token=YOUR_API_TOKEN"
其中
your_server_ip为Jenkins服务器IP,
your_job_name为任务名称,
YOUR_API_TOKEN为生成的token
如果Jenkins启用了身份验证,需在curl命令中添加用户名和API token(如
-u username:api_token)。
对于基于Pipeline的现代Jenkins任务,可以直接在Jenkinsfile中使用triggers指令定义定时任务。这种方式将调度逻辑与代码绑定,便于版本管理和团队协作。
示例:
pipeline {
agent any
triggers {
cron('H 10 * * 1-5') // 周一到周五10点执行
}
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
}
}
理论说了这么多,现在让我们亲手创建一个实际的计划构建作业吧!假设我们有一个Python项目,需要每个工作日的上午9点自动运行测试。
在General部分,你可以填写项目描述,设置构建保留天数等。
在"源码管理"部分,选择Git或SVN,并配置仓库地址和凭证。
使用Git:输入Repository URL,可以是SSH或HTTPS格式使用Svn:在Repository URL输入项目的svn地址,在凭证里添加用户名、密码即可找到"构建触发器"部分,勾选"Build periodically",在日程表中输入:
0 9 * * 1-5
这表示在每周一到周五(1-5)的上午9点执行构建。
在"构建"部分,点击"增加构建步骤",选择"执行Shell"(Linux/Mac)或"执行Windows批处理命令"(Windows)。
对于我们的Python示例项目,可以输入:
# 切换到测试脚本所在路径
cd test_pytest/tests/
# 执行pytest测试用例
python3 -m pytest test_ui.py
在"构建后操作"部分,你可以添加各种后续操作,例如:
发布HTML报告:配置Publish HTML reports插件,展示测试报告发送邮件通知:使用Editable Email Notification插件,将构建结果发送给相关人员点击"保存",然后你可以立即点击"立即构建"手动触发一次构建,测试配置是否正确。
在复杂的构建流程中,可能需要执行多个步骤。Jenkins Pipeline允许你轻松组合多个步骤。
示例:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Building.."'
sh '''
echo "Multiline shell steps works too"
ls -lah
'''
}
}
}
}
对于不稳定的构建步骤,可以配置重试机制;对于可能长时间挂起的任务,可以设置超时。
示例:
pipeline {
agent any
stages {
stage('Deploy') {
steps {
retry(3) {
sh './flakey-deploy.sh'
}
timeout(time: 3, unit: 'MINUTES') {
sh './health-check.sh'
}
}
}
}
}
上面的示例中,Jenkins会重试
flakey-deploy.sh脚本最多3次,然后给
health-check.sh脚本最多3分钟的执行时间,如果超时则会失败。
你还可以组合这些步骤,例如在总超时时间内重试多次:
pipeline {
agent any
stages {
stage('Deploy') {
steps {
timeout(time: 3, unit: 'MINUTES') {
retry(5) {
sh './flakey-deploy.sh'
}
}
}
}
}
}
在大型项目中,不同构建任务之间可能存在依赖关系。Jenkins允许你配置项目间的触发关系。
配置上游依赖:
在项目B的配置中,进入"构建触发器",选中"其他工程构建后触发",关注的项目输入A,选择适当的触发条件。
配置下游项目:
在项目A的配置中,进入"构建后操作",增加"构建其他工程"步骤,要构建的项目输入B,选择触发条件。
如果需要按照特定顺序执行多个项目,可以创建MultiJob Project。
点击新建任务,选择MultiJob Project在构建部分,增加MultiJob Phase添加需要按顺序执行的Job,选择"按顺序执行"当单个Jenkins节点无法满足构建需求时,可以设置分布式构建,将任务分配到多个节点上执行。
创建节点步骤:
系统管理 → 管理节点点击"新建节点"输入节点名称,选择"固定节点"配置远程工作目录和工具位置节点机器访问Jenkins代理节点页面,下载并启动slave-agent.jnlp文件假设我们有一个Java Web项目,需要实现以下自动化构建流程:
每周一到周六凌晨2点执行每日构建执行完整测试套件生成测试报告只有当测试通过时才打包部署发送构建结果通知Jenkinsfile配置:
pipeline {
agent any
triggers {
cron('0 2 * * 1-6') // 周一到周六凌晨2点执行
}
stages {
stage('Checkout') {
steps {
checkout scm // 从版本控制系统检出代码
}
}
stage('Build') {
steps {
sh 'mvn clean compile' // 使用Maven编译代码
}
}
stage('Test') {
steps {
sh 'mvn test' // 执行测试
}
post {
always {
publishHTML(target: [
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: 'target/surefire-reports',
reportFiles: 'index.html',
reportName: 'HTML Test Report'
]) // 发布HTML测试报告
}
}
}
stage('Package') {
steps {
sh 'mvn package -DskipTests' // 跳过测试(因为前面已执行过)
}
}
stage('Deploy') {
when {
expression { currentBuild.result == null || currentBuild.result == 'SUCCESS' }
}
steps {
timeout(time: 10, unit: 'MINUTES') {
retry(2) {
sh './deploy-to-staging.sh' // 部署到预发布环境
}
}
}
}
}
post {
always {
emailext (
subject: "构建通知: ${currentBuild.fullDisplayName}",
body: """
项目名称:${env.JOB_NAME}
构建编号:${env.BUILD_NUMBER}
构建状态:${currentBuild.result}
构建地址:${env.BUILD_URL}
""",
to: "team@example.com"
) // 发送邮件通知
}
}
}
Jenkins计划构建作业是自动化开发流程中极为重要的一环,它能够让团队从重复性的手动构建中解放出来,提高开发效率,确保构建过程的一致性和可靠性。
通过合理配置计划构建,你可以实现真正的"无人值守"自动化流程,让Jenkins在后台默默工作,而你和团队则可以专注于更有价值的开发任务。
开始动手配置你的第一个Jenkins计划构建作业吧,让自动化构建成为你项目中的忠实助手,带领团队进入高效开发的新阶段!
|
表达式 |
说明 |
适用场景 |
|
|
每15分钟执行一次 |
高频率集成项目 |
|
|
每小时执行一次 |
中等频率项目 |
|
|
周一至周五凌晨2点执行 |
每日夜间构建 |
|
|
每周日凌晨2点执行 |
周度构建 |
|
|
每月1日凌晨1点执行 |
月度发布构建 |