Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS
簡介:Jenkins 由于其開源特性以及豐富插件能力,長久以來都是中小企業(yè)搭建 CICD 流程的首選。不過 Jenkins 存在維護成本高、配置復(fù)雜等缺點,云效 Flow 較好地解決了這些問題。 本文從一個 Java 應(yīng)用部署到云服務(wù)器(ECS)的場景切入,對比使用阿里云云效流水線 Flow 和 Jenkins 兩種構(gòu)建部署方式,供大家選型參考。
隨著計算機技術(shù)和業(yè)務(wù)不斷發(fā)展,企業(yè)軟件規(guī)模越來越龐大,交付越來越復(fù)雜。持續(xù)交付 DevOps 解決方案逐漸深入人心,成為企業(yè)開發(fā)者研發(fā)模式首選。
市面上存在多種多樣的 CICD 工具,不同的工具有不同特點。從開源的本地工具 Jenkins、TeamCity,到云端免費工具 Travis CI、Github Action,到如今云原生時代專注于 Kubernetes 的 ArgoCD、Tekton Pipeline。
Jenkins 由于其開源特性以及豐富插件能力,長久以來都是中小企業(yè)搭建 CICD 流程的首選。不過 Jenkins 存在維護成本高、配置復(fù)雜等缺點,云效 Flow 較好地解決了這些問題。
本文從一個 Java 應(yīng)用部署到云服務(wù)器(ECS)的場景切入,對比使用阿里云云效流水線 Flow 和 Jenkins 兩種構(gòu)建部署方式,供大家選型參考。
需求分析
當前我們有一個存放 Java 代碼的倉庫,需要對源代碼進行構(gòu)建,獲得構(gòu)建產(chǎn)物并將構(gòu)建產(chǎn)物部署到云服務(wù)器(ECS)組。該過程簡單抽象如下:
以 Git 倉庫 阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計算服務(wù)平臺 Spring Boot 工程為例,需要有一個提供java、maven構(gòu)建指令的運行環(huán)境進行 mvn build,將生成的 jar 包同步到服務(wù)器組上,執(zhí)行應(yīng)用啟動命令(如 /home/admin/app/deploy.sh restart),將應(yīng)用啟動。
流程拆分
環(huán)境準備
Flow
Flow 作為一個 SaaS 服務(wù),開箱即用。用戶只需要一個阿里云賬號即可開啟持續(xù)交付之旅。
在Flow平臺登陸阿里云賬號后即可新建流水線
Jenkins
Jenkins 是一個開源的 CI 工具,用戶需要提供機器資源來部署 Jenkins Master 節(jié)點。如果需要在公網(wǎng)環(huán)境下訪問Jenkins頁面,通過公網(wǎng)IP或彈性IP等暴露訪問地址。以一臺阿里云 ECS(Centos 8)為例,安裝Jenkins的過程包括:
# 安裝 git、java 基礎(chǔ)工具 yum install git java # 修改 Jenkins 配置,如監(jiān)聽端口等 vim /etc/sysconfig/jenkinsJENKINS_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 應(yīng)用運行的服務(wù)器叫為主機組的概念,它可以包括 n>=1 臺服務(wù)器。
Flow
Flow 主機組支持兩種類型,包括阿里云ECS和能訪問公網(wǎng)的阿里云主機。以登錄阿里云賬號下ECS為例:
a. 訪問主機組管理頁
在「企業(yè)設(shè)置」中訪問主機組管理
b. 點擊創(chuàng)建按鈕,選擇阿里云ECS
c. 新建服務(wù)授權(quán),選擇ECS實例
此時完成了主機組的配置,后續(xù)將會在流水線部署節(jié)點里使用。
Jenkins
以通過 ssh private key 訪問服務(wù)器為例,首先我們需要在機器上生成一對 rsa 密鑰,執(zhí)行一下命令一路回車
ssh-keygen -t rsa -m PEM在 ~/.ssh 目錄下可以看到生成的密鑰文件,復(fù)制id_rsa私鑰的內(nèi)容
[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 ,選擇剛創(chuàng)建的 credential,測試connection連通性。
此時我們完成一臺主機的配置(注:Jenkins 與 Java 服務(wù)器處于同一網(wǎng)絡(luò)下,則服務(wù)器不需要開放公網(wǎng)訪問,否則需要申請配置公網(wǎng)可達的IP)。而 Flow 可通過阿里云云助手下發(fā)指令的通道,減少對公網(wǎng)IP或彈性EIP的配置。
構(gòu)建、部署配置
Flow
a. 選擇 Java · 構(gòu)建、部署到阿里云ECS/自有主機 模板
b. 添加示例代碼庫(Java、Spring Boot)
c. 點擊 Java構(gòu)建上傳 任務(wù),可以方便的選擇 JDK、Maven 版本,配置構(gòu)建指令。
d. 在 構(gòu)建物上傳 任務(wù)里,直接輸入多個打包路徑生成構(gòu)建制品,如 default
e. 在部署任務(wù)里選擇 "下載制品",勾選已配置的主機組,選定下載制品路徑、執(zhí)行用戶和執(zhí)行指令,點擊"保存并允許",觸發(fā)流水線實例運行。(Flow 支持部署策略如發(fā)布暫停、分批發(fā)布等特性,參考)
f. 在構(gòu)建節(jié)點中可以看到, Flow 默認對 mvn 構(gòu)建使用 倉庫服務(wù) 倉庫和對m2緩存來加速構(gòu)建,免去每次從 nexus 倉庫下載 jar導(dǎo)致的耗時。
g. 在構(gòu)建物上傳步驟可以看到,mvn構(gòu)建完的工作區(qū)中的jar包和deploy.sh被打包后上傳到了遠端存儲中。
h. 可以在流水線實例頁直接下載 default 產(chǎn)物包。
i. 點擊部署任務(wù),可以看到部署詳細信息,如部署耗時、日志等。
此時我們在 Flow 走通了 Clone git repo -> Mvn Build -> Deploy To ECS的流程。
Jenkins
a. 訪問 http://xxxx:8081/newJob 開始新建任務(wù)
b. 配置 git 倉庫源地址
c. 配置 mvn 執(zhí)行指令,(為了方便走通測試流程,這里我使用同一臺機器作為部署Jenkins、Java的構(gòu)建和部署機器,強烈建議生產(chǎn)環(huán)境將Jenkins、應(yīng)用構(gòu)建與部署的機器進行隔離)
d. 保存任務(wù)配置,觸發(fā)任務(wù)運行,訪問 http://xxxx:8081/job/daily-deploy-test/1/console 任務(wù)日志詳情頁,可以看到 Jenkins 會將代碼庫 clone 到 /var/lib/jenkins/workspace/daily-deploy-test,執(zhí)行 mvn 構(gòu)建與 deploy.sh 腳本
小結(jié)
此時我們在 Jenkins 走通了 Clone git repo -> Mvn Build -> Deploy To ECS的流程。
| Flow | Jenkins | |
| 環(huán)境準備 |
|
|
| 主機組配置 |
|
|
| 構(gòu)建配置 |
? |
|
| 部署配置 |
|
|
可以看到 Flow 在軟件持續(xù)交付的場景下做了非常多好用的功能,使用戶可以將精力收斂于業(yè)務(wù)邏輯本身。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。?
總結(jié)
以上是生活随笔為你收集整理的Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于 MaxCompute + Holo
- 下一篇: 从阿里核心场景看实时数仓的发展趋势