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 | |
| 环境准备 |
|
|
| 主机组配置 |
|
|
| 构建配置 |
|
|
| 部署配置 |
|
|
可以看到 Flow 在软件持续交付的场景下做了非常多好用的功能,使用户可以将精力收敛于业务逻辑本身。
原文链接
本文为阿里云原创内容,未经允许不得转载。
Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS的更多相关文章
- 【对比】文心一言对飚ChatGPT实操对比体验
前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...
- 实操代码研究各种Java技术-java.toutiao.im
whatsmars https://github.com/javahongxi/whatsmars whatsmars-earth-web springmvc+velocitywhatsmars-ea ...
- 动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?
当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的 AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛 SDK 简单的实现人 ...
- 百度NLP预训练模型ERNIE2.0最强实操课程来袭!【附教程】
2019年3月,百度正式发布NLP模型ERNIE,其在中文任务中全面超越BERT一度引发业界广泛关注和探讨.经过短短几个月时间,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基 ...
- 72 个网络应用安全实操要点,全方位保护 Web 应用的安全
原文地址:Web Application Security Checklist 原文作者:Teo Selenius(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...
- RENIX报文两个字段嵌套变化——网络测试仪实操
RENIX软件如何实现报文中两个字段嵌套变化,以下为您实操讲解详细步骤. 1.打开Renix软件,连接机框并预约测试端口: 2.创建一条RAW流量(Binding流量也可以,这里用RAW流做例子) 3 ...
- IGMP协议测试-网络测试仪实操
一.前言:IGMP协议用于IPv4系统向任何邻居组播路由器报告其组播成员资格.IP组播路由器自己本身也可以是一到多个组播组的成员.这时,组播路由器要实现协议的组播路由器部分. IGMP存在三个不同版本 ...
- 当我们进行性能优化,我们在优化什么(LightHouse优化实操)
好的互联网产品不仅仅在功能上要高人一筹,在性能层面也需要出类拔萃,否则金玉其外败絮其中,页面是美轮美奂了,结果首屏半天加载不出来,难免让用户乘兴而来,败兴而归. 幸运的是,前端的性能优化有诸多有迹可循 ...
- R数据分析:孟德尔随机化中介的原理和实操
中介本身就是回归,基本上我看到的很多的调查性研究中在中介分析的方法部分都不会去提混杂,都是默认一个三角形画好,中介关系就算过去了,这里面默认的逻辑就是前两步回归中的混杂是一样的,计算中介效应的时候就自 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
随机推荐
- MD5算法:密码学中的传奇
MD5算法起源: MD5(Message Digest Algorithm 5)算法是由MIT的计算机科学家Ronald Rivest于1991年设计的一种消息摘要算法.MD5算法最初被用于提供数据完 ...
- 记录--前端实习生的这个 bug 被用做了一道基础面试题
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 测试发现了一个问题,简单描述问题就是通过函数删除一个数组中多个元素,传入的参数是一个数组索引. 然后发现实际效果有时删除的不是想要的 ...
- 记录--webpack和vite原理
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 每次用vite创建项目秒建好,前几天用vue-cli创建了一个项目,足足等了我一分钟,那为什么用 vite 比 webpack 要快 ...
- SpringBoot 常用注解总结
核心注解 1. @SpringBootApplication 主要用于开启自动配置,它也是一个组合注解,主要组合了 @SpringBootConfiguration.@EnableAutoConfig ...
- Mybatis使用JDBC实现数据库批量添加
1.spring注入数据源 @Resource(name = "dataSource") private DataSource dataSource; 2.连接数据库批量添加 pu ...
- Spring Cloud相关组件说明
1.Spring Cloud版本 现有Spring Cloud有两代实现,分为Spring Cloud Netflix和Spring Cloud Alibaba,由于SpringCloud Netfl ...
- KingbaseES Json 系列十一:Json数组操作函数
KingbaseES Json 系列十一--Json数组操作函数(JSONB_ARRAY_ELEMENTS,JSONB_ARRAY_ELEMENTS_TEXT,JSONB_ARRAY_LENGTH,J ...
- java实战字符串2:中英字符串相互转换
题目描述 输入字符串为中文拼音号码串或者英文号码串,如果输入是中文拼音号码串则转成英文号码串,如果输入是英文号码串则转成中文号码串. 特殊情况是英文号码串会出现Double + 英文数字或者拼音数值. ...
- 8分钟搞懂Java中的各种锁
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/f9fc66cb.html 前言 你好,我是测试蔡坨坨. 在前几篇Redis相关文章中都说到了锁,同时我们在参加设计评审或者c ...
- Java字符串比较 == 和 equals方法的区别
今天在排除一个bug的时候出现了一个很低级但是也很容易被忽视的错误,在此写了一个小例子做记录. 首先我先说一下错误的场景,我读取了一段json数据,并使用JSONObject的实例对象的getStri ...