引言
1. 为什么要改成自动部署?
多人协作开发中成果无法实时展现、项目发布过程繁琐周期长
2. 需要什么准备工作?
支持脚本打包的项目,自动部署工具jenkins,发布、备份、监控的脚本
下载分流jenkins下载
jenkins是什么
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
jenkins安装、配置
太多类似文章了此处不再大动篇幅,博主仅推荐几篇以作参考
jenkins安装(推荐使用war包运行 不受环境限制)
https://blog.csdn.net/achi010/article/details/93708768
jenkins配置
https://www.jianshu.com/p/5f671aca2b5a
jenkins邮件配置
https://www.cnblogs.com/peachh/p/9740069.html
https://www.cnblogs.com/imyalost/p/8781759.html
改造案例
环境
window10发布到centos7 tomcat8+svn+maven/nodejs两个项目
改造思路
jenkins配置
Configure System
邮件功能需要支持smtp的邮箱,本处以qq邮箱为例,具体如何申请可参考下文
https://jingyan.baidu.com/article/0f5fb099dffe7c6d8334ea31.html
邮件模板参考
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本邮件由系统自动发出,无需回复!<br/>
各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br>
<td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建状态: ${BUILD_STATUS}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
<h4><font color="#0B610B">失败用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>
<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
</td>
</tr>
</table>
</body>
</html>
Global Tool Configuration
后端项目配置(maven构建)
svn配置
测试环境适合根据代码的更新情况去发布(下图是5分钟监测一次代码更新),正式环境可以改用Build periodically定时发布
由于jenkins的svn插件有bug导致更新失败,需要增加一个代码更新步骤
发布脚本后续会贴出
构建的邮件通知(默认就行,如有需要增加收件人可以在系统全局设置或者配置更多收件人)
前端项目(nodejs构建)
代码更新、构建触发器、邮件 部分同上
发布脚本
项目打包改造
后端项目springboot打包改造
默认为dev打包 通过mvn clean package -P prod 不加-P默认dev
<profiles>
<!--mvn clean package -P prodzzt-->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<active>dev</active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<active>prod</active>
</properties>
</profile>
</profiles>
前端项目npm打包不是特别清楚仅记录一个可能的问题 通过npm run auto执行
去除打包分析插件 防止打包完成后继续保留待命状态
题外:gradle打包可以参考 通过gradle clean war -Dprofile=test执行不加-Dprofile默认develop
//设置配置文件
def env = System.getProperty("profile") ?: "develop"
def date = new Date().format("yyyy-MM-dd")
sourceSets {
main {
resources {
srcDirs = ["src/main/resources/common", "src/main/resources/$env"]
}
}
}
processResources {
from('src/main/java') {
include '**/*.properties'
include '**/*.xml'
//exclude "**/*.java"
}
}
task copyTask(type: Copy) {
from ('src/main/java'){
include '**/*.properties'
include '**/*.xml'
}
into "build/classes/java/main"
}
processTestResources.dependsOn copyTask
/*task copyTask(type: Copy) {
println "$projectDir/src/main/resources/$env/"
println "$webAppDir/properties"
from "$projectDir/src/main/resources/$env/"
include '*.properties'
into "$webAppDir/properties"
}*/
war{
//dependsOn copyTask
from("src/main/resources/$env") {
include "web*.properties"
into("properties")
}
if(env!="develop"){
archiveName "project-$env-$date"+".war"
}else{
archiveName "project-$version-$env"+".war"
}
//archiveName "project-$version-$env-$date"+".war"
}