天天看点

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