Flow vs Jenkins 實操對比,如何將Java應用快速發布至ECS


簡介:Jenkins 由於其開源特性以及豐富插件能力,長久以來都是中小企業搭建 CICD 流程的首選。不過 Jenkins 存在維護成本高、配置復雜等缺點,雲效 Flow 較好地解決了這些問題。 本文從一個 Java 應用部署到雲服務器(ECS)的場景切入,對比使用阿里雲雲效流水線 Flow 和 Jenkins 兩種構建部署方式,供大家選型參考。

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

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

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

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

需求分析

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

以 Git 倉庫 阿里雲登錄 - 歡迎登錄阿里雲,安全穩定的雲計算服務平台 Spring 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

Flow 主機組支持兩種類型,包括阿里雲ECS和能訪問公網的阿里雲主機。以登錄阿里雲賬號下ECS為例:

a. 訪問主機組管理頁

在「企業設置」中訪問主機組管理

b. 點擊創建按鈕,選擇阿里雲ECS

c. 新建服務授權,選擇ECS實例

 

此時完成了主機組的配置,后續將會在流水線部署節點里使用。

Jenkins

以通過 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的配置。

構建、部署配置

Flow

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

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

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

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

e. 在部署任務里選擇 "下載制品",勾選已配置的主機組,選定下載制品路徑、執行用戶和執行指令,點擊"保存並允許",觸發流水線實例運行。(Flow 支持部署策略如發布暫停、分批發布等特性,參考)

f. 在構建節點中可以看到, Flow 默認對 mvn 構建使用 倉庫服務 倉庫和對m2緩存來加速構建,免去每次從 nexus 倉庫下載 jar導致的耗時。

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

h. 可以在流水線實例頁直接下載 default 產物包。

i. 點擊部署任務,可以看到部署詳細信息,如部署耗時、日志等。

 

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

Jenkins

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 Jenkins
環境准備
  • 開箱即用,無需考慮流水線引擎的部署、運維工作

  • 開源工具,需要服務器安裝Jenkins運行環境和運維

主機組配置
  • 支持阿里雲ECS實例、非阿里雲服務器(可訪問公網)快速配置

  • 主機組可包含多台服務器

  • Remote Host 對應單個服務器,多台服務器需要分別添加多次

構建配置
  • 直接選擇 JDK/MAVEN 版本可申請構建環境

  • 自帶構建緩存上傳、下載機制,同一個流水線多次運行無需多次下載構建依賴

  • 自帶構建產物上傳、下載機制,可以在流水線多個節點里流轉





 
  • 常駐機器:需要用戶在構建機上提前安裝JDK/MAVEN等配置,機器成本高

  • K8S:彈性申請運行環境,機器成本低,但需要運維k8s集群,並且需要用戶自行打包構建工具為容器鏡像,實現軟件組合與鏡像的對應邏輯

  • 構建緩存默認停留在構建機器上,長期運行任務后磁盤容量需要運維

  • 默認產物在構建機器上,需要用戶使用如阿里雲 oss等外部存儲服務或通過ssh通道分發到部署機器,運維較復雜

部署配置
  • 選擇主機組可關聯多台機器

  • 部署詳情、日志白屏化

  • 支持多種部署策略

  • 任務配置時需要配置多個 Remote host

  • 只有部署日志,沒有詳情的白屏化交互

  • 無部署策略

可以看到 Flow 在軟件持續交付的場景下做了非常多好用的功能,使用戶可以將精力收斂於業務邏輯本身。

原文鏈接
本文為阿里雲原創內容,未經允許不得轉載。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM