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)組。該過程簡單抽象如下:
以 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平臺登陸阿里雲賬號後即可新建流水線
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 構建使用 http://maven.aliyun.com/ 倉庫和對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 在軟體持續交付的場景下做了非常多好用的功能,使使用者可以將精力收斂於業務邏輯本身。
你的團隊是如何做CICD的?歡迎分享
檢視實操文件快速上手:https://help.aliyun.com/document_detail/224594.html
關於我們
瞭解更多關於雲效DevOps的最新動態,可微信搜尋關注【雲效】公眾號;
彩蛋:公眾號後臺回覆【指南】,可獲得《阿里巴巴DevOps實踐指南》&《10倍研發效能提升案例集》;
看完覺得對您有所幫助別忘記點贊、收藏和關注呦;