CI/CD應該是大部分公司進行迭代開發(fā)的模式。個人理解就是系統(tǒng)規(guī)范流程化地去進行迭代開發(fā)丹喻,而中間又涉及到多個部分薄货,包含需求,編碼碍论,編譯谅猾,測試,上線鳍悠,部署税娜,運維,管理藏研。這些形成了一個閉環(huán)敬矩。
關于CI/CD的工具,之前用過AzureDevOps蠢挡,當時沒有深入研究谤绳,大致感覺就是提交代碼之后會自動進行版本發(fā)布(并且經常會莫名其妙失敗)袒哥,然后項目經理能夠很好地去看到項目迭代情況。
現(xiàn)在公司的項目都再用TAPD來進行迭代開發(fā)管理消略,但是修改后重新發(fā)布都需要手動去進行(今年疫情期間在家辦公堡称,前后端有任何更新都得直接發(fā)布),經歷過的人都知道艺演,頻繁手動發(fā)布很浪費時間却紧。特別是進入微服務時代之后,多個應用需要全部發(fā)布胎撤,手動挨個發(fā)布基本不可行晓殊。
本文目的很簡單,就是希望在提交代碼到倉庫的時候也能自動發(fā)布到測試環(huán)境上面(媽媽在也不用擔心我被前端同事催著發(fā)布更新)伤提,我們使用現(xiàn)在比較流行地Jenkins去完成巫俺。
Docker啟動Jenkins/Jenkins
我們選擇使用Docker去進行發(fā)布Jenkins,需要注意的是使用Jenkins/Jenkins這個鏡像(已經包含很多常用組件)肿男。
創(chuàng)建容器:
docker run -d -p 8000:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home --name jenkins --restart always --privileged=true -u root jenkins/jenkins
這里掛載的數(shù)據(jù)卷對應目錄是/var/jenkins_home,其中包含項目的配置以及Jenkins的任務工作區(qū)內容介汹,啟動完成后還需要對容器去進行配置却嗡。由于宿主機上已經存在對應的掛載目錄,因此可以直接宿主上的配置嘹承,這些配置大致和插件更新等有關:
- 修改/home/jenkins/hudson.model.UpdateCenter.xml窗价,將Url修改為http://mirror.xmission.com/jenkins/updates/update-center.json
- 修改/home/jenkins/updates/default.json,修改http://www.google.com/為http://www.baidu.com/
配置Jenkins
解鎖
瀏覽器訪問8000端口叹卷,第一次訪問需要解鎖撼港,密碼在提示的文件中。
安裝組件
可以選擇【選擇插件來安裝】來查看有哪些插件骤竹。
可以先安裝推薦的插件帝牡。
創(chuàng)建一個新任務
選擇Freestyle Project去創(chuàng)建一個任務。
基礎配置
配置源代碼
源代碼管理這里使用的是github瘤载,配置完地址以及訪問憑證否灾,如果需要使用其他的工具,可以安裝對應插件鸣奔。
從系統(tǒng)管理->系統(tǒng)配置中找到GitHub配置墨技,選擇”高級“,拷貝Hook地址。
登錄GitHub挎狸,在對應Repository中的Webhooks配置鉤子地址扣汪。這樣一旦Git有更新就會去觸發(fā)Jenkins上的任務。Recent Deliveries可以查看最近的觸發(fā)锨匆,也可以方便調試崭别。
配置觸發(fā)方式
配置觸發(fā)器,配置如下恐锣,H/1表示每一分鐘去檢查源代碼是否有更新茅主,可以根據(jù)自己項目實際情況去進行配置。
配置構建步驟
這個例子中Jenkins服務器負責根據(jù)新的代碼去構建Docker鏡像土榴,并且上傳到DockerHub上诀姚,接著SSH到另外一臺發(fā)布服務器上,拉去對應鏡像并且啟動容器:
- 構建鏡像玷禽,選擇執(zhí)行shell赫段。
這里使用到Docker,因為這里的Jenkins本身就是在運行在Docker里面的矢赁,因此涉及到在Docker里面安裝Docker糯笙,可參考我自己寫的另外一篇文章:
相關腳本:
cd /var/jenkins_home/workspace/Test;
docker rmi testjenkins &>/dev/null;
docker login -u alexwillbegood -p {DockerHub密碼};
docker build -t alexwillbegood/testjenkins .;
docker push alexwillbegood/testjenkins;
-
發(fā)布服務,選擇使用ssh執(zhí)行腳本撩银。
需要從系統(tǒng)管理->插件管理中安裝SSH插件给涕,配置好遠程SSH地址。
相關腳本:
docker rmi alexwillbegood/testjenkins &>/dev/null;
docker stop testjenkins &>/dev/null;
docker rm testjenkins &>/dev/null;
docker login -u alexwillbegood -p {DockerHub密碼};
docker pull alexwillbegood/testjenkins;
docker run -d --name testjenkins -p 8001:80 -e ASPNETCORE_ENVIRONMENT="Development" --restart=always alexwillbegood/testjenkins;
注意這里的腳本還有大量的優(yōu)化空間,比如:
- 直接使用了&>/dev/null將異常丟進"黑洞"稠炬,沒有去判斷鏡像是否存在焕阿,容器是否啟動/存在等等問題。
- 這里的DockerHub登錄直接使用賬戶密碼的方式(明文寫在配置中其實是件可怕的事情)首启,DockerHub提供了CredentialStore的方式解決這個問題暮屡。
- 腳本文件也可以以文本文件的形式存在,這里的腳本只寫“”sh build.sh”.這樣做的好處是能夠使得構建方式可以跟隨代碼一起更新毅桃,不需要每次更改都上服務器褒纲,更加靈活。
查看構建歷史
完結
至此钥飞,更新Git后就能夠使用Docker自動部署到對應服務器莺掠。因為我是已經完成后再寫的這篇文章,沒有完全重復這些步驟读宙,有問題或者有更好的方案可以評論交流彻秆。