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 仓库 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 Jenkins
环境准备
  • 开箱即用,无需考虑流水线引擎的部署、运维工作

  • 开源工具,需要服务器安装Jenkins运行环境和运维

主机组配置
  • 支持阿里云ECS实例、非阿里云服务器(可访问公网)快速配置

  • 主机组可包含多台服务器

  • Remote Host 对应单个服务器,多台服务器需要分别添加多次

构建配置
  • 直接选择 JDK/MAVEN 版本可申请构建环境

  • 自带构建缓存上传、下载机制,同一个流水线多次运行无需多次下载构建依赖

  • 自带构建产物上传、下载机制,可以在流水线多个节点里流转






  • 常驻机器:需要用户在构建机上提前安装JDK/MAVEN等配置,机器成本高

  • K8S:弹性申请运行环境,机器成本低,但需要运维k8s集群,并且需要用户自行打包构建工具为容器镜像,实现软件组合与镜像的对应逻辑

  • 构建缓存默认停留在构建机器上,长期运行任务后磁盘容量需要运维

  • 默认产物在构建机器上,需要用户使用如阿里云 oss等外部存储服务或通过ssh通道分发到部署机器,运维较复杂

部署配置
  • 选择主机组可关联多台机器

  • 部署详情、日志白屏化

  • 支持多种部署策略


  • 任务配置时需要配置多个 Remote host

  • 只有部署日志,没有详情的白屏化交互

  • 无部署策略


可以看到 Flow 在软件持续交付的场景下做了非常多好用的功能,使用户可以将精力收敛于业务逻辑本身。


你的团队是如何做CICD的?欢迎分享

查看实操文档快速上手:


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

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
16 0
|
2天前
|
传感器 机器人 Java
使用Java构建机器人应用
使用Java构建机器人应用
5 0
|
2天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
7 0
|
2天前
|
设计模式 算法 Java
设计模式在Java开发中的应用
设计模式在Java开发中的应用
14 0
|
4天前
|
分布式计算 Java 大数据
Java语言主要应用领域
【5月更文挑战第7天】Java在嵌入式系统中以低至130KB的占用展现可靠性,实现“一次编写,到处运行”。在大数据领域,Java通过Hadoop、Hbase、Accumulo和ElasticSearch等工具发挥关键作用。Java也是Eclipse、IntelliJ IDEA和NetBeans等开发工具的基础。广泛应用于电商网站和金融服务器系统,即便在J2ME式微后,仍能在部分低端手机中找到其踪影。
15 4
|
4天前
|
算法 Java 机器人
Java在嵌入式领域的应用
【5月更文挑战第7天】Java广泛应用于消费产品(如智能电视、机顶盒、数码相机)、工业控制(PLC、DCS、FCS)、通信(交换机、路由器、基站)、智能仪器、机器人、计算机外部设备、军事电子及太空科学,涵盖从家用到高科技领域的嵌入式系统开发。
15 4
|
4天前
|
机器学习/深度学习 人工智能 分布式计算
JAVA编程语言在人工智能领域的应用
Java是由Sun Microsystems(已被Oracle收购)于1995年推出的一种跨平台编程语言。它具有面向对象、可移植、高效和安全等特性,成为了广泛应用于企业级应用开发的编程语言之一。
44 21
|
9天前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
111 6
|
20小时前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
5 0
|
20小时前
|
存储 弹性计算 监控
探索阿里云弹性计算:如何优化云服务器ECS的性能与成本
在云时代,【阿里云ECS】的性能优化与成本控制至关重要。利用实例规格选择、自动伸缩、网络和存储配置,可增强性能、减少成本。结合监控工具和优化建议,用户能解决性能问题,提升应用稳定性,实现高效且经济的云计算运营。
6 1