目录
- 前言
- 新增的步骤脚本
- 需要注意的点:
- 关于执行启动应用脚本
- 关于健康检查
- 线程休眠
- 健康检查方式
- 遇到的问题及小技巧
- 小技巧:
- 问题:
- 具体的安全策略异常如下:
- 解决方案:
- 文末结语
前言
之前的文章中,已经全面介绍过jenkins pipeline的特点及用途,以及实操了一把,将我们的构建产物jar包丢到了目标主机。这篇是接着上篇的实操,实现构建即部署的脚本实现。会在之前的git clone(拉源码),maven build(构建),deploy jar(上传jia包)的基础上,在新增两个步骤start app(启动服务),checkhealth(检查应用健康),真正实现持续交付,持续集成。
新增的步骤脚本
stage(\"start app\") {
steps {
script {
if (\"production\" == \"${profile}\") {
sshagent(credentials: [\"deploy_token\"]) {
sh \"ssh it@192.1xx.0.96 \"sh /home/deploy/start.sh > /dev/null 2>&1 &\"\"
echo \"xx系统192.1xx.0.96启动完成\"
}
}
if (\"uat\" == \"${profile}\") {
echo \"xx系统启动完成\"
}
}
}
}
stage(\"check health\") {
steps {
script {
def healthUrl = null
if (\"production\" == \"${profile}\") {
healthUrl = \"https://api.xx.cn:8016/health\"
}
if (\"uat\" == \"${profile}\") {
healthUrl = \"\"
}
echo \"睡眠两分钟,待应用完全准备好\"
Thread.sleep((long) 1000 * 60 * 2)//睡眠两分钟
def shellStr = sh(script: \"curl ${healthUrl}\", returnStdout: true)
def map = null
try {
echo \"应用健康检查结果:${shellStr}\"
map = new JsonSlurper().parseText(shellStr)
} catch (Exception e) {
}
if (map != null && \"UP\" == map.get(\"status\")) {
echo \"应用健康运行\"
} else {
Thread.sleep((long) 1000 * 60 * 1)//睡眠1分钟
shellStr = sh(script: \"curl ${healthUrl}\", returnStdout: true)
map = new JsonSlurper().parseText(shellStr)
if (map == null || \"UP\" != map.get(\"status\")) {
throw new RuntimeException(\"应用不稳定,请检查服务是否正常\")
} else {
echo \"应用健康运行\"
}
}
}
}
}
需要注意的点:
关于执行启动应用脚本
- 部署的脚本需要先在目标主机写好,一般的如果应用是部署在tomcat下的话,直接执行关闭脚本,然后执行启动脚本就好了。
- 不过现在都是微服务,spring boot这种应用直接打成了jar了,需要使用nohup这种方式使进程后台运行,如:nohup java-jar /home/xx-app.jar &。在jenkins中直接调用这种脚本的时候要注意。使用> /dev/null 2>&1 &将远程主机响应重定向下,不然jenkins进程会一直等待目标主机的启动脚本进程内容输出。
关于健康检查
执行启动应用的脚本后,并不知道应用是否真正的启动起来了。这个时候需要一个健康检查机制检查下应用的健康状况,这里涉及到一个小技巧以及两种健康检查的方式
线程休眠
jenkins的构建步骤执行到健康检查时,需要让线程休眠1~2分钟左右,等待应用完全启动。第一次健康检查如果失败了,有可能是应用没有完全启动,在休眠指定时间,如果还是失败了,那么久判定这个应用启动失败,抛出异常,让这次ci结束并标记失败
健康检查方式
1.http接口的方式:如上,使用了应用内提供的一个健康检查接口,去执行http的接口,然后拿到结果判定,一般spring boot提供了健康检查的接口, 只需要添加如下依赖,spring-boot-starter-actuator,应用就会多一个/health接口,如果应用健康,会返回如下数据
2.检查应用运行进程:当有些服务没有使用http容器时,如dubbo服务。需要使用检查应用进程的方式来检查应用是否启动了,具体方式如下:
stage(\"check health\") {
steps {
script {
def healthUrl = null
if (\"production\" == \"${profile}\") {
healthUrl = \"ssh it@192.xxx.10.159 \"ps -ef|grep xx-service\"\"
}
if (\"uat\" == \"${profile}\") {
healthUrl = \"\"
}
echo \"睡眠两分钟,待应用完全准备好\"
Thread.sleep((long) 1000 * 60 * 1)//睡眠1分钟
String shellStr = sh(script: \"${healthUrl}\", returnStdout: true)
echo \"应用健康检查结果:${shellStr}\"
if (shellStr.indexOf(\"/home/xx-service-1.0.0-\") > 0) {
echo \"应用健康运行\"
} else {
Thread.sleep((long) 1000 * 60 * 1)//睡眠0.5分钟
shellStr = sh(script: \"${healthUrl}\", returnStdout: true)
if (shellStr.indexOf(\"/home/xx-service-1.0.0-\") > 0) {
echo \"应用健康运行\"
} else {
throw new RuntimeException(\"应用不稳定,请检查服务是否正常\")
}
}
}
}
}
遇到的问题及小技巧
小技巧:
可以将jenkinsfile文件加上.groovy的后缀,因为jenkinsfile的脚本搬来就是Groovy实现的。然后在IDE里写脚本的时候就会有智能提示,而且会语法校验。记得在添加构建任务的时候也加上.groovy,默认是没有的
问题:
在声明式的jenkinsfile写有些Groovy脚本会触发jenkins的脚本执行安全策略,而脚本模式下不会有这个问题,因为脚本模式可以选择在Groovy沙箱中运行,如:
具体的安全策略异常如下:
[Pipeline] // node Scripts not permitted to use new java.lang.Object. Administrators can decide whether to approve or reject this signature. [Pipeline] End of Pipeline org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.lang.Object at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectNew(StaticWhitelist.java:184) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onNewInstance(SandboxInterceptor.java:148) at org.kohsuke.groovy.sandbox.impl.Checker$3.call(Checker.java:197) at org.kohsuke.groovy.sandbox.impl.Checker.checkedConstructor(Checker.java:202) at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.constructorCall(SandboxInvoker.java:21) at WorkflowScript.run(WorkflowScript:58)
解决方案:
安装插件permissive script security plugin,然后配置下jenkins.xml,加入-Dpermissive-script-security.enabled=true。重启jenkins就好了
文末结语
通过这三篇jenkins pipeline的系列文章,相信你已经入门pipeline流式构建的脚本编写了,基于groovy脚本建模非常灵活,基于此我们可以新增更多的玩法,比如健康检查成功后,通过一些即时通讯工具通知构建的结果,如微信,钉钉等。围绕持续集成ci/cd肯定还有很多很多的场景,欢迎在下方留言一起探讨。
以上就是构建及部署jenkins pipeline实现持续集成持续交付脚本的详细内容,更多关于jenkins pipeline实现持续集成持续交付脚本的资料请关注快网idc其它相关文章!
原文地址:http://www.kailing.pub/article/index/arcid/205.html
相关文章
- 服务器虚拟化技术深度科普 2025-05-27
- 服务器租用价格怎么计算?服务器租用多少钱一年? 2025-05-27
- 云服务器的“弹性”体现在哪些方面? 2025-05-27
- 刀片服务器是什么 刀片服务器的主要特点 2025-05-27
- 利用FTP和计划任务自动备份网站数据和数据库 2025-05-27
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
以示例讲解Clickhouse Docker集群部署以及配置
2025-05-27 97 -
2025-05-27 21
-
宝塔面板网站防跨站攻击open_basedir无法关闭解决办法
2025-05-26 70 -
基于Spring Security的身份验证与授权框架构建指南
2025-05-26 52 -
2025-05-26 62




