持续集成、持续交付(CI/CD)开篇,先来唠唠嗑
前言
现在稍微有点规模的系统,很多都是采用分布式/微服务架构,将一个大系统拆分为很多个功能模块进行开发、测试、发布、管理等,如果全部流程都采用人工的形式进行的话,效率肯定是超级不高效滴。而且现在很多项目都采用极限编程的模式,将原有比较复杂的过程分解为更小的周期进行管理,将开发的成果快速的体现给用户,如果单纯人工操作,就需要大量的人力成本才能达到要求(频繁的开发、测试、部署是很耗时的),另外很容出错。所以自动化的集成和交付是很有必要的,接下来就开始这系列的学习和分享,小伙伴们一起哦。
极限编程(ExtremeProgramming,简称XP)是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法;XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。 ---摘自百度百科
正文
1. CI/CD简介
需求变更频繁、开发人员时间不够用、传统人工运维费事费力是项目遇到的三大难题,所以各种模式应运而生,比如常听见的DevOps、CI/CD、敏捷开发等,其实最终的目的就是通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件产品,尽可能降低开发成本,满足客户需求。
有了自动化就不用加班了? 想多了,只是减少不必要的时间浪费,节省出来时间还得去做其他的更有意义的事,所以该加的还加。
1.1 CI持续集成
CI(Continuous integration)持续集成:根据开发情况,随时将功能集成到整个项目中。
有点规模的系统都会分解为很多模块,每个模块又会分解为很多小功能,每个小功能还会分解成很多小操作,而这些功能模块可能都是不同的开发人员进行开发,持续集成的目的就是开发人员根据功能的完成情况,可以随时将对应的开发成果合并到整体项目中,尽早的与其他模块集成并进行测试,尽早发现问题并解决。
1.2 CD持续交付
CD(Continuous delivery)持续交付:根据功能集成情况,小周期内形成小版本交付,快速迭代,让用户尽快的体验到新功能。
项目开发过程中,需求变更是避免不了的,通过短周期的小版本交付,实时获取用户反馈,有针对性的快速优化和完善,减少不必要的返工和大的需求变动,还可以降低累积功能交付的风险。另外一个角度来说,让用户快速使用到新功能,用户的体验感也不一样(用户就是上帝)。
2. CI/CD实操流程
实际工作中,其实通俗点说就是将原有的部分人为参与的步骤借助自动化工具进行管理,使得整个流程自动化、标准化,降低人为操作错误的风险。人为操作和自动化操作流程如下:
人为操作
上图简述:
1.开发人员将功能代码推送的服务器;
2.经过多轮测试,直到可发布;
3.运维人员拉取可发布代码;
4.然后进行打包;
5.最后发布到应用服务器上;
当然也有开发人员把活全干了的,但不管咋弄,假如发布的功能比较多或是发布比较频繁,那对应的人员工作就只能干发布这一件事了,而且人为操作出错的概率比较高。
自动化操作
上图简述:
1.开发人员将功能代码推送的服务器,推送正式代码前会先自动化测试和人工测试(图中没体现);
2.版本控制服务器收到代码的同时,会触发对应的钩子程序(或定时程序) ;
3.通知持续集成工具(Jenkins,Hudson等),工具会自动先使用安装的git/svn插件从版本控制服务器上拉取源代码;
4.工具会使用编译/打包插件将拉取下来的代码进行自动编译打包;
5.工具最后将打包的程序发布到应用服务器上;(这里根据打包的形式不一样,发布方式也不一样;比如直接运行,或者是镜像方式,又或者是集成K8S,后续我们会逐步实操);这步使用插件根据部署场景不一样,使用的也不一样。
6.在自动化期间如果发生错误,可以配置通知,相关人员会及时进行处理,从而快速响应,快速迭代。
相比人工操作,开发人员只需提交代码,后续就基本自动化了,这样是不是很给力。 至于要不要这样做,主要还是看业务和制度。
3. Jenkins 简介及安装
关于持续集成的工具有Jenkins,Hudson,gitLab-runner等,大家常用的就是Jenkins,接一下来就以它为工具的前提下进行实操演示。
3.1 Jenkins简介
Jenkins是一个开源的软件项目,是基于Java开发的一种持续集成工具,帮助开发人员自动构建项目;Jenkins通过插件化的方式可以集成不同开发语言、不同版本控制工具、不同流程部署等场景。
3.2 Jenkins安装
这里还是采用Docker的方式进行安装,采用的是云服务器(Linux),具体步骤如下:
执行Docker命令进行安装
docker run -p 8080:8080 -p 5000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:lts
命令解析:
-p 8080:8080 -p 5000:5000 指定主机和容器的映射端口;
--name jenkins 指定容器名为jenkins;
-u root 指定用户,这里root用户下;
-v /mydata/jenkins_home:/var/jenkins_home 挂载目录;
-d 是以后台形式启动容器; 最后一串是代表使用的镜像。
访问8080端口看效果,如下:
查找初始密码
命令方式,如下:
docker logs jenkins # 看容器的启动日志
进入容器内部看初始密码文件的方式,如下:
安装插件
登录之后就提示进行插件安装,刚开始直接安装推荐插件即可;
接下来就是等待插件安装完成即可,如果安装失败,就多试几次。
新建用户
推荐插件安装完毕之后,会出现新建用户的界面,根据自己需要创建属于自己的新账号,如下:
配置地址,这个地址先按默认的来,后续用到了我们再来解释
安装完成
总结
其实对于项目周期的管理越是简单高效越好,不要盲目使用工具; 就比如小小的单体程序,各种持续集成、部署工具都用上,那就是自己给自己添堵,一定要以解决问题为目的。
到这就先把Jenkins环境搭建好,后续的文章会陆续分享,从代码到最后容器化,咱们一步一步的来;之后的案例将会使用码云作为代码的版本控制服务器,相对github来说比较快,不过原理都差不多。关注“Code综艺圈”,和我一起学习吧;
持续集成、持续交付(CI/CD)开篇,先来唠唠嗑的更多相关文章
- Docker——Jenkins + Git + Registry构建自动化持续集成环境(CI/CD)
前言 在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署.交付(CD). 本文基于Jenkins+Docker+G ...
- 手把手详解持续集成之GitLab CI/CD
一.环境准备 首先需要有一台 GitLab 服务器,然后需要有个项目:这里示例项目以 Spring Boot 项目为例,然后最好有一台专门用来 Build 的机器,实际生产中如果 Build 任务不频 ...
- CI / CD /CD 持续集成 持续交付 持续部署
CI / CD /CD 持续集成 持续交付 持续部署 CI CD 是啥?干了啥? CI continuous integration 持续集成 CD continuous delivery 持续交付 ...
- CI/CD持续集成/持续部署 敏捷开发
敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它 ...
- 容器镜像服务联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- SAP开源的持续集成-持续交付的解决方案
SAP开源的持续集成/持续交付的解决方案: (1) 一个叫做piper的github项目,包含一个针对Jenkins的共享库和一个方便大家快速搭建CI/CD环境的Docker镜像: (2) 一套SAP ...
- 容器镜像服务 联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 【持续集成与交付快速入门必备】
Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 [持续集成与交付快速入门必备]
- 构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境
构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境 整个环境的结构图. 一.准备工作 gitlab和harbor我是安装在kubernetes集群外 ...
随机推荐
- Mysql集群搭建(多实例、主从)
1 MySQL多实例 一 .MySQL多实例介绍 1.什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307,3308),运行多个MySQL服务进程,通 ...
- 【C++ Primer Plus】编程练习答案——第8章
1 void ch8_1_print(const std::string & str, int n = 0 ) { 2 using namespace std; 3 static int fl ...
- Go语言核心36讲(Go语言基础知识四)--学习笔记
04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...
- 题解 Hero meet devil
题目传送门 题目大意 给出一个长度为 \(n\) 的字符串,对于每个 \(k\in [0,n]\),求出有多少个长度为 \(m\) 的字符串满足两者最长公共子序列长度为 \(k\). \(n\le 1 ...
- ServletContext 学习
ServletContext web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用: 1.共享数据 在这个Servlet中保存了数 ...
- SpringBoot打包到docker(idea+传统方式)
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 1. 方式1.通过idea 远程发布 1.1 修改docker.service文件 1. 进入服务器 2. 修改ExecStart行为下面内容 ...
- 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...
- [no code][scrum meeting] Alpha 5
项目 内容 会议时间 2020-04-10 会议主题 后端技术讨论 会议时长 30min 参会人员 全体成员 $( "#cnblogs_post_body" ).catalog() ...
- 微服务(三) Eureka注册中心和Ribbon负载均衡
1. Eureka注册中心 1.1 Eureka的结构和作用 在上一篇文章中 微服务(二)服务拆分及远程调用 order-service在发起远程调用的时候,该如何得知user-service实例的i ...
- rabbitmq死信队列和延时队列的使用
死信队列&死信交换器:DLX 全称(Dead-Letter-Exchange),称之为死信交换器,当消息变成一个死信之后,如果这个消息所在的队列存在x-dead-letter-exchange ...