<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
之前的文章中 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 "應用健康執行" } } } } }
執行啟動應用的指令碼後,並不知道應用是否真正的啟動起來了。這個時候需要一個健康檢查機制檢查下應用的健康狀況,這裡涉及到一個小技巧以及兩種健康檢查的方式
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指令碼jenkinsfile操作指南
通過這三篇jenkins pipeline的系列文章,相信你已經入門pipeline流式構建的指令碼編寫了,基於groovy指令碼建模非常靈活,基於此我們可以新增更多的玩法,比如健康檢查成功後,通過一些即時通訊工具通知構建的結果,如微信,釘釘等。圍繞持續整合ci/cd肯定還有很多很多的場景,歡迎在下方留言一起探討。
以上就是構建及部署jenkins pipeline實現持續整合持續交付指令碼的詳細內容,更多關於jenkins pipeline實現持續整合持續交付指令碼的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45