訓(xùn)練營往期回顧:
Day One 之理念篇: DevOps與敏捷,用戶故事地圖,價值流圖
Day One 之實操篇--產(chǎn)品規(guī)劃,定制看板,生成迭代計劃
Day Two -- Part2: 設(shè)計提交規(guī)范,代碼評審規(guī)范,設(shè)計提交流水線
注: 今天的實操課程涉及到購買百度云BCC資源, 請大家提前聯(lián)系講師申請代金券
原理: 從持續(xù)集成到持續(xù)部署
開發(fā)和發(fā)布軟件可能是一個復(fù)雜的過程,尤其是當(dāng)應(yīng)用程序,團(tuán)隊和部署基礎(chǔ)架構(gòu)本身變得復(fù)雜時。通常,隨著項目的發(fā)展,挑戰(zhàn)變得更加明顯。為了以快速一致的方式開發(fā),測試和發(fā)布軟件,開發(fā)人員和組織需要創(chuàng)建了三種相關(guān)但不同的策略來管理和自動化這些過程。
持續(xù)集成的重點是每天多次將各開發(fā)人員的工作集成到主存儲庫中,及早捕獲集成錯誤并加速協(xié)作開發(fā)。持續(xù)交付要減少部署或發(fā)布過程中的摩擦,自動執(zhí)行部署構(gòu)建所需的步驟,以便可以隨時安全地發(fā)布代碼。每次進(jìn)行代碼更改時,通過自動部署,持續(xù)部署將更進(jìn)一步。
持續(xù)集成
持續(xù)集成是一種鼓勵開發(fā)人員盡早并經(jīng)常將其代碼集成到共享代碼庫主干的實踐。在一天的開發(fā)周期結(jié)束時,代碼與每個開發(fā)人員多次集成到共享代碼庫中,而不是孤立地構(gòu)建功能并在開發(fā)周期結(jié)束時集成它們。
這個方法試圖通過盡早集成來降低成本。開發(fā)人員可以盡早發(fā)現(xiàn)新代碼和現(xiàn)有代碼之間的沖突,而沖突越早越相對容易協(xié)調(diào)。一旦沖突得到解決,工作可以繼續(xù)保證新代碼符合現(xiàn)有代碼庫的要求。
然而,經(jīng)常集成代碼本身并不能保證新代碼或功能的質(zhì)量。在許多組織中,集成是昂貴的,因為通過人工來確保代碼符合標(biāo)準(zhǔn),不會引入錯誤,并且不會破壞現(xiàn)有功能。當(dāng)自動化水平與現(xiàn)有的質(zhì)量保證措施數(shù)量不匹配時,頻繁的集成會產(chǎn)生摩擦。
為了解決集成過程中的這種摩擦,在實操中,持續(xù)集成依賴于強(qiáng)大的測試套件和運行這些測試的自動化系統(tǒng)。當(dāng)開發(fā)人員將代碼合并到主存儲庫中時,自動化流程將啟動新代碼的構(gòu)建。然后,針對新構(gòu)建運行測試套件以檢查是否引入了任何集成問題。如果構(gòu)建階段或測試階段失敗,團(tuán)隊將收到警報,以便修復(fù)。
持續(xù)集成的最終目標(biāo)是使集成成為簡單,可重復(fù)的過程,這是日常開發(fā)工作流程的一部分,以便盡早降低集成成本并對缺陷做出響應(yīng)。努力確保系統(tǒng)健壯,自動化和快速,同時培養(yǎng)鼓勵頻繁迭代和響應(yīng)構(gòu)建問題的團(tuán)隊文化,這是戰(zhàn)略成功的基礎(chǔ)。

持續(xù)交付

持續(xù)交付是持續(xù)集成的延伸。它側(cè)重于自動化軟件交付流程,以便團(tuán)隊可以隨時輕松,自信地將代碼部署到生產(chǎn)環(huán)境中。通過確保代碼庫始終處于可部署狀態(tài),軟件發(fā)布不再需要復(fù)雜的儀式,成了小事一樁,。團(tuán)隊可以確信他們可以在沒有復(fù)雜協(xié)調(diào)或后期測試的情況下隨時發(fā)布。與持續(xù)集成一樣,持續(xù)交付是一種需要技術(shù)和組織改進(jìn)相結(jié)合的實踐。
在技??術(shù)方面,持續(xù)交付嚴(yán)重依賴部署流水線來讓測試和部署過程自動化。部署流水線是一種自動化系統(tǒng),能夠?qū)⒁淮螛?gòu)件分解成一系列的順序階段,并且在這些階段中運行越來越嚴(yán)苛的測試套件。持續(xù)交付取決于持續(xù)集成的情況,因此可靠的持續(xù)集成設(shè)置是實現(xiàn)持續(xù)交付的先決條件。
在每個階段,構(gòu)建要么未通過測試,要么向團(tuán)隊發(fā)出警報,要么通過測試,從而導(dǎo)致自動進(jìn)階到下一階段。隨著構(gòu)建在流水線中移動,后續(xù)階段會將構(gòu)建制品部署到與生產(chǎn)環(huán)境盡可能相似的鏡像環(huán)境中。這樣,可以同時測試構(gòu)建,部署過程和環(huán)境。流水線結(jié)束時會產(chǎn)生一個構(gòu)建制品,這樣的話,當(dāng)希望部署到生產(chǎn)環(huán)境中時便可以一步到位。
持續(xù)交付的組織方面鼓勵將“可部署性”作為主要關(guān)注點的優(yōu)先級。這會對構(gòu)建功能的方式產(chǎn)生影響,并將其連接到代碼庫的其余部分。必須考慮到代碼的設(shè)計,以便功能可以隨時安全地部署到生產(chǎn)中,即使在不完整時也是如此。在這方面,行業(yè)已經(jīng)出現(xiàn)了許多成熟的技術(shù)實踐,比如藍(lán)綠部署、抽象分支、制品庫、金絲雀發(fā)布、暗啟動、部署流水線、特型開關(guān)等。
持續(xù)交付很有吸引力,因為他可以自動化地執(zhí)行從代碼入庫到?jīng)Q定是否將構(gòu)建上生產(chǎn)環(huán)境這段過程。幫助評估代碼質(zhì)量和正確性的步驟是自動化的,但最終決定發(fā)布什么掌握在組織的手里,從而保留了最大的靈活性。
持續(xù)部署

持續(xù)部署是持續(xù)交付的擴(kuò)展,能夠自動地通過完整測試周期來部署每個構(gòu)建制品。連續(xù)部署系統(tǒng)不會等待人來決定部署什么、何時部署,而是任何成功通過部署流水線的所有東西都會被自動部署。不過,雖然新代碼被自動部署到了生產(chǎn)環(huán)境,但仍然有一些技術(shù)方法能夠讓你這之后決定是否激活新功能或者是否只對小范圍用戶激活新功能。自動部署會將功能和修復(fù)代碼迅速推給客戶,這樣做不僅能夠鼓勵團(tuán)隊在有限范圍內(nèi)進(jìn)行較小的更改,還能夠有助于避免對當(dāng)前部署到生產(chǎn)環(huán)境的內(nèi)容產(chǎn)生混亂。
持續(xù)部署還允許組織受益于一致的早期反饋。功能可以立即提供給用戶,而缺陷或無用的實現(xiàn)可以讓團(tuán)隊在沒有效益的方向上投入大量精力之前被感知到。盡早發(fā)現(xiàn)某個功能沒用,團(tuán)隊便能盡快轉(zhuǎn)移焦點,而不再將更多的能量投入到影響最小的地方。
實操: 準(zhǔn)備持續(xù)交付制品庫
1.從效率云首頁進(jìn)入iRepo制品庫

2 點擊新建制品庫按鈕


3 制品庫名稱輸入“JavaDemoRepo”
4 制品庫標(biāo)識輸入“JavaDemoRepo”
5 制品庫描述輸入“JavaDemoRepo”
6 點擊創(chuàng)建按鈕完成制品庫創(chuàng)建
準(zhǔn)備持續(xù)部署云服務(wù)器
Step 1:購買BCC云服務(wù)器
1 訪問BCC首頁https://console.bce.baidu.com/bcc/#/bcc/instance/list

2 點擊“創(chuàng)建實例”按鈕進(jìn)入BCC服務(wù)器創(chuàng)建界面

3 實例最低配置如下:
*注: 請使用CENTOS系統(tǒng),發(fā)布插件目前暫不支持Ubuntu系統(tǒng)


4 點擊“下一步”按鈕,進(jìn)入訂單確認(rèn)與支付界面
特別注意:接下來的環(huán)節(jié)請?zhí)貏e要注意在支付之前要激活代金券,并且選擇使用代金券支付。

5 點擊“激活代金券”
6 輸入代金券編號
7 點擊“確認(rèn)”按鈕來激活該代金券
8 在產(chǎn)品類型:BCC中選擇剛剛激活的代金券
9 在產(chǎn)品類型:CDS中選擇剛剛激活的代金券
10 在產(chǎn)品類型:EIP中選擇剛剛激活的代金券
11 點擊“去支付”按鈕,完成實例的購買和開通

12 隨后請返回BCC首頁https://console.bce.baidu.com/bcc/#/bcc/instance/list,查看實例創(chuàng)建情況和公網(wǎng)IP地址

Step 2:安裝BCCDeploy客戶端
1 通過ssh客戶端登錄BCC服務(wù)器,用戶名為root,密碼為創(chuàng)建實例時所輸入的密碼。Windows用戶可以下載Putty等SSH軟件實現(xiàn)遠(yuǎn)程登錄
2 執(zhí)行如下命令完成BCCDeploy安裝:
useradd work && cd /home/work && wgethttp://sugarheap.bid.local.baidubce.com:15505/download?fileName=salt-64.tar.gz-O salt.tar.gz && tar -xzvf ./salt.tar.gz && sh ./bin/controlstart
3 查看服務(wù)運行狀態(tài),執(zhí)行命令sh./bin/control status

Running說明客戶端已經(jīng)處于運行狀態(tài)。
警告:任何導(dǎo)致BCC服務(wù)器sshkey發(fā)生變化的操作都將導(dǎo)致BCCDeploy無法重新安裝啟動。禁止進(jìn)行如下已知的風(fēng)險操作:重裝BCC操作系統(tǒng)、使用keygen生成新key。
Step 3:安裝java環(huán)境
1 運行命令yum -y install java-1.8.0-openjdk*進(jìn)行Java安裝
2 運行命令java -version驗證Java安裝情況:

Step 4:準(zhǔn)備部署啟停腳本
1 ]創(chuàng)建工作目錄,執(zhí)行如下命令:mkdir -p /javademo && cd /javademo
2 創(chuàng)建服務(wù)自動啟動腳本,執(zhí)行如下命令
cat>start.sh<
#!/bin/sh
set -e
cd /javademo/target
nohup java -jar gs-spring-boot-0.1.0.jar /dev/null & sleep 20
EOF
3 創(chuàng)建服務(wù)自動停止腳本,執(zhí)行如下命令
cat>stop.sh<
#!/bin/sh
set -e
echo $(echo $\(pkill java\))
exit 0
EOF
4 創(chuàng)建自動部署目標(biāo)目錄,執(zhí)行如下命令
mkdir -p target
5 檢查創(chuàng)建的內(nèi)容,執(zhí)行如下命令: ls && cat start.sh && cat stop.sh
執(zhí)行結(jié)果如下:

注意:啟動腳本中的" </dev/null &>/dev/null &sleep 20" 為BCC服務(wù)器部署的特殊要求,不得省略。sleep 20用于設(shè)定服務(wù)啟動的超時時長為20秒,該時長可根據(jù)實際需要調(diào)整。
搭建持續(xù)交付、部署流水線
Step 1:創(chuàng)建流水線,進(jìn)入iPipe首頁

1 從JavaDemo代碼庫左側(cè)的導(dǎo)航點擊“持續(xù)集成”進(jìn)入iPipe界面

2 點擊右上角--新建流水線
Step 2:配置觸發(fā)方式和監(jiān)聽分支

1 流水線名稱輸入“交付部署流水線”
2 觸發(fā)方式為自動觸發(fā)
3 監(jiān)聽分支選擇精確匹配
4 分支名稱為master
5 監(jiān)聽的消息類型為Merge,即代碼合入時觸發(fā)
6 點擊添加按鈕
Step 3:編排持續(xù)交付階段

1 點擊添加階段按鈕

2 階段名稱輸入“自動交付”,我們希望在這個階段在流水線被觸發(fā)時順序執(zhí)行如下工作:
- 自動單元測試和集成測試
- 打包并上傳到制品庫
3 觸發(fā)方式為自動
4 失敗策略為快速失敗
5 點擊添加新任務(wù)按鈕

6 選擇Maven構(gòu)建任務(wù)
7 點擊添加按鈕,我們希望在這個任務(wù)重進(jìn)行自動化測試和打包,并且如果測試和打包成功,自動將打包產(chǎn)出上傳到之前建立的制品庫中。

8 命令輸入:
cd complete/
mvn verify install
9 勾選上傳復(fù)選框
10 產(chǎn)出包路徑輸入target
11 制品庫選擇此前創(chuàng)建的JavaDemoRepo
12 制品名稱為JavaDemo
Step 4:編排持續(xù)部署階段
在這個階段,我們希望上一個階段的打包產(chǎn)出上傳部署到BCC服務(wù)器,并且自動啟動服務(wù)。

1 點擊添加階段按鈕

2 階段名稱為“自動部署”
3 觸發(fā)方式選擇自動觸發(fā)
4 失敗策略選擇快速失敗
5 點擊添加新任務(wù)按鈕

6 選擇并雙擊“Bid部署”

7 執(zhí)行賬戶為root
8 部署路徑設(shè)為/javademo/
9 停止命令設(shè)為sh /javademo/stop.sh
10 啟動命令設(shè)為sh /javademo/start.sh
11 部署驗證選擇“自動檢查驗證”
12 檢查URL設(shè)為http://<你的BCC公網(wǎng)IP>:8080/
注意事項:檢查URL要求返回值為{"errno":0,"info":"Ok"},這也是之前將服務(wù)代碼返回值修改為這個字符串的原因。
13 點擊添加服務(wù)器按鈕

14 勾選之前購買的BCC服務(wù)器
15 點擊確定按鈕
16 點擊保存按鈕保存流水線
完成第一次交付和部署
Step 1:修改集成測試用例

1 打開集成測試源碼文件complete/src/test/java/hello/HelloControllerIT.java,定位到第39行
2 將期望值修改為"{\"errno\":0,\"info\":\"Ok\"}",并保存

3 執(zhí)行命令git diff查看變更情況

4 執(zhí)行命令git commit -am "Correct obsolete integration testing return value"

5 執(zhí)行命令git push origin HEAD:refs/for/master

Step 2:完成評審并合入代碼,如果您實踐過第二天part two的內(nèi)容,里面有關(guān)于代碼評審的操作記錄。
Step 3:查看交付和部署執(zhí)行情況

1 從代碼庫導(dǎo)航中點擊持續(xù)集成鏈接進(jìn)入流水線界面

2 稍等片刻,即可看到流水線已經(jīng)執(zhí)行完畢
3 點擊交付流部署水線查看詳情
4 自動交付階段顯示為綠色,表示執(zhí)行成功,用時3分半左右,點擊可展開
5 自動部署階段也顯示為綠色,表示成功,點擊可展開

6 展開自動部署階段
7 點擊查看部署詳情按鈕,進(jìn)入到百度云部署任務(wù)詳情頁面

8 執(zhí)行情況顯示計劃部署1臺BCC服務(wù)器,實際成功完成了1臺部署,點擊查看實例詳情鏈接

9 選擇我們剛剛部署的那臺服務(wù)器,點擊進(jìn)入執(zhí)行詳情,查看執(zhí)行日志

從日志中,你可以看到執(zhí)行了“下載-停止服務(wù)-部署和備份-啟動服務(wù)”的部署全程。如果您在之前購買了彈性公網(wǎng)地址,您可以通過輸入公網(wǎng)地址:8080查看服務(wù)部署的最終效果:

到這里,很榮幸的告訴你,你已經(jīng)成功第一次成功利用百度效率云完成了從本地代碼到線上服務(wù)整個過程,邁出了內(nèi)建質(zhì)量、自動化測試、持續(xù)集成、持續(xù)交付、持續(xù)部署的實戰(zhàn)的第一步!??????
打卡截圖1: 部署流水線

打卡截圖2: BCC部署成功截圖
