一、簡介
微服務開發中自動化、持續化工程十分重要,在成熟的CI/CD環境中項目團隊可以靈活分配,大大提供團隊效率。如果還不了解什么是CI/CD,可以先查看相關文章,這里主要介紹環境的搭建,相關原理就不過多搬書了。
二、開始搭建
准備
目前主流的ci/cd環境都是基於容器化管理的,所以想要搭建這一環境必須熟練docker操作。版本控制選擇git,構建工具選擇Jenkins,所以開始前需要先掌握這些技術。
Step1:安裝docker
Ubuntu 18.04 docker安裝
docker安裝方式有多種,存儲庫安裝方式如下:
更新存儲庫:
sudo apt-get update
卸載舊版本docker:
sudo apt-get remove docker docker-engine docker.io
安裝docker:
sudo apt install docker.io
啟動docker、開機自啟:
sudo systemctl start docker sudo systemctl enable docker
檢查版本:
docker --version
Step2:選擇版本控制器
代碼托管最好選擇git,git倉庫公司應該都有搭建,如果沒有也可以選擇GitHub、gitLab、gogs等git工具。
step3:Jenkins安裝
存儲庫方式安裝Jenkins
更新存儲庫、安裝Java:
sudo apt updatesudo apt install openjdk-8-jdk
導入Jenkins存儲庫的GPG密鑰:
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
將Jenkins存儲庫添加到系統中:
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
更新存儲庫、安裝Jenkins:
sudo apt updatesudo apt install jenkins
檢查Jenkins狀態:
systemctl status jenkins
安裝成功則輸出如下:
● jenkins.service - LSB: Start Jenkins at boot time Loaded: loaded (/etc/init.d/jenkins; generated) Active: active (exited) since Wed 2018-08-22 13:03:08 PDT; 2min 16s ago Docs: man:systemd-sysv-generator(8) Tasks: 0 (limit: 2319) CGroup: /system.slice/jenkins.service
記得開放8080端口
進入Jenkins:http://服務器IP:8080
獲取初始密碼:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
登錄成功:
選擇左邊推薦插件安裝:
設置管理員密碼:
配置完成:
以上步驟都成功的話就可以開始創建自動化工程了。
Step4:創建Jenkins任務
進入Jenkins主頁,選擇新建任務:
輸入任務名,選擇自由風格:
確定后進入任務配置,源碼管理選擇git,tfs也可以但是不建議
觸發器根據需要選擇,我是通過手動發布所以並未選擇觸發器
構建環境選擇刪除工作空間
最后是關鍵一步,也是最容易出錯的一步,執行命令:
#!/bin/sh cd /var/lib/jenkins/workspace/auth-server/applications/AuthServer.Host/publish docker container prune << EOF y EOF docker container ls -a | grep "auth-server" if [ $? -eq 0 ];then docker container stop auth-server docker container rm auth-server fi docker image prune << EOF y EOF docker build -t auth-server . docker run -d -p 64999:80 --name=auth-server auth-server
完成后應用並保存。
shell命令分析:
熟悉Linux命令的話應該可以大致看懂上面的shell命令,命令執行步驟如下:
1. 進入工程的工作空間
2. 判斷是否存在“auth-server”容器,存在則刪除容器及鏡像
3. 構建docker鏡像
4. 啟動docker容器
這里的構建步驟與標准CI/CD有差異,標准CI/CD是拉取代碼后在服務器上構建(build)代碼並打包docker鏡像。上述過程是在本地構建並發布至publish目錄中,然后提交publish文件,Jenkins拉取編譯文件進行docker發布。
為什么要本地構建:
在本地構建代碼並提交要比提交代碼后服務器構建多出一步,這一步並不是多此一舉,下面分析下本地構建的原因:
1. 環境:由於國內網絡原因,服務器構建代碼時會出現很多拉取nuget、npm包超時現象,而Jenkins發布會有時間限制,發布超時會默認失敗。如果調整Jenkins發布超時時間則沒有意義,發布時間超過一小時還不如手動打包docker呢。
2. 節省資源: 構建代碼十分消耗系統資源,在服務較多時一次代碼提交需要同時發布數個有關聯的服務,這時服務器很可能會死機導致開發環境大量服務超時,十分影響前后端開發人員工作進度。
3. 快速:在高頻率的產品迭代中,微服務的發布也會十分頻繁,采用本地構建Jenkins發布的方式會大大縮短發布時間,甚至一個服務的發布只需1分鍾。
4. 排錯:標准的CI/CD發布模式中,開發人員提交的代碼很有可能有異常,這時服務就會發布失敗,如果其他服務依賴於此服務則會導致其他服務出現接口異常現象,耦合較大的話會直接崩潰。發現異常后,開發人員需要重新拉取代碼查看異常,而異常往往是由其他開發人員提交代碼不完整導致。等到代碼異常解決,重新發布可能一個小時就過去了。。。通過本地構建再發布就會完美避開這些周折。
Jenkins發布演示:
選擇一個微服務:
選擇立即構建:
左下會輸入發布日志,上面輸出代表發布成功。
三、總結
如果以上安裝配置都成功的話,那么恭喜你,微服務開發必備的CI/CD環境已經搭建完成,沒有成功的話也沒關系,多次嘗試一定會成功的,我也是幾天的折騰才搭好的(服務器都重裝了好幾次)。后續會介紹更多在abp vNext微服務中進行實際業務開發,同時也會介紹vue的相關開發技巧,感興趣的話可以持續關注。