docker | jenkins 实现自动化CI/CD,后端躺着把运维的钱挣了!(下)
前言
在上一篇文章中,我们使用docker编写Dockerfile
文件,将我们自己的项目构建成镜像,然后发布到Docker Hub
中,并且用自己的云服务器拉取Docker Hub上我们自己上传的项目镜像,并且由该镜像运行容器,使得我们成功将自己的项目用docker运行了起来,并且外网访问测试通过。
如果还没有使用过docker自己构建过镜像的同学还是建议先阅读第一篇文章:传送门
在本篇文章中,将讲解使用jenkins帮助我们监听git仓库的变化,一旦有新的push到master分支,jenkins服务则从gitee主动拉取项目代码,构建新镜像(借助上一节编写好的Dockerfile文件),然后删除同名旧镜像和旧容器,部署新容器。
而对于开发者来说,你向远程仓库的master
分支push
了新的代码之后,就可以马上访问url看到最新的项目运行结果,一切都将由jenkins帮你完成(只要事先配置好jenkins工作流程)
最初我学编程很喜欢看视频,而且是那种长而全的视频,总觉得能看到别人每一步的操作就很踏实,但是渐渐的,还是看文档多一些,我也在这里推荐大家尝试阅读文档,英文看起来慢就找中文的,相比于视频,看文档能快速找到你需要的点,而视频需要跟着别人的节奏,相对会慢一些。(但刚开始学编程我还是推荐看视频,后面辅以阅读书籍文档与博客文章)
jenkins相关
安装
核心是下面这个运行docker容器的shell,关于这些参数的作用我前一篇文章已经讲过,如果不太清楚可以回过去结合着一起看。
docker run \
-d \
--rm \
-u root \
-p 8080:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \
jenkinsci/blueocean
登录
运行jenkins容器之后,访问服务器ip:8080就能跳转到jenkins登录页面,第一次会让你输入一个密钥,这个在服务器运行Jenkins容器的时候控制台上就会显示(如果没有加上-d参数)。
或者输入下面的命令查看jenkins的密钥
cat /var/lib/jenkins/secrets/initialAdminPassword
填入密钥之后就会跳转至jerkins页面,首次登录它会提示你安装推荐的插件,点击即可。然后会引导你创建一个登录jerkins的用户,输入用户名,密码和邮箱等信息完成创建,之后访问服务器ip:8080
就会提示你输入用户名和密码进行登录jenkins。
新建任务
点击左侧新建任务,输入你的任务名称,如wood-app-backend,然后选择构建自由风格的项目
然后会跳转至Jenkins项目配置区,选择源码管理项,Git选项,输入你Git仓库的地址,然后在Credentials处添加你Git仓库的用户名和密码,并且选择监听master分支(默认就是)
我们需要的效果是一旦git仓库发生变化就要自动构建镜像,并且部署新的镜像容器,所以在构建触发器项下选择轮询SCM,使用corn表达式控制Jenkins监听git仓库的频率为每分钟一次
下面是最核心的操作,jenkins要做的事我们已经知道了,那jerkins怎么知道呢?需要通过shell脚本指定,这里的shell就是Jenkins在监听到git仓库的master分支发生变化时要做的事情,包括删除已创建的容器(因为端口被旧容器占用,需要强制删除),构建新的镜像,运行新的容器
if docker ps -a|grep -i wood-app-backend;then
docker rm -f wood-app-backend
fi
#删除已建的容器,防止容器名,端口冲突
sleep 1
docker build -t baize1998/wood-app-backend:latest . #根据dockerfile生成镜像
sleep 1
docker run -d -p 5000:5000 --name wood-app-backend baize1998/wood-app-backend:latest #运行镜像生成容器
删除旧镜像
上面的shell命令中有删除旧容器的命令,但是没有删除旧镜像的命令(每次构建同名新镜像,旧的镜像就会变成none,但是依旧占据空间,需要回收)
但是直接在shell中编写删除镜像的命令在回收时可能会发生错误,所以额外创建一个定时任务去回收这些旧的镜像,这里指定清理镜像的任务的执行频率是每天的凌晨一点钟(可以自行控制)
shell脚本用于判断是否存在<none>状态
的镜像,并对它们进行回收
echo ---------------Clear-Images...------------------
clearImagesList=$(docker images -f "dangling=true" -q)
if [ ! -n "$clearImagesList" ]; then
echo "no images need clean up."
else
docker rmi $(docker images -f "dangling=true" -q)
echo "clear success."
fi
测试CI/CD
CI--持续集成(一旦push之后,新的镜像会构建),CD--持续部署(一旦push之后,新的容器会依据新的镜像运行,提供最新的服务),下面修改我们的项目接口,然后push到远程仓库的master分支
一分钟后,访问服务器ip:5000看到jenkins已经完成项目镜像构建以及新项目容器的运行,提供了最新的服务,之后便可以进行敏捷的开发了!
结束语
这篇文章讲述的使用Jenkins是比较取巧的,使用corn每分钟监听一次git仓库的变化达到这种细粒度的CI/CD效果,当然这只是jenkins功能的冰山一角,具体jenkins部署阶段还可以细分为构建、测试、部署等,也可以针对不同的推送命令配置不同的应答行为,每个阶段也可以指定执行各种脚本,这个就要学习Jenkins的pipeline机制,通过流水线的方式指定更详细和规范的CI/CD流程,不过到目前为止,学校里项目的开发维护功能也勉强够用了~
建了一个春秋招备战/内推/闲聊群,欢迎大家加入。
关注公众号【程序员白泽】,带你走近一个有点话痨的程序员/学生党。
docker | jenkins 实现自动化CI/CD,后端躺着把运维的钱挣了!(下)的更多相关文章
- docker | jenkins 实现自动化部署项目,后端躺着把运维的钱挣了!(上)
前言 背景 最近在帮学校导师写项目,团队有4个人,项目前后端分离.如果是选择瀑布式开发:(在约定好接口的情况下)A.B同学写前端,C.D同学写后端,然后约定一个时间统一联调,最后将项目交付安装到客户机 ...
- Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战 互联网Java架构 2018-09-19 15:46:13 一.发布流程设计 工作流程: 开发人员提交代码到Git版本仓库:Jenkins人工/定时 ...
- Jenkins 与Docker/Kubernetes的自动化CI流水(笔记)
一.CI/CD 持续集成(continuous Integration,CI):代码合并.构建.部署.测试都在一起.不断执行这个过程,并对结果反馈. 持续部署(Continuous Deploymen ...
- 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境
庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...
- 开发人员要学的Docker从入门到日常命令使用(通俗易懂),专业运维人员请勿点!
一.介绍Docker 1.引言 问题1:开发人员告诉测试说自己的项目已经做好了,给你一个发布包,你去测试吧. ## 测试人员,为什么我运行会报错? ## 开发人员说,我本地运行没有问题呀! 解答 ...
- Docker: Jenkins与Docker的自动化CI/CD流水线实战
什么是CI/CD 持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈.持续部署(Continuous Deployme ...
- Docker 集成 Jenkins Gitlab 实现 CI/CD
首先介绍下环境部分,文章中共涉及到三台服务器,分别用 Gitlab,Jenkins,Deploy 三个名称代替,部署在内网环境,同时因为政策原因,服务器无法直接连通外网.下载 Jenkins 插件时需 ...
- Jenkins自动化CI CD流水线之1--介绍与安装
第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...
- 基于Kubernetes构建企业Jenkins master/slave CI/CD平台
搭建平台目的: k8s中搭建jenkins master/slave架构,解决单jenkins执行效率低,资源不足等问题(jenkins master 调度任务到 slave上,并发执行任务,提升任务 ...
随机推荐
- Shell中 heredoc 内容转义
1.在$符号前面加反斜杠,如: cat > test.sh <<EOF \$test EOF 如果不加,将转成实际的值. 2.给EOF加个双引号,如: cat > test.s ...
- systemd学习及使用
什么是systemd? (译)systemd是linux系统的一组基础构件块.它提供了一个系统和服务的管理,它以PID 1 的形式运行并启动系统的其余部分.systemd 使用积极的并行化功能,使用s ...
- Word2010制作课程表
原文链接:https://www.toutiao.com/i6487759634751816205/ 插入表格: 选择"插入"选项卡,"表格"功能组," ...
- Ubuntu16安装Nvidia驱动(GTX1060显卡)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 微服务架构 | 3.3 Apache Zookeeper 注册中心
@ 目录 前言 1. Zookeeper 基础知识 1.1 Zookeeper 是什么 1.2 Zookeeper 的数据结构 1.3 Watcher 机制 1.4 常见应用场景分析 1.5 Zook ...
- Kafka connector (kafka核心API)
前言 Kafka Connect是一个用于将数据流输入和输出Kafka的框架.Confluent平台附带了几个内置connector,可以使用这些connector进行关系数据库或HDFS等常用系统到 ...
- Maven 框架结构知识总结
1.maven目录结构 目录 内容 ${basedir} 存放pom.xml和所有子目录 ${basedir}/src/main/java 项目Java代码 ${basedir}/src/main/r ...
- java类的反射机制
1.获得一个类的类对象有哪些方式? - 方法1:类型.class,例如:String.class- 方法2:对象.getClass(),例如:"hello".getClass()- ...
- WebGPU图形编程(2):构建一个单色的三角形<学习引自徐博士教程>
非常兴奋,我坚持了下来,开始更新我的第二篇博客,还是关于WebGPU的,我在学习过程中,对这项技术非常感兴趣,即使它非常抽象,难以理解,因为我看到未来Web3D的发展,WebGPU会成为主流技术,学习 ...
- (3)puppet清单定义资源的语法
1.先看两个例子: a.创建一个文件 file{"/tmp/12567.txt": content => aaaaababbau, ensure => present ...