最近活动低价买了个云服务器,老放着不用停浪费的,就想着折腾点啥上去。 我们公司有很强大的基础架构和运维部门,自研的基于私有云的发布平台确实挺好用,优美的可视化的操作界面,自动化程度又高,对业务开发程类型的程序员很友好,业务发布权限完全在自己手中,我超喜欢的。
基于公司的CI/CD模型(也是当前主流模型),自己捣鼓下简化版CI骨架搭建,实现基础功能。 包括:代码push、编译、打包、bulid镜像、push镜像(学习为主,省略诸如代码扫描、检查、单元测试、单测覆盖率、正确率等等)
前后花了一天时间,踩坑无数
准备
1.云服务器,本次使用的腾讯云的centos7
2.代码仓库:gitee
开始
一、 安装docker
1.查看和下载社区版docker:yum list docker-ce* 命令查看,(我的机器上已经下载了)
2.下载:yum install docker-ce
3.查看docker版本验证是否安装成功:docker -v 或者 docker info
注意:初次使用docker执行命令时候,由于没有启动,基本都会遇到Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running。
3.启动docker:
(1)切换到root:sudo su
(2)执行命令:systemctl start docker
二、安装jenkins(容器版),并启动
1.执行命令docker search jenkins,建议使用官方指定的镜像jenkins/jenkins
2.拉取镜像到本地:docker pull jenkins/jenkins
3.查看本地镜像:docker images
4.运行jenkins镜像启动镜像容器:docker run -d --name hellJenkins -p:8080:8080 -v /var/jenkins:/var/jenkins_home/ jenkins/jenkins 如果正常启动,会打印一串uuid的字符
命令解释:
-d:后台运行
--name:别名
-p:端口映射,比如-p:8082:8081,表示访问宿主机的8082端口会映射到容器的8081端口
-v:文件挂载,很重要,主要三方面的作用
(1).将容器目录挂载到宿主机,即使容器被删除,宿主机也会保留被删内容
(2).共享,在容器内修改容器的目录文件,宿主机目录文件也会被修改,反之也一样
(3).构建镜像容器为了保持轻薄,一般不会将很多基础组件构建在内,比如jdk、比如maven等,如果想在容器内执行maven命令,是无法操作的
ps:后面使用jenkins执行shell命令 mvn clean compile进行代码编译时,一直报错:mvn not found,折腾了很久,使用挂载来解决的
5.查看启动的容器:docker ps
6.登录并访问jenkins
初次访问会告诉你使用镜像指定文件的密码来登录,登录后提示修改密码,初始化插件,按照提示操作就好。
三、配置jenkins
1.进入jenkins
2.全局工具配置,主要配置maven、git、jdk等
3.插件安装,gitee官方开发的插件,使jenkins能访问gitee仓库,同时gitee代码变更能通知到jenkins
(1).点击可选插件tab,输入gitee,点击安装后重启。
安装完成之后,我是直接手动重启jenkins容器:docker restart 容器ID
3.系统配置
(1).配置gitee链接,在系统管理--系统配置,找到上面安装好的gitee插件,进行配置
(2).输入你想要的连接名,我这里输入的是Gitee-01,以及gitee的域名
(3).添加令牌,根据提示进入私人令牌 - Gitee.com,获取令牌后填入保存
(4).测试是否链接成功,点击测试链接按钮,提示成功与否
四、创建构建任务
1.创建一个流水线任务
2.配置任务
(1).选择上面配置好的gitee链接
(2).构建触发选择,我这里只选择了推送代码,表示任何一次的push都会触发jenkins构建
(3).配置分支、以及配置Gitee WebHook,点击生成按钮生成密码,也可以自行设置密码。
进入gitee的仓库web hook配置界面,根据提示生成一条web hook,点击测试按钮测试是否配置成功
(4).编写流水线脚本
①从仓库获取代码,其中credentialsId可以使用jenkins的pipeline片段生成器,输入git仓库和密码生成
②打包,此处有坑就是容器里的jenkins无法识别mvn命令
解决方式是
- 重新执行docker run 命令添加宿主机maven挂载-v /var/maven/apache-maven-3.8.3:/var/maven/apache-maven-3.8.3 jenkins(为了不混乱,执行run前先关闭和删除之前所有jenkins容器)
- 由于jenkins环境变量问题,接着需要使用软连接解决路径问题:
先进入容器:docker exec -u root-it xxxxxx bin/bash。
执行软连接命令:ln -s /var/maven/apache-maven-3.8.3/bin/mvn usr/bin/mvn(表示执行usr/bin/mvn时,使用/var/maven/apache-maven-3.8.3/bin/mvn)
③构建镜像,使用docker bulid命令构建镜像,构建好的镜像会放入本地仓库,需要注意几点:
- 找不到docker命令:同样重新执行run命令来添加挂载-v /usr/bin/docker:/usr/bin/docker。
- docker build -t suynan/suynane:v1.0 .命令的.不能少,会默认使用当前路径下的DockerFile文件。
DockerFile内容如下,很简单,基于打好的jar包和java8来构镜像,容器运行时候执行jar -jar 启动java服务
- 镜像名和tag要注意,docker官方有限制,必须按照用户名/仓库名:标签名,来构建镜像,不符合规范的无法push
④推送镜像
五、启动构建任务
(1).点击立即构建,jenkins开始执行构建流水线任务
(2).执行完毕后,查看本地镜像仓库,多了刚才构建的镜像suynan/suynane:v1
登录dockerHub查看
执行push可能会遇到几个问题
①权限不足,需要使用root来执行docker命令
① denied: requested access to the resource is denied,链接被拒绝,执行docker login,登录dockerHub账号即可。
② Docker An image does not exist locally with the tag:xxxxx,就是上面说的镜像命名不规范导致,必须严格按照定义的push规范,如我的账户ID是suynan,仓库名是suynane,则镜像名必须为:suynan/suyane:v1.0(v1.0可以替换)
六、使用镜像
1.登录云服务器,从远程的镜像仓库获取镜像:docker pull suynan/suynane:v1.0
2.开启云服务器的8082端口
3.运行镜像:docker run -d -p 8082:8081 suynan/suynane:v1.0
容器内springboot服务提供的端口是8081
4.访问服务