CI 、CD入门
一:jenkins实现CI操作
1.在jenkins环境安装jdk 、maven ,同事修改maven里的settings.xml中的两个配置:添加jdk插件版本并开启和私服镜像(也可以在jenkins页面的全局配置选择自动安装,但是自动安装速度很慢,所以这里选择手动安装,后面直接在全局配置指定目录)
2.上面两个装好后,后续通过共享数据卷的方式共享给jenkins容器,就可以在后面的jenkins容器内部使用到了
3.使用容器镜像启动jenkins,同时安装git parameter 、publish over ssh 插件
4.安装好ssh插件后,在系统配置的最下面可以添加目标服务器,用于后续的服务部署等,需要添加好账号密码或者密钥,指定工作目录
5.在jenkins里面创建工程—添加代码仓库—在“build”中添加调用顶层maven去构建(此处就能选择之前的maven环境,填写打包命令了)
此处对应上图中的pull拉去代码和build打包两步
6.继续在工程的config中配置“post-build actions”—send build artifacts over ssh连接目标服务器—选择服务器-在transfer下面填写需要上传的包,exec command可以填写执行命令
代码添加dockerfile:
代码添加dockercompose:
jenkins添加一个自由风格的软件项目,工程config页面添加构建后操作:
此处cd注意后面加绝对路径
此时,业务服务器每次打包的镜像版本相同,前面的老旧镜像会变成none,使用如下命令,对none镜像进行清理:
docker image prune -f 命令用于清理系统中未被使用的 Docker 镜像。具体来说,它会删除那些未被任何容器使用的悬空镜像(dangling images),从而释放磁盘空间。
此时,整个CI流程完成。
二:jenkins实现CD操作
工程中选择添加一个git parameter(对应上面的git parameter参数化构建),指定tag
打包前添加一个execute shell,拖拽到maven前面,要先切换到对应的版本或者提交点,再打包
引用前面的tag,后面在构建前,在代码仓库中的代码打上tag标签后,在进行构建
在代码仓库中的代码打上tag标签,重新回到jenkins,发现此时构建变成了build with parameters,可以看到旁边打的标签,选择对应的标签进行构建。
此时在构建日志里面可以看到, 在打包前 有一个git checkout $tag的操作
三、在jenkins容器内部制作容器镜像
上面两步是在部署服务的客户端制作镜像并启动。
1.前置条件:
jenkins容器内部需要有docker的执行权限:
1.在jenkins容器内部安装docker-------安装麻烦
2.直接让jenkins使用宿主机的docker----推荐,方法如下:
cd /var/run 该目录下有个docker.sock文件
修改docker.sock权限 :
chown root:root docker.sock
chmod o+rw docker.sock
再将宿主机上的/var/run/docker.sock映射到jenkins容器; 同时将docker命令和daemon.json映射进容器
修改docker-compose.yml文件,添加三行,如上图
docker-compose up -d -------重启jenkins
此时即可进jenkins容器内部,检查docker是否可用
- 此时代码处,可以不用dockercompose文件了,只用留下dockerfile
3.添加新tag后,修改jenkins工程,去掉前面传包到业务服务器并打包的配置,添加jenkins的shell模块,打包(因为此时jenkins是用的宿主机的docker,所以可以直接从宿主机docker images看到打的包),打包后继续添加上传镜像的命令
四:jenkins通知目标服务器,让目标服务器拉取harbor镜像
基本流程:
1.让jenkins告知目标服务器要拉取哪个镜像
2.判断当前容器是否正在运行这个容器,如果正在运行就要删除stop& remove,停止 并删除
3.如果目标服务器存在当前镜像,需要删除---可能就名字一样,内容不同
4.目标服务器拉取harbor镜像
5.将拉取下来的镜像运行成容器
(目标服务器需要知道如下内容:1.harbor地址/harbor仓库/镜像名:镜像版本 2.端口号)
计划在目标服务器使用脚本,完成上述逻辑
在目标服务器编写脚本,并逐步测试:
五:基于harbor的最终部署
将上述脚本文件加入环境变量,以便在任何时候都能执行
jenkins参数化构建,添加两个字符参数,定义容器port和宿主机port(和脚本对应)
构建后操作,添加ssh模块
六:jenkins流水线(区别于上述的自有风格软件项目)
此时jenkins工程里面已经没有构建和构建后的操作了,大体流程都是通过流水线脚本进行实现。
//所有的脚本命令都放在pipeline中
pipelline{
// 指定任务在哪个集群节点执行,如果有多个jenkins 就随机挑选一个
agent any
// 声明全局变量,方便后续使用
environment {
key = 'value'
}
stages {
stage(xxx) {
steps {
xxxx
}
}
stage(xxx) {
steps {
xxxx
}
}
}
}
实际使用的时候将steps里面的内容换成需要操作的内容,可以点击流水线语法,进去后选择需要的步骤,通过jenkins进行自动生成
七:通过jenkinsfile 维护流水线脚本
上述方式通过在流水线中直接写脚本,这里可以选择SCM,通过git的方式来维护脚本,脚本放在一个叫jenkinsfile的文件中,放在git仓库中
7.1 拉取git代码操作
推荐还是通过tag来拉取, 添加参数化构建:
同时使用jenkins中生成的脚本,替换掉jenkinsfile对应的位置,注意分支使用**${tag}**替换
7.2 maven构建项目
jenkins流水线语法这里选择脚本,输入maven构建语法后点击生成流水线脚本
替换掉jenkinsfile中的对应位置并保存
7.3 sonarqube检测代码质量
7.4 通过docker制作自定义镜像
7.5 推送镜像到harbor
jenkinsfile中可以添加变量,供后续使用方便,比如这里推送harbor镜像中的几个参数:
将生成的脚本剪切到jenkinsfile后,使用变量进行替换:
7.6 通过publish over ssh通知目标服务器部署
可以提前再jenkins中声明上面的容器端口的参数
流水线语法这里选择sshpublisher模块:
生成的脚本放到jenkinsfile中,注意要把这里的单引号改成双引号:
注意:Jenkins中添加参数化构建时的参数会在构建时显示出来,并可修改!!!