构建及部署jenkins pipeline实现持续集成持续交付脚本

 更新时间:2022年03月01日 15:24:54   作者:kl  
这篇文章主要为大家介绍了构建及部署jenkins pipeline实现持续集成持续交付脚本,哟需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

前言

之前的文章中  jenkins插件Pipeline脚本jenkinsfile操作指南

已经全面介绍过jenkins pipeline的特点及用途,以及实操了一把,将我们的构建产物jar包丢到了目标主机。这篇是接着上篇的实操,实现构建即部署的脚本实现。会在之前的git clone(拉源码),maven build(构建),deploy jar(上传jia包)的基础上,在新增两个步骤start app(启动服务),check health(检查应用健康),真正实现持续交付,持续集成。

新增的步骤脚本

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集成持续交付管道全面介绍

jenkins插件Pipeline脚本jenkinsfile操作指南

通过这三篇jenkins pipeline的系列文章,相信你已经入门pipeline流式构建的脚本编写了,基于groovy脚本建模非常灵活,基于此我们可以新增更多的玩法,比如健康检查成功后,通过一些即时通讯工具通知构建的结果,如微信,钉钉等。围绕持续集成ci/cd肯定还有很多很多的场景,欢迎在下方留言一起探讨。

以上就是构建及部署jenkins pipeline实现持续集成持续交付脚本的详细内容,更多关于jenkins pipeline实现持续集成持续交付脚本的资料请关注脚本之家其它相关文章!

相关文章

  • Flink 侧流输出源码示例解析

    Flink 侧流输出源码示例解析

    这篇文章主要为大家介绍了Flink 侧流输出源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • rsync只同步指定目录的方法(已测)

    rsync只同步指定目录的方法(已测)

    今天在配置文件同步的时候,只需要同步指定目录,因为一些目录是不需要同步的而且数量比较大,这里简单分享下–include参数的使用
    2015-01-01
  • 使用idea搭建springboot initializer服务器的问题分析

    使用idea搭建springboot initializer服务器的问题分析

    这篇文章主要介绍了使用idea搭建springboot initializer服务器的问题分析,本文给大家分享大家过程通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • DNSLOG平台搭建及其原理解析

    DNSLOG平台搭建及其原理解析

    DNSlog就是存储在DNS Server上的域名访问信息,它记录着用户对域名littlehann.com等的访问信息,类似日志文件,这篇文章主要介绍了DNSLOG平台搭建及其原理分析 ,需要的朋友可以参考下
    2024-01-01
  • nexus服务器搭建的详细步骤

    nexus服务器搭建的详细步骤

    这篇文章主要介绍了nexus服务器搭建的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 在CentOS6.5上使用Jexus安装部署ASP.NET MVC4和WebApi

    在CentOS6.5上使用Jexus安装部署ASP.NET MVC4和WebApi

    本文主要介绍如何在CentOS6.5安装Jexus,并介绍其常用命令以及如何创建和部署ASP.NET MVC4项目,从而实现跨平台部署。
    2016-05-05
  • 关于GitLabAPI的详细使用教程

    关于GitLabAPI的详细使用教程

    这篇文章主要介绍了关于GitLabAPI的详细使用教程,GitLab作为一个开源、强大的分布式版本控制系统,目前已经被广泛使用,还不会的朋友可以一起来看看
    2023-03-03
  • 开源SFTP服务器软件SFTPGo详解

    开源SFTP服务器软件SFTPGo详解

    SFTPGo 是一种事件驱动的文件传输解决方案,使用 SFTPGo,您可以利用本地和云存储后端,使用您已经熟悉的相同工具和流程在内部或与业务伙伴交换和存储文件,这篇文章给大家介绍开源SFTP服务器软件SFTPGo的相关知识,感兴趣的朋友一起看看吧
    2024-08-08
  • IIS防盗链 ISAPI Rewrite图片防盗链规则写法

    IIS防盗链 ISAPI Rewrite图片防盗链规则写法

    经过恶补正则表达式相关教程并对前辈们留下的规则进行修改后,以下ISAPI Rewrite已经在我的服务器上正常运作
    2012-03-03
  • WIN10安装VC6.0无法使用的解决办法

    WIN10安装VC6.0无法使用的解决办法

    这篇文章主要介绍了WIN10安装VC6.0无法使用的解决办法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10

最新评论