敏捷開發(fā)少不了一個方便的持續(xù)交付環(huán)境侣夷。這些天在阿里云簡單搭了一套開發(fā)環(huán)境硝逢,這里簡單記錄一下搭建過程的妖。
先盜張圖
Jenkins搭建
首先得有個Jenkins服務(wù)矢洲,在阿里云的容器里面搭jenkins很簡單璧眠,基本上按照文檔搞就行了,https://www.alibabacloud.com/help/zh/doc-detail/42988.htm读虏。
流程大致是
1.申請ecs主機(jī)
2.創(chuàng)建swarm集群责静,綁定ECS主機(jī)作為節(jié)點(diǎn)
3.在集群中創(chuàng)建應(yīng)用,選擇Jenkins模板
4.訪問Jenkins master盖桥,初始化配置灾螃,用戶,安裝插件
5.使用內(nèi)網(wǎng)ip綁定Jenkins slave
過程中有幾個點(diǎn)需要稍微注意的:
jenkins slave的賬號密碼是jenkins/jenkins
jenkins slave的Dockerfile可以在github中找到揩徊,https://github.com/AliyunContainerService/jenkins-slaves腰鬼,有問題可以直接看配置
中間過程出現(xiàn)Error 403 No valid crumb was included in the request,可以在master上修改安全設(shè)置塑荒,取消“防止跨站點(diǎn)請求偽造”勾選
創(chuàng)建CI和CD任務(wù)
接下來我們就可以配置jenkins上的項(xiàng)目了熄赡,大體流程可以參見上文阿里云的文檔。只是文檔是以gitbub代理為例講解齿税,而我們的代碼托管在coding上彼硫,配置過程稍有不同。
要讓jenkins拉取coding的源碼凌箕,需要在jenkins上部署相關(guān)證書拧篮。使用開發(fā)者所用證書,明顯是一種不安全的做法牵舱,所幸coding跟gitlab一樣可以設(shè)置專門的只讀部署證書他托。
我們在jenkins master上生成ssh證書,把公鑰配置到coding相應(yīng)項(xiàng)目中仆葡,然后在jenkins中配置證書使用方式赏参,done。
要使用coding格式的webhook沿盅,需要先要在jenkins上安裝coding的插件把篓,然后配置jenkins的插件和coding里面的webhook,過程參見https://open.coding.net/ci/jenkins/
實(shí)際過程里面踩了一個坑腰涧。我想要配置成develop分支有推送的時候自動觸發(fā)構(gòu)建和部署韧掩,試了好幾種寫法都不成功,最后發(fā)現(xiàn)只能寫成這樣
develop前面不能添加origin窖铡,remote疗锐,ref之類的任何前綴坊谁。? -_-||
不過過程中倒是讓我掌握了一個調(diào)試的技巧,coding的webhook配置頁面有提供重發(fā)的功能滑臊,不需要每次提交代碼測試口芍。那么jenkins端怎么調(diào)試呢?可以在系統(tǒng)配置中打開coding插件的日志
發(fā)現(xiàn)了這么類似這樣的一個日志
謎題解開了雇卷。
集成日志服務(wù)
一個舒適的開發(fā)環(huán)境怎么能離開得了好的日志服務(wù)鬓椭,阿里云集成日志服務(wù)同樣很簡單。
配置過程仍然可以參見阿里云文檔https://www.alibabacloud.com/help/zh/doc-detail/26036.htm关划,這里同樣只列出我踩過的坑小染。
為了對日志分析友好,我們選擇了json格式的日志formatter贮折,但是阿里云的容器日志默認(rèn)會自動添加時間戳裤翩,破壞了日志的格式,我們修改一下默認(rèn)配置
配置日志用json方式解析以后调榄,可以看到這種結(jié)構(gòu)化輸出的日志
還可以對日志進(jìn)行分析岛都,比如說分析restful接口返回status的分布
我們服務(wù)端采用了golang,為了使docker鏡像最小化振峻,采用了scratch作為base,發(fā)現(xiàn)了一個問題择份,由于沒有時區(qū)設(shè)置扣孟,日志打印時間總是跟我們的當(dāng)?shù)貢r間相差了8個小時,解決方法是在鏡像中加入相關(guān)的配置文件荣赶。
獲取應(yīng)用版本
測試環(huán)境上凤价,我們經(jīng)常有這樣的困擾,現(xiàn)在環(huán)境中部署的代碼到底是對應(yīng)哪個版本的呢拔创。
解決方案就是在build docker鏡像的時候在jenkins腳本中把commit-id作為ARG傳入利诺,設(shè)置到鏡像的ENV中,通過一個特殊的后門接口返回剩燥。
jenkins腳本中寫入慢逾,docker build --build-arg VERSION_ARG=$GIT_COMMIT -t ...
Dockerfile中寫入
ARG VERSION_ARG=not_from_jenkins
ENV VERSION $VERSION_ARG