基于 Rancher 的企业 CI/CD 环境搭建
CI(Continuous Integration)持續(xù)集成,CD(Continuous Delivery) 持續(xù)交付(當(dāng)然也有叫 Continuous Deployment)通常會(huì)采用一些軟件如Jenkins、Drone、Travis、Gocd等來輔助我們。它們能夠與Git SVN等代碼管理倉(cāng)庫(kù)集成,幫助我們實(shí)現(xiàn)一些自動(dòng)化任務(wù)。
CI/CD軟件很多,再加上代碼倉(cāng)庫(kù)不同,外加上業(yè)務(wù)流程的復(fù)雜度和不同開發(fā)語言的特性,會(huì)產(chǎn)生千變?nèi)f化的組合。可以說CI/CD本身就是一個(gè)很大的話題,正所謂一千個(gè)人眼中就有一千個(gè)哈姆雷特,所以我們這次分享主要還是關(guān)注在與Rancher結(jié)合方面。
下面我們就以jenkins為例,看Rancher如何與其集成。
首先我們可以想到,對(duì)于一個(gè)CI/CD環(huán)境,Rancher可以提供什么?
快速部署jenkins
環(huán)境隔離/用戶管理
基于Rancher compose進(jìn)行應(yīng)用編排
提供外部訪問入口
Rancher的Catalog中提供了jenkins部署的樣板:
左側(cè)是jenkins-ci server,右側(cè)是swam-plugin,這兩個(gè)可以組成一個(gè)master/slave模式的集群。
嘗試性的部署后,可以看到類似這樣的效果:
選用jenkins-swarm-plugin組成slave節(jié)點(diǎn), 這樣我們可以在jenkins跑任務(wù)時(shí)能夠和docker進(jìn)行更好的集成 。
構(gòu)建完畢后,可以在jenkins中看到集群狀況:
那么使用jenkins來做CI是一種怎樣的表現(xiàn)模式呢? 我們來通過一張圖來看下:
開發(fā)人員 push commit后,代碼倉(cāng)庫(kù)收到提交信息。這時(shí)可以通過倉(cāng)庫(kù)自帶的hook來觸發(fā)jenkins build。也可以通過jenkins的自poll來獲取最新代碼。然后jenkins就自動(dòng)執(zhí)行你所設(shè)定的各種任務(wù)腳本。
插播一句,關(guān)于觸發(fā)jenkins build 的幾種方式:
Post commit hook (git原生hook)
Webhook (github/gitlab都支持,需要hook的server端接收請(qǐng)求
Jenkins有相應(yīng)的plugin)
Build periodically / Poll SCM
CI的過程根據(jù)業(yè)務(wù)的復(fù)雜程度,各有不同,一般情況下分為這幾步:
運(yùn)行測(cè)試用例—編譯lib—制作docker鏡像并push到倉(cāng)庫(kù)—ranchercompose 部署服務(wù)。
通常我們可以把 rancher-compose 的file直接寫在代碼project中,這樣jenkins可以直接讀取到,并執(zhí)行rancher-compose執(zhí)行部署服務(wù)。
在執(zhí)行rancher-compose時(shí),可以考慮下面兩種策略:
每次根據(jù)jenkins的<buid_num>來創(chuàng)建新的stack
Rancher-compose --force-upgrade --pull 拉取最新鏡像并強(qiáng)制升級(jí)
在rancher-compose 執(zhí)行完畢后,通常交付一個(gè)對(duì)外訪問的ip:port,但是這個(gè)訪問地址一般來說不是固定的,所以我們的業(yè)務(wù)服務(wù)部署完畢后,自動(dòng)綁定dns,是一個(gè)非常好的體驗(yàn)。
sync-service 可以將app-service的服務(wù)地址在dns中添加A記錄,這樣我們只需記住dns,就可以直接看到CD后的業(yè)務(wù)服務(wù)。這里的dns-server 最好是可以支持SRV Record,關(guān)于SRV Record,大家可以理解為類似AWS Route53的功能。
關(guān)于如何取出服務(wù)地址并自動(dòng)添加DNS記錄的原理,可以參考我之前的一篇文章:http://blog.neunn.com/wordpre... 文中第三部分有詳細(xì)描述。
Q & A
Q:你剛才提到「在執(zhí)行rancher-compose時(shí),可以考慮下面兩種策略:每次根據(jù)jenkins的<buid_num>來創(chuàng)建新的stack」。這種方式可以用DNS么?如果用的話,轉(zhuǎn)發(fā)到哪個(gè)stack上?
A:默認(rèn)情況下 <stack.name>.<env.name>.<root_domain>,你也可以特殊制定一個(gè)dns前綴<special_name>.<root_domain>
Q:jenkins里只能有一個(gè)ENV-*?
A:可以在env下部署多個(gè)jenkins,但是考慮企業(yè)內(nèi)部不同部門不同業(yè)務(wù)要進(jìn)行隔離,所以建議每個(gè)env一套jenkins。
總結(jié)
以上是生活随笔為你收集整理的基于 Rancher 的企业 CI/CD 环境搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# 连接Redis报错:WRONGTY
- 下一篇: CentOS 6.7安装python3.