訓(xùn)練營(yíng)往期回顧:
Day Zero – 開(kāi)通效率云服務(wù) <<
Day One 之理念篇: DevOps與敏捷黔帕,用戶(hù)故事地圖,價(jià)值流圖
Day One 之實(shí)操篇--產(chǎn)品規(guī)劃蹈丸,定制看板成黄,生成迭代計(jì)劃
Day Two -- Part2: 設(shè)計(jì)提交規(guī)范呐芥,代碼評(píng)審規(guī)范,設(shè)計(jì)提交流水線
注: 今天的實(shí)操課程涉及到購(gòu)買(mǎi)百度云BCC資源, 請(qǐng)大家提前聯(lián)系講師申請(qǐng)代金券
原理: 從持續(xù)集成到持續(xù)部署
開(kāi)發(fā)和發(fā)布軟件可能是一個(gè)復(fù)雜的過(guò)程奋岁,尤其是當(dāng)應(yīng)用程序贩耐,團(tuán)隊(duì)和部署基礎(chǔ)架構(gòu)本身變得復(fù)雜時(shí)。通常厦取,隨著項(xiàng)目的發(fā)展,挑戰(zhàn)變得更加明顯管搪。為了以快速一致的方式開(kāi)發(fā)虾攻,測(cè)試和發(fā)布軟件,開(kāi)發(fā)人員和組織需要?jiǎng)?chuàng)建了三種相關(guān)但不同的策略來(lái)管理和自動(dòng)化這些過(guò)程更鲁。
持續(xù)集成的重點(diǎn)是每天多次將各開(kāi)發(fā)人員的工作集成到主存儲(chǔ)庫(kù)中霎箍,及早捕獲集成錯(cuò)誤并加速協(xié)作開(kāi)發(fā)。持續(xù)交付要減少部署或發(fā)布過(guò)程中的摩擦澡为,自動(dòng)執(zhí)行部署構(gòu)建所需的步驟漂坏,以便可以隨時(shí)安全地發(fā)布代碼。每次進(jìn)行代碼更改時(shí)媒至,通過(guò)自動(dòng)部署顶别,持續(xù)部署將更進(jìn)一步。
持續(xù)集成
持續(xù)集成是一種鼓勵(lì)開(kāi)發(fā)人員盡早并經(jīng)常將其代碼集成到共享代碼庫(kù)主干的實(shí)踐拒啰。在一天的開(kāi)發(fā)周期結(jié)束時(shí)驯绎,代碼與每個(gè)開(kāi)發(fā)人員多次集成到共享代碼庫(kù)中,而不是孤立地構(gòu)建功能并在開(kāi)發(fā)周期結(jié)束時(shí)集成它們谋旦。
這個(gè)方法試圖通過(guò)盡早集成來(lái)降低成本剩失。開(kāi)發(fā)人員可以盡早發(fā)現(xiàn)新代碼和現(xiàn)有代碼之間的沖突,而沖突越早越相對(duì)容易協(xié)調(diào)册着。一旦沖突得到解決拴孤,工作可以繼續(xù)保證新代碼符合現(xiàn)有代碼庫(kù)的要求。
然而甲捏,經(jīng)常集成代碼本身并不能保證新代碼或功能的質(zhì)量演熟。在許多組織中,集成是昂貴的司顿,因?yàn)橥ㄟ^(guò)人工來(lái)確保代碼符合標(biāo)準(zhǔn)绽媒,不會(huì)引入錯(cuò)誤,并且不會(huì)破壞現(xiàn)有功能免猾。當(dāng)自動(dòng)化水平與現(xiàn)有的質(zhì)量保證措施數(shù)量不匹配時(shí)是辕,頻繁的集成會(huì)產(chǎn)生摩擦。
為了解決集成過(guò)程中的這種摩擦猎提,在實(shí)操中获三,持續(xù)集成依賴(lài)于強(qiáng)大的測(cè)試套件和運(yùn)行這些測(cè)試的自動(dòng)化系統(tǒng)旁蔼。當(dāng)開(kāi)發(fā)人員將代碼合并到主存儲(chǔ)庫(kù)中時(shí),自動(dòng)化流程將啟動(dòng)新代碼的構(gòu)建疙教。然后棺聊,針對(duì)新構(gòu)建運(yùn)行測(cè)試套件以檢查是否引入了任何集成問(wèn)題。如果構(gòu)建階段或測(cè)試階段失敗贞谓,團(tuán)隊(duì)將收到警報(bào)限佩,以便修復(fù)。
持續(xù)集成的最終目標(biāo)是使集成成為簡(jiǎn)單裸弦,可重復(fù)的過(guò)程祟同,這是日常開(kāi)發(fā)工作流程的一部分,以便盡早降低集成成本并對(duì)缺陷做出響應(yīng)理疙。努力確保系統(tǒng)健壯晕城,自動(dòng)化和快速,同時(shí)培養(yǎng)鼓勵(lì)頻繁迭代和響應(yīng)構(gòu)建問(wèn)題的團(tuán)隊(duì)文化窖贤,這是戰(zhàn)略成功的基礎(chǔ)砖顷。
持續(xù)交付
持續(xù)交付是持續(xù)集成的延伸。它側(cè)重于自動(dòng)化軟件交付流程赃梧,以便團(tuán)隊(duì)可以隨時(shí)輕松滤蝠,自信地將代碼部署到生產(chǎn)環(huán)境中。通過(guò)確保代碼庫(kù)始終處于可部署狀態(tài)授嘀,軟件發(fā)布不再需要復(fù)雜的儀式几睛,成了小事一樁,粤攒。團(tuán)隊(duì)可以確信他們可以在沒(méi)有復(fù)雜協(xié)調(diào)或后期測(cè)試的情況下隨時(shí)發(fā)布所森。與持續(xù)集成一樣,持續(xù)交付是一種需要技術(shù)和組織改進(jìn)相結(jié)合的實(shí)踐夯接。
在技??術(shù)方面焕济,持續(xù)交付嚴(yán)重依賴(lài)部署流水線來(lái)讓測(cè)試和部署過(guò)程自動(dòng)化。部署流水線是一種自動(dòng)化系統(tǒng)盔几,能夠?qū)⒁淮螛?gòu)件分解成一系列的順序階段晴弃,并且在這些階段中運(yùn)行越來(lái)越嚴(yán)苛的測(cè)試套件。持續(xù)交付取決于持續(xù)集成的情況逊拍,因此可靠的持續(xù)集成設(shè)置是實(shí)現(xiàn)持續(xù)交付的先決條件上鞠。
在每個(gè)階段,構(gòu)建要么未通過(guò)測(cè)試芯丧,要么向團(tuán)隊(duì)發(fā)出警報(bào)芍阎,要么通過(guò)測(cè)試,從而導(dǎo)致自動(dòng)進(jìn)階到下一階段缨恒。隨著構(gòu)建在流水線中移動(dòng)谴咸,后續(xù)階段會(huì)將構(gòu)建制品部署到與生產(chǎn)環(huán)境盡可能相似的鏡像環(huán)境中轮听。這樣,可以同時(shí)測(cè)試構(gòu)建岭佳,部署過(guò)程和環(huán)境血巍。流水線結(jié)束時(shí)會(huì)產(chǎn)生一個(gè)構(gòu)建制品擅腰,這樣的話夭苗,當(dāng)希望部署到生產(chǎn)環(huán)境中時(shí)便可以一步到位缺厉。
持續(xù)交付的組織方面鼓勵(lì)將“可部署性”作為主要關(guān)注點(diǎn)的優(yōu)先級(jí)枪蘑。這會(huì)對(duì)構(gòu)建功能的方式產(chǎn)生影響,并將其連接到代碼庫(kù)的其余部分蘸际。必須考慮到代碼的設(shè)計(jì)宣增,以便功能可以隨時(shí)安全地部署到生產(chǎn)中诲祸,即使在不完整時(shí)也是如此京办。在這方面,行業(yè)已經(jīng)出現(xiàn)了許多成熟的技術(shù)實(shí)踐帆焕,比如藍(lán)綠部署惭婿、抽象分支、制品庫(kù)叶雹、金絲雀發(fā)布财饥、暗啟動(dòng)、部署流水線折晦、特型開(kāi)關(guān)等钥星。
持續(xù)交付很有吸引力,因?yàn)樗梢宰詣?dòng)化地執(zhí)行從代碼入庫(kù)到?jīng)Q定是否將構(gòu)建上生產(chǎn)環(huán)境這段過(guò)程满着。幫助評(píng)估代碼質(zhì)量和正確性的步驟是自動(dòng)化的谦炒,但最終決定發(fā)布什么掌握在組織的手里,從而保留了最大的靈活性风喇。
持續(xù)部署
持續(xù)部署是持續(xù)交付的擴(kuò)展宁改,能夠自動(dòng)地通過(guò)完整測(cè)試周期來(lái)部署每個(gè)構(gòu)建制品。連續(xù)部署系統(tǒng)不會(huì)等待人來(lái)決定部署什么魂莫、何時(shí)部署还蹲,而是任何成功通過(guò)部署流水線的所有東西都會(huì)被自動(dòng)部署。不過(guò)耙考,雖然新代碼被自動(dòng)部署到了生產(chǎn)環(huán)境谜喊,但仍然有一些技術(shù)方法能夠讓你這之后決定是否激活新功能或者是否只對(duì)小范圍用戶(hù)激活新功能。自動(dòng)部署會(huì)將功能和修復(fù)代碼迅速推給客戶(hù)倦始,這樣做不僅能夠鼓勵(lì)團(tuán)隊(duì)在有限范圍內(nèi)進(jìn)行較小的更改斗遏,還能夠有助于避免對(duì)當(dāng)前部署到生產(chǎn)環(huán)境的內(nèi)容產(chǎn)生混亂。
持續(xù)部署還允許組織受益于一致的早期反饋鞋邑。功能可以立即提供給用戶(hù)最易,而缺陷或無(wú)用的實(shí)現(xiàn)可以讓團(tuán)隊(duì)在沒(méi)有效益的方向上投入大量精力之前被感知到怒坯。盡早發(fā)現(xiàn)某個(gè)功能沒(méi)用,團(tuán)隊(duì)便能盡快轉(zhuǎn)移焦點(diǎn)藻懒,而不再將更多的能量投入到影響最小的地方。
實(shí)操: 準(zhǔn)備持續(xù)交付制品庫(kù)
1.從效率云首頁(yè)進(jìn)入iRepo制品庫(kù)
2 點(diǎn)擊新建制品庫(kù)按鈕
3 制品庫(kù)名稱(chēng)輸入“JavaDemoRepo”
4 制品庫(kù)標(biāo)識(shí)輸入“JavaDemoRepo”
5 制品庫(kù)描述輸入“JavaDemoRepo”
6 點(diǎn)擊創(chuàng)建按鈕完成制品庫(kù)創(chuàng)建
準(zhǔn)備持續(xù)部署云服務(wù)器
Step 1:購(gòu)買(mǎi)BCC云服務(wù)器
1 訪問(wèn)BCC首頁(yè)https://console.bce.baidu.com/bcc/#/bcc/instance/list
2 點(diǎn)擊“創(chuàng)建實(shí)例”按鈕進(jìn)入BCC服務(wù)器創(chuàng)建界面
3 實(shí)例最低配置如下:
*注: 請(qǐng)使用CENTOS系統(tǒng)限番,發(fā)布插件目前暫不支持Ubuntu系統(tǒng)
4 點(diǎn)擊“下一步”按鈕珠插,進(jìn)入訂單確認(rèn)與支付界面
特別注意:接下來(lái)的環(huán)節(jié)請(qǐng)?zhí)貏e要注意在支付之前要激活代金券缤底,并且選擇使用代金券支付。
5 點(diǎn)擊“激活代金券”
6 輸入代金券編號(hào)
7 點(diǎn)擊“確認(rèn)”按鈕來(lái)激活該代金券
8 在產(chǎn)品類(lèi)型:BCC中選擇剛剛激活的代金券
9 在產(chǎn)品類(lèi)型:CDS中選擇剛剛激活的代金券
10 在產(chǎn)品類(lèi)型:EIP中選擇剛剛激活的代金券
11 點(diǎn)擊“去支付”按鈕鲁沥,完成實(shí)例的購(gòu)買(mǎi)和開(kāi)通
12 隨后請(qǐng)返回BCC首頁(yè)https://console.bce.baidu.com/bcc/#/bcc/instance/list缠局,查看實(shí)例創(chuàng)建情況和公網(wǎng)IP地址
Step 2:安裝BCCDeploy客戶(hù)端
1 通過(guò)ssh客戶(hù)端登錄BCC服務(wù)器唱矛,用戶(hù)名為root,密碼為創(chuàng)建實(shí)例時(shí)所輸入的密碼包个。Windows用戶(hù)可以下載Putty等SSH軟件實(shí)現(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ù)運(yùn)行狀態(tài)搀菩,執(zhí)行命令sh./bin/control status
Running說(shuō)明客戶(hù)端已經(jīng)處于運(yùn)行狀態(tài)土砂。
警告:任何導(dǎo)致BCC服務(wù)器sshkey發(fā)生變化的操作都將導(dǎo)致BCCDeploy無(wú)法重新安裝啟動(dòng)。禁止進(jìn)行如下已知的風(fēng)險(xiǎn)操作:重裝BCC操作系統(tǒng)、使用keygen生成新key。
Step 3:安裝java環(huán)境
1 運(yùn)行命令yum -y install java-1.8.0-openjdk*進(jìn)行Java安裝
2 運(yùn)行命令java -version驗(yàn)證Java安裝情況:
Step 4:準(zhǔn)備部署啟停腳本
1 ]創(chuàng)建工作目錄悼瘾,執(zhí)行如下命令:mkdir -p /javademo && cd /javademo
2 創(chuàng)建服務(wù)自動(dòng)啟動(dòng)腳本,執(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ù)自動(dòng)停止腳本怎抛,執(zhí)行如下命令
cat>stop.sh<
#!/bin/sh
set -e
echo $(echo $\(pkill java\))
exit 0
EOF
4 創(chuàng)建自動(dòng)部署目標(biāo)目錄挣菲,執(zhí)行如下命令
mkdir -p target
5 檢查創(chuàng)建的內(nèi)容富稻,執(zhí)行如下命令: ls && cat start.sh && cat stop.sh
執(zhí)行結(jié)果如下:
注意:?jiǎn)?dòng)腳本中的" </dev/null &>/dev/null &sleep 20" 為BCC服務(wù)器部署的特殊要求,不得省略白胀。sleep 20用于設(shè)定服務(wù)啟動(dòng)的超時(shí)時(shí)長(zhǎng)為20秒椭赋,該時(shí)長(zhǎng)可根據(jù)實(shí)際需要調(diào)整。
搭建持續(xù)交付或杠、部署流水線
Step 1:創(chuàng)建流水線哪怔,進(jìn)入iPipe首頁(yè)
1 從JavaDemo代碼庫(kù)左側(cè)的導(dǎo)航點(diǎn)擊“持續(xù)集成”進(jìn)入iPipe界面
2 點(diǎn)擊右上角--新建流水線
Step 2:配置觸發(fā)方式和監(jiān)聽(tīng)分支
1 流水線名稱(chēng)輸入“交付部署流水線”
2 觸發(fā)方式為自動(dòng)觸發(fā)
3 監(jiān)聽(tīng)分支選擇精確匹配
4 分支名稱(chēng)為master
5 監(jiān)聽(tīng)的消息類(lèi)型為Merge,即代碼合入時(shí)觸發(fā)
6 點(diǎn)擊添加按鈕
Step 3:編排持續(xù)交付階段
1 點(diǎn)擊添加階段按鈕
2 階段名稱(chēng)輸入“自動(dòng)交付”向抢,我們希望在這個(gè)階段在流水線被觸發(fā)時(shí)順序執(zhí)行如下工作:
- 自動(dòng)單元測(cè)試和集成測(cè)試
- 打包并上傳到制品庫(kù)
3 觸發(fā)方式為自動(dòng)
4 失敗策略為快速失敗
5 點(diǎn)擊添加新任務(wù)按鈕
6 選擇Maven構(gòu)建任務(wù)
7 點(diǎn)擊添加按鈕认境,我們希望在這個(gè)任務(wù)重進(jìn)行自動(dòng)化測(cè)試和打包,并且如果測(cè)試和打包成功挟鸠,自動(dòng)將打包產(chǎn)出上傳到之前建立的制品庫(kù)中叉信。
8 命令輸入:
cd complete/
mvn verify install
9 勾選上傳復(fù)選框
10 產(chǎn)出包路徑輸入target
11 制品庫(kù)選擇此前創(chuàng)建的JavaDemoRepo
12 制品名稱(chēng)為JavaDemo
Step 4:編排持續(xù)部署階段
在這個(gè)階段,我們希望上一個(gè)階段的打包產(chǎn)出上傳部署到BCC服務(wù)器艘希,并且自動(dòng)啟動(dòng)服務(wù)硼身。
1 點(diǎn)擊添加階段按鈕
2 階段名稱(chēng)為“自動(dòng)部署”
3 觸發(fā)方式選擇自動(dòng)觸發(fā)
4 失敗策略選擇快速失敗
5 點(diǎn)擊添加新任務(wù)按鈕
6 選擇并雙擊“Bid部署”
7 執(zhí)行賬戶(hù)為root
8 部署路徑設(shè)為/javademo/
9 停止命令設(shè)為sh /javademo/stop.sh
10 啟動(dòng)命令設(shè)為sh /javademo/start.sh
11 部署驗(yàn)證選擇“自動(dòng)檢查驗(yàn)證”
12 檢查URL設(shè)為http://<你的BCC公網(wǎng)IP>:8080/
注意事項(xiàng):檢查URL要求返回值為{"errno":0,"info":"Ok"},這也是之前將服務(wù)代碼返回值修改為這個(gè)字符串的原因覆享。
13 點(diǎn)擊添加服務(wù)器按鈕
14 勾選之前購(gòu)買(mǎi)的BCC服務(wù)器
15 點(diǎn)擊確定按鈕
16 點(diǎn)擊保存按鈕保存流水線
完成第一次交付和部署
Step 1:修改集成測(cè)試用例
1 打開(kāi)集成測(cè)試源碼文件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:完成評(píng)審并合入代碼淹真,如果您實(shí)踐過(guò)第二天part two的內(nèi)容讶迁,里面有關(guān)于代碼評(píng)審的操作記錄。
Step 3:查看交付和部署執(zhí)行情況
1 從代碼庫(kù)導(dǎo)航中點(diǎn)擊持續(xù)集成鏈接進(jìn)入流水線界面
2 稍等片刻,即可看到流水線已經(jīng)執(zhí)行完畢
3 點(diǎn)擊交付流部署水線查看詳情
4 自動(dòng)交付階段顯示為綠色巍糯,表示執(zhí)行成功啸驯,用時(shí)3分半左右,點(diǎn)擊可展開(kāi)
5 自動(dòng)部署階段也顯示為綠色祟峦,表示成功罚斗,點(diǎn)擊可展開(kāi)
6 展開(kāi)自動(dòng)部署階段
7 點(diǎn)擊查看部署詳情按鈕,進(jìn)入到百度云部署任務(wù)詳情頁(yè)面
8 執(zhí)行情況顯示計(jì)劃部署1臺(tái)BCC服務(wù)器宅楞,實(shí)際成功完成了1臺(tái)部署针姿,點(diǎn)擊查看實(shí)例詳情鏈接
9 選擇我們剛剛部署的那臺(tái)服務(wù)器,點(diǎn)擊進(jìn)入執(zhí)行詳情厌衙,查看執(zhí)行日志
從日志中距淫,你可以看到執(zhí)行了“下載-停止服務(wù)-部署和備份-啟動(dòng)服務(wù)”的部署全程。如果您在之前購(gòu)買(mǎi)了彈性公網(wǎng)地址婶希,您可以通過(guò)輸入公網(wǎng)地址:8080查看服務(wù)部署的最終效果:
到這里榕暇,很榮幸的告訴你,你已經(jīng)成功第一次成功利用百度效率云完成了從本地代碼到線上服務(wù)整個(gè)過(guò)程喻杈,邁出了內(nèi)建質(zhì)量彤枢、自動(dòng)化測(cè)試、持續(xù)集成筒饰、持續(xù)交付缴啡、持續(xù)部署的實(shí)戰(zhàn)的第一步!??????
打卡截圖1: 部署流水線
打卡截圖2: BCC部署成功截圖