随着計算機技術和業務不斷發展,企業軟體規模越來越龐大,傳遞越來越複雜。持續傳遞 DevOps 解決方案逐漸深入人心,成為企業開發者研發模式首選。
市面上存在多種多樣的 CICD 工具,不同的工具有不同特點。從開源的本地工具 Jenkins、TeamCity,到雲端免費工具 Travis CI、Github Action,到如今雲原生時代專注于 Kubernetes 的 ArgoCD、Tekton Pipeline。
Jenkins 由于其開源特性以及豐富插件能力,長久以來都是中小企業搭建 CICD 流程的首選。不過 Jenkins 存在維護成本高、配置複雜等缺點,雲效 Flow 較好地解決了這些問題。
本文從一個 Java 應用部署到雲伺服器(ECS)的場景切入,對比使用阿裡雲雲效流水線 Flow 和 Jenkins 兩種建構部署方式,供大家選型參考。
需求分析
目前我們有一個存放 Java 代碼的倉庫,需要對源代碼進行建構,獲得建構産物并将建構産物部署到雲伺服器(ECS)組。該過程簡單抽象如下:

以 Git 倉庫
https://code.aliyun.com/flow-example/spring-bootSpring Boot 工程為例,需要有一個提供java、maven建構指令的運作環境進行 mvn build,将生成的 jar 包同步到伺服器組上,執行應用啟動指令(如 /home/admin/app/deploy.sh restart),将應用啟動。
流程拆分
環境準備
Flow
Flow 作為一個 SaaS 服務,開箱即用。使用者隻需要一個阿裡雲賬号即可開啟持續傳遞之旅。
在Flow平台登陸阿裡雲賬号後即可建立流水線
Jenkins
Jenkins 是一個開源的 CI 工具,使用者需要提供機器資源來部署 Jenkins Master 節點。如果需要在公網環境下通路Jenkins頁面,通過公網IP或彈性IP等暴露通路位址。以一台阿裡雲 ECS(Centos 8)為例,安裝Jenkins的過程包括:
# 安裝 git、java 基礎工具
yum install git java
# 修改 Jenkins 配置,如監聽端口等
vim /etc/sysconfig/jenkins
JENKINS_PORT="8081"
# 安裝 Jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo dnf install jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
systemctl status jenkins
當Jenkins程序啟動後,可以通過機器ip+端口的方式通路,登入到Jenkins頁面。
主機組配置
我們将最終 java 應用運作的伺服器叫為主機組的概念,它可以包括 n>=1 台伺服器。
Flow 主機組支援兩種類型,包括阿裡雲ECS和能通路公網的阿裡雲主機。以登入阿裡雲賬号下ECS為例:
a. 通路主機組管理頁
在「企業設定」中通路主機組管理
b. 點選建立按鈕,選擇阿裡雲ECS
c. 建立服務授權,選擇ECS執行個體
此時完成了主機組的配置,後續将會在流水線部署節點裡使用。
以通過 ssh private key 通路伺服器為例,首先我們需要在機器上生成一對 rsa 密鑰,執行一下指令一路回車
ssh-keygen -t rsa -m PEM
在 ~/.ssh 目錄下可以看到生成的密鑰檔案,複制id_rsa私鑰的内容
[root@iZbp1614mku6kuzmrnyi6uZ .ssh]# ls -al
總用量 16
drwx------ 2 root root 80 5月 30 14:26 .
dr-xr-x---. 7 root root 233 5月 30 14:43 ..
-rw------- 1 root root 1574 5月 30 14:26 authorized_keys
-rw------- 1 root root 2455 5月 30 14:26 id_rsa
-rw-r--r-- 1 root root 582 5月 30 14:26 id_rsa.pub
-rw-r--r-- 1 root root 173 5月 30 13:55 known_hosts
通路Jenkins 添加 Credentials 配置頁,如http://xxxx:8081/credentials/store/system/domain/_/newCredentials
通路 remote hosts 配置頁,如 http://xxxx:8081/configure ,選擇剛建立的 credential,測試connection連通性。
此時我們完成一台主機的配置(注:Jenkins 與 Java 伺服器處于同一網絡下,則伺服器不需要開放公網通路,否則需要申請配置公網可達的IP)。而 Flow 可通過阿裡雲雲助手下發指令的通道,減少對公網IP或彈性EIP的配置。
建構、部署配置
a. 選擇 Java · 建構、部署到阿裡雲ECS/自有主機 模闆
b. 添加示例代碼庫(Java、Spring Boot)
c. 點選 Java建構上傳 任務,可以友善的選擇 JDK、Maven 版本,配置建構指令。
d. 在 建構物上傳 任務裡,直接輸入多個打包路徑生成建構制品,如 default
e. 在部署任務裡選擇 "下載下傳制品",勾選已配置的主機組,標明下載下傳制品路徑、執行使用者和執行指令,點選"儲存并允許",觸發流水線執行個體運作。(Flow 支援部署政策如釋出暫停、分批釋出等特性,參考)
f. 在建構節點中可以看到, Flow 預設對 mvn 建構使用
http://maven.aliyun.com/倉庫和對m2緩存來加速建構,免去每次從 nexus 倉庫下載下傳 jar導緻的耗時。
g. 在建構物上傳步驟可以看到,mvn建構完的工作區中的jar包和deploy.sh被打包後上傳到了遠端存儲中。
h. 可以在流水線執行個體頁直接下載下傳 default 産物包。
i. 點選部署任務,可以看到部署詳細資訊,如部署耗時、日志等。
此時我們在 Flow 走通了 Clone git repo -> Mvn Build -> Deploy To ECS的流程。
a. 通路 http://xxxx:8081/newJob 開始建立任務
b. 配置 git 倉庫源位址
c. 配置 mvn 執行指令,(為了友善走通測試流程,這裡我使用同一台機器作為部署Jenkins、Java的建構和部署機器,強烈建議生産環境将Jenkins、應用建構與部署的機器進行隔離)
d. 儲存任務配置,觸發任務運作,通路 http://xxxx:8081/job/daily-deploy-test/1/console 任務日志詳情頁,可以看到 Jenkins 會将代碼庫 clone 到 /var/lib/jenkins/workspace/daily-deploy-test,執行 mvn 建構與 deploy.sh 腳本
小結
此時我們在 Jenkins 走通了 Clone git repo -> Mvn Build -> Deploy To ECS的流程。
|
| |
|
| |
建構配置 |
|
|
部署配置 |
|
|
可以看到 Flow 在軟體持續傳遞的場景下做了非常多好用的功能,使使用者可以将精力收斂于業務邏輯本身。
你的團隊是如何做CICD的?歡迎分享
檢視實操文檔快速上手:
https://help.aliyun.com/document_detail/224594.html