Jenkins自動化部署-----持續交付
前言:
感謝之前帶領過我的leader,讓我能夠知道什麼是好的開發方法。
在很早之前就接觸過敏捷開發。什麼是敏捷開發,簡單來說就是讓軟體可靠地,快速地釋出出來的一種開發方法和技巧。
而敏捷開發中有許多的實踐,可能並不是每一種實踐都適合於你的團隊,但是總有一種能幫助你們的團隊快速地將軟體可靠地,高可用地釋出出來。
如果在讀這篇文章之前,還沒有接觸過敏捷開發,那麼推薦一門敏捷開發入門的書籍:《硝煙中的scrum和xp》,這本書是一本敏捷開發的入門入籍,介紹了諸如:產品如何編寫backlog、怎麼準備sprint計劃、如何做回顧、如何做測試、如何管理scrum團隊等基礎的一些敏捷知識。這本書幫助了很多人瞭解了敏捷開發,是一本很經典的敏捷入門引導書。
chapter 1: 為什麼要使用持續交付
在我們的開發部署工作中,有一些典型的反人類釋出軟體模式:
1.手工部署軟體
無論是自己編寫的系統,還是系統所需的一些軟體:mysql、redis、git等,統統都是用手動部署的方式,每次需要釋出、更新,都要連線到伺服器上,手動地部署其新版本(例如:先將本地的war包上傳到伺服器的tomcat中,然後伺服器上kill -9 xxx,重新啟動tomcat這樣),23333。。且不說這樣部署的人力成本很大,不知道部署的軟體是否有bug。並且還有一定的出錯機率,在網際網路競爭如此激烈的今天,這樣的部署,肯定是不行的。
試想,如果有一種方法,當你本地Push程式碼之後,只需要在網頁上點選一個按鈕,或者點選按鈕這一步都省略掉,再倒上一杯咖啡,你的系統已經部署到線上環境了,這樣的自動化,不是更人性化嗎
2.開發完成後才向類生產環境部署
很多團隊表示,我們一定要把系統全部coding完成,才向(類)生產環境部署系統,這樣有一個好處,就是大家更加專注於coding。不被打擾。但是也有一個壞處,就是無法及時反饋出系統中的問題,你的boss也無法知道系統究竟開發到什麼程度,boss也無法向客戶/他的boss展示專案的程序。
及時反饋在軟體開發中是非常重要的,反饋得及時,能幫助軟體能快速發現並解決掉軟體中很多典型的問題:
(1)開發出的功能和boss想要的功能不一樣
(2)軟體開發中沒被發現的bug
(3)頁面實現和UI設計不一致等等。。。
那麼有的人就會說,每部署一次都非常麻煩,需要打包、上傳、部署配置、部署系統,而且容易出錯。一旦部署失敗,還要去看日誌,找到bug並且修復後,重複以上的全部操作。
今天我們要講解的jenkins就是解決這個問題的,只需要點選一個按鈕就可以部署git上的程式碼,是不是特別方便。
3.生產環境純手工配置管理
將配置檔案、變數都通過手工的方式去部署是非常不科學的,這不僅需要一個部署專家,若是哪天這個專家請假或者離職,那麼你們的團隊便無法部署了。而且手工部署還極其容易出錯,多臺伺服器,需要多次重複部署。
自動化是必然的趨勢,那麼典型的解決方案就是使用某個配置管理軟體,或者將配置放在某個具體的指令碼中,這樣會使軟體釋出輕鬆很多
chapter 2: jenkins介紹
jenkins是一個開源軟體專案,基於java開發的一款持續整合(Continuous Integration)工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。
一切的目的都是快速反饋。
喏,下面就是這貨的圖示
猥瑣中帶著一絲優雅,23333。
jenkins的標語:
“Build great things at any scale”
“以任何規模建造偉大的事情”
Jenkins,之前叫做Hudson,所以如果你在jenkins的很多地方,看到hudson這個單詞,一定要知道他是jenkins的舊名字。
Jenkins是基於Java開發的一種持續整合工具,用於監控秩序重複的工作,包括:
1)、持續的軟體版本釋出/測試專案。
2)、監控外部呼叫執行的工作。
下面是一個官網的簡單圖形介紹:
chapter 3: jenkins安裝和配置
上面介紹了那麼多,估計你也沒看,我們關心的只有軟體的使用方法(23333)。那麼我們下面就進入jenkins的安裝和配置
環境準備:
首先,你的機器上面,需要安裝jdk、git、maven相關的執行環境,我這裡使用的jdk1.8、maven3.3.9、git2.16.2
jenkins安裝:
下載地址https://jenkins.io/download/,僅下載war包。這個下載就不需要截圖了吧。
得到war包後,有兩種執行jenkins的方式
1.將war包放在tomcat的webapps目錄下,啟動tomcat
2.命令啟動 java -jar 下載的war包名.war --httpPort=9004
第二種方式啟動後,會在/home/xxxxx/.jenkins資料夾下構建jenkins的目錄。
你想知道第一種在哪構建這個目錄?我也不知道,自己試試咯,啟動後日志中有顯示位置
用瀏覽器訪問http://localhost:9004 (tomcat啟動,訪問http://lcoalhost:9004/jenkins),得到以下頁面
然後輸入密碼就可以了。。
密碼,你不知道什麼密碼?圖片中紅色的部分不是已經說了密碼在哪裡了嗎。開啟檔案,copy,paste就行了。
接下來就到了外掛配置頁面,建議翻牆進行安裝所需要的外掛,或者現在直接選擇skip plugin installations跳過
設定成功之後,就跳轉到使用者名稱密碼配置頁面,這個使用者名稱和密碼用於以後的jenkins登入
這是你之後用來登入的使用者名稱密碼,最好記住哦~
噹噹噹當~~到這裡,你的Jenkins已經配置成功了,成功進入jenkins的主頁了!恭喜恭喜
那麼接下來,我們就要開始搭建自動化部署的pipeline了。
什麼,你說什麼是Pipeline?好吧,簡單講解一下
喏,就是上面這貨,三個模組,第一個模組是構建模組,用來執行單元測試+build專案形成二進位制檔案,由於我使用的是Springboot,所以得到的是一個jar包。第二個模組是部署模組,當第一個模組構建成功(變綠),才會觸發第二個模組,如果第一個模組單元測試或者執行失敗,當前模組就會變紅,那麼就不會執行第二個模組,當然,這個觸發是自己配置的。第三個模組,就是線上環境了,第二個模組執行成功後,就開始執行第三個模組。
當你push了程式碼之後,只需要點選上面的Run那個按鈕,你的系統就已經部署到線上了,是不是很神奇。
你想要搭建這個玩意,首先,你需要給Jenkins安裝幾個外掛,點選這裡安裝外掛
進去了之後,根據下圖進行安裝外掛哦
你需要安裝的外掛有:
Build pipeline Plugin:沒有這個,就沒有PipeLine檢視
Build Time Out:構建超時外掛
Deploy to Container Plugin:部署容器外掛
Email Extension Plugin:傳送郵件外掛
Git
JDK Tool Plugin
PipeLine
Publish over ssh
Timestamper
Workspace Cleanup Plugin
安裝好以上外掛後,進入上圖的installed,勾選上以上的這些外掛,使其開啟使用。
配置好上述外掛,接下來我們就要來配置JDK,Maven,git環境了
注意:這些環境必須配置。
(這裡有一個小小的插曲,當初我並沒有配置這些環境,以為Jenkins預設帶有的這些外掛環境可以生效,傻傻地執行等待了兩個小時。然而事實證明,並沒有什麼卵用,必須要配置這些東西。)
在上上張圖中,點選
進行配置
你需要配置以下的東東,首先是JDK
將JDK配置到相應的bin目錄上級,也就是你的$JAVA_HOME位置
然後配置Git
注意:這個git有點日怪,他不是配置到bin目錄上級,需要配置到具體的可執行檔案位置!看上圖中的文字Path to git executable。如果換成Java的話,就應該配置$JAVA_HOME/bin/javac 這個級別的,可執行檔案~
最後配置Maven
這裡也是配置MAVEN_HOME哦。到bin目錄上級就可以了
在配置maven的setting.xml時,建議加上阿里的mirror,這樣執行時,下載依賴的速度可以快幾倍
在setting.xml中的<mirrors>標籤中新增以下程式碼即可
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
上述的Maven、JDK、Git軟體安裝就不再贅述。自行百度。
一切配置成功後,最好重啟下jenkins使上面的外掛和環境生效,接下來開始構建Pipeline
回到首頁,點選new Item 先建立個資料夾,方便以後多個專案分組方便
新增資料夾後,你的首頁上就會多出一個資料夾
其中outer是我資料夾的名字,名字隨意就好
點選outer進入資料夾
再點選左側的New Item ,然後建立Maven專案
點選OK後進入配置頁面、這裡有幾個地方需要配置
先配置你的原始碼所在git位置,branch specifier可以選擇你程式碼的分支
general中配置,顯示幾天的幾個版本的以前的構建資訊,方便檢視錯誤日誌
Build Triggers中。勾選Poll SCM中的Schedule,這裡需要配置一個五位數的表示式
分別代表:分鐘,小時,天,月,星期幾
例如配置: 5 * * * * 代表每個小時的第五分鐘構建
0 0 10 * * 代表每個月10號構建
這個表示式有點像Spring task中的schedule表示式,不清楚的可以去百度瞭解一下
配置maven的位置以及執行maven的命令,有機智的小夥伴就發現,為什麼要使用Maven的package命令,而不是直接spring-boot:run執行呢。呵呵,我試過,執行後會直接阻塞,PipeLine壓根看不到結果是否成功,也沒法結束。所以只能先打包再執行,執行指令碼在第二個模組中
勾選這玩意兒,用於刪除以前的專案
最後重點來了,就是下面這貨。這個等下再講,先配置上就行了。
第一步的Maven Project已經構建成功。接下來回到outer資料夾中,選擇New Item ,建立一個freestyle project
build中填寫:
BUILD_ID=dontKillMe nohup java -jar /Users/xiangnan/.jenkins/workspace/outer/test_project/target/BootRedis-0.0.1-SNAPSHOT.jar &
BUILD_ID=dontKillMe nohup + & 的意思是讓其springboot執行成功後,到後臺去執行,不阻塞當前的pipeline。
當然,這裡的指令碼只是一個最簡單的命令執行指令碼,你也可以將指令碼放在git中,或者放在伺服器上,每次構建就拉取新的指令碼並且執行。這是一種思路,指令碼的使用可以非常靈活,不一定需要直接執行jar包。
到這裡,我們的兩個專案就已經構建成功了。但是到現在還沒有PipeLine的展示
回到outer資料夾中,點選+按鈕,選擇build Pipeline View,並輸入pipeline的名字
接下來進入pipeline的配置頁面,在這個頁面中,在pipeline flow的upstream項,選擇之前的maven專案,我的是test_project
最後點選OK。大功告成,你將看到如下頁面
這就是我們前文中提到的Build PipeLine。點選Run即可從git上拉程式碼並執行專案到當前機器中了哦。
先執行第一個test_project,當第一個模組執行單元測試、打包成功後,才會觸發執行第二個模組--即部署springboot.jar
那麼是怎麼觸發的呢
我們回到之前沒有講解的一張圖
在途中我們配置了幾個地方,
Projects to build:當專案構建完成,生成war包後,出發哪個專案
Trigger when build is : stable -- 只有當前專案構建成功後,才開始構建下一個freestyle project
除了stable還有其他的幾個選項,
根據需要進行選擇需要什麼條件去觸發下一個模組。例如:Failed,當失敗時構建下一個專案
Predefined parameters: 預定義變數,必配
只有配置了預定義變數,才能根據${BUILD_NUMBER} -- 構建號,${GIT_COMMIT}--git提交的版本號,根據這兩個變數去觸發下一個模組,沒有這個配置,就無法觸發下一個模組.
總結:
以上。整個Pipeline就部署完成了。但是其實這只是部署的一個入門,提供了一個思路,Jenkins還有很多其他的功能,例如構建失敗時傳送郵件,自定義指令碼,git程式碼Push完成後立即觸發Run等等,Jenkins非常的靈活,功能也非常多,等待你自己去探索。
感謝閱讀此文章。