一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - 構建及部署jenkins pipeline實現持續集成持續交付腳本

構建及部署jenkins pipeline實現持續集成持續交付腳本

2022-03-01 22:39kl 服務器知識

這篇文章主要為大家介紹了構建及部署jenkins pipeline實現持續集成持續交付腳本,喲需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

構建及部署jenkins pipeline實現持續集成持續交付腳本

前言

之前的文章中,已經全面介紹過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 [email protected] "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接口,如果應用健康,會返回如下數據

構建及部署jenkins pipeline實現持續集成持續交付腳本

2.檢查應用運行進程:當有些服務沒有使用http容器時,如dubbo服務。需要使用檢查應用進程的方式來檢查應用是否啟動了,具體方式如下:

stage("check health") {
            steps {
                script {
                    def healthUrl = null
                    if ("production" == "${profile}") {
                        healthUrl = "ssh [email protected] "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沙箱中運行,如:

構建及部署jenkins pipeline實現持續集成持續交付腳本

具體的安全策略異常如下:

[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實現持續集成持續交付腳本的資料請關注服務器之家其它相關文章!

原文地址:http://www.kailing.pub/article/index/arcid/205.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91香蕉国产视频 | 亚洲视频在线观看地址 | 亚洲人成毛片线播放 | 日韩中文在线 | 调教麻麻成贱m | 97国产蝌蚪视频在线观看 | 黄色大片免费网站 | 2019理论韩国理论中文 | 欧美日韩亚洲国内综合网香蕉 | 高黄h文各种play | 91精品国产一区 | 情侣宾馆愉拍自拍视频 | 国产精品最新资源网 | 国产里番 | 欧美va天堂va视频va在线 | 369看片网 | 万域之王动漫在线观看全集免费播放 | 精品欧美一区二区精品久久 | 欧美精品国产一区二区 | 2021小妲己永久回家地址 | 秋霞啪啪网 | 成年性香蕉漫画在线观看 | 亚洲国产99在线精品一区二区 | 日本丰满www色 | 久久精品国产只有精品 | 日韩欧美一区二区三区视频 | 成人网免费视频 | 被教官揉了一晚上的奶小说 | 91女神在线观看 | 情趣内衣在线观看 | 欧美性野久久久久久久久 | 亚洲系列国产精品制服丝袜第 | 亚洲+欧美+国产+综合 | 波多野结衣 在线播放 | 日韩高清在线高清免费 | 天天综合色天天综合色sb | 国产精品高清视亚洲一区二区 | www.四色 | 校园春色偷拍自拍 | 亚瑟天堂久久一区二区影院 | 九九99亚洲精品久久久久 |