天天看點

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

随着計算機技術和業務不斷發展,企業軟體規模越來越龐大,傳遞越來越複雜。持續傳遞 DevOps 解決方案逐漸深入人心,成為企業開發者研發模式首選。

市面上存在多種多樣的 CICD 工具,不同的工具有不同特點。從開源的本地工具 Jenkins、TeamCity,到雲端免費工具 Travis CI、Github Action,到如今雲原生時代專注于 Kubernetes 的 ArgoCD、Tekton Pipeline。

Jenkins 由于其開源特性以及豐富插件能力,長久以來都是中小企業搭建 CICD 流程的首選。不過 Jenkins 存在維護成本高、配置複雜等缺點,雲效 Flow 較好地解決了這些問題。

本文從一個 Java 應用部署到雲伺服器(ECS)的場景切入,對比使用阿裡雲雲效流水線 Flow 和 Jenkins 兩種建構部署方式,供大家選型參考。

需求分析

目前我們有一個存放 Java 代碼的倉庫,需要對源代碼進行建構,獲得建構産物并将建構産物部署到雲伺服器(ECS)組。該過程簡單抽象如下:

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

以 Git 倉庫

https://code.aliyun.com/flow-example/spring-boot

Spring Boot 工程為例,需要有一個提供java、maven建構指令的運作環境進行 mvn build,将生成的 jar 包同步到伺服器組上,執行應用啟動指令(如 /home/admin/app/deploy.sh restart),将應用啟動。

流程拆分

環境準備

Flow

Flow 作為一個 SaaS 服務,開箱即用。使用者隻需要一個阿裡雲賬号即可開啟持續傳遞之旅。

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

在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. 通路主機組管理頁

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

在「企業設定」中通路主機組管理

b. 點選建立按鈕,選擇阿裡雲ECS

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

c. 建立服務授權,選擇ECS執行個體

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS
Flow vs Jenkins 實操對比,如何将Java應用快速釋出至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

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

通路 remote hosts 配置頁,如 http://xxxx:8081/configure ,選擇剛建立的 credential,測試connection連通性。

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

此時我們完成一台主機的配置(注:Jenkins 與 Java 伺服器處于同一網絡下,則伺服器不需要開放公網通路,否則需要申請配置公網可達的IP)。而 Flow 可通過阿裡雲雲助手下發指令的通道,減少對公網IP或彈性EIP的配置。

建構、部署配置

a. 選擇 Java · 建構、部署到阿裡雲ECS/自有主機 模闆

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

b. 添加示例代碼庫(Java、Spring Boot)

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

c. 點選 Java建構上傳 任務,可以友善的選擇 JDK、Maven 版本,配置建構指令。

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

d. 在 建構物上傳 任務裡,直接輸入多個打包路徑生成建構制品,如 default

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

e. 在部署任務裡選擇 "下載下傳制品",勾選已配置的主機組,標明下載下傳制品路徑、執行使用者和執行指令,點選"儲存并允許",觸發流水線執行個體運作。(Flow 支援部署政策如釋出暫停、分批釋出等特性,參考)

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

f. 在建構節點中可以看到, Flow 預設對 mvn 建構使用

http://maven.aliyun.com/

倉庫和對m2緩存來加速建構,免去每次從 nexus 倉庫下載下傳 jar導緻的耗時。

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

g. 在建構物上傳步驟可以看到,mvn建構完的工作區中的jar包和deploy.sh被打包後上傳到了遠端存儲中。

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

h. 可以在流水線執行個體頁直接下載下傳 default 産物包。

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

i. 點選部署任務,可以看到部署詳細資訊,如部署耗時、日志等。

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS
Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

此時我們在 Flow 走通了 Clone git repo -> Mvn Build -> Deploy To ECS的流程。

a. 通路 http://xxxx:8081/newJob 開始建立任務

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

b. 配置 git 倉庫源位址

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

c. 配置 mvn 執行指令,(為了友善走通測試流程,這裡我使用同一台機器作為部署Jenkins、Java的建構和部署機器,強烈建議生産環境将Jenkins、應用建構與部署的機器進行隔離)

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

d. 儲存任務配置,觸發任務運作,通路 http://xxxx:8081/job/daily-deploy-test/1/console 任務日志詳情頁,可以看到 Jenkins 會将代碼庫 clone 到 /var/lib/jenkins/workspace/daily-deploy-test,執行 mvn 建構與 deploy.sh 腳本

Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS
Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS
Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS
Flow vs Jenkins 實操對比,如何将Java應用快速釋出至ECS

小結

此時我們在 Jenkins 走通了 Clone git repo -> Mvn Build -> Deploy To ECS的流程。

  • 開箱即用,無需考慮流水線引擎的部署、運維工作
  • 開源工具,需要伺服器安裝Jenkins運作環境和運維
  • 支援阿裡雲ECS執行個體、非阿裡雲伺服器(可通路公網)快速配置
  • 主機組可包含多台伺服器
  • Remote Host 對應單個伺服器,多台伺服器需要分别添加多次
建構配置
  • 直接選擇 JDK/MAVEN 版本可申請建構環境
  • 自帶建構緩存上傳、下載下傳機制,同一個流水線多次運作無需多次下載下傳建構依賴
  • 自帶建構産物上傳、下載下傳機制,可以在流水線多個節點裡流轉
  • 常駐機器:需要使用者在建構機上提前安裝JDK/MAVEN等配置,機器成本高
  • K8S:彈性申請運作環境,機器成本低,但需要運維k8s叢集,并且需要使用者自行打包建構工具為容器鏡像,實作軟體組合與鏡像的對應邏輯
  • 建構緩存預設停留在建構機器上,長期運作任務後磁盤容量需要運維
  • 預設産物在建構機器上,需要使用者使用如阿裡雲 oss等外部存儲服務或通過ssh通道分發到部署機器,運維較複雜
部署配置
  • 選擇主機組可關聯多台機器
  • 部署詳情、日志白屏化
  • 支援多種部署政策
  • 任務配置時需要配置多個 Remote host
  • 隻有部署日志,沒有詳情的白屏化互動
  • 無部署政策

可以看到 Flow 在軟體持續傳遞的場景下做了非常多好用的功能,使使用者可以将精力收斂于業務邏輯本身。

你的團隊是如何做CICD的?歡迎分享

檢視實操文檔快速上手:

https://help.aliyun.com/document_detail/224594.html