从0开始搭建简易版pipeline任务持续集成与部署,基于docker+容器版jenkins+gitee来构造和推送服务镜像

211 阅读6分钟

最近活动低价买了个云服务器,老放着不用停浪费的,就想着折腾点啥上去。 我们公司有很强大的基础架构和运维部门,自研的基于私有云的发布平台确实挺好用,优美的可视化的操作界面,自动化程度又高,对业务开发程类型的程序员很友好,业务发布权限完全在自己手中,我超喜欢的。

基于公司的CI/CD模型(也是当前主流模型),自己捣鼓下简化版CI骨架搭建,实现基础功能。 包括:代码push、编译、打包、bulid镜像、push镜像(学习为主,省略诸如代码扫描、检查、单元测试、单测覆盖率、正确率等等)

前后花了一天时间,踩坑无数

准备

1.云服务器,本次使用的腾讯云的centos7
2.代码仓库:gitee

开始

一、 安装docker

1.查看和下载社区版docker:yum list docker-ce* 命令查看,(我的机器上已经下载了) image.png 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 image.png

2.拉取镜像到本地:docker pull jenkins/jenkins

3.查看本地镜像:docker images image.png

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 image.png

6.登录并访问jenkins image.png

初次访问会告诉你使用镜像指定文件的密码来登录,登录后提示修改密码,初始化插件,按照提示操作就好。

三、配置jenkins

1.进入jenkins
2.全局工具配置,主要配置maven、git、jdk等
3.插件安装,gitee官方开发的插件,使jenkins能访问gitee仓库,同时gitee代码变更能通知到jenkins
(1).点击可选插件tab,输入gitee,点击安装后重启。 image.png 安装完成之后,我是直接手动重启jenkins容器:docker restart 容器ID

3.系统配置
(1).配置gitee链接,在系统管理--系统配置,找到上面安装好的gitee插件,进行配置 image.png (2).输入你想要的连接名,我这里输入的是Gitee-01,以及gitee的域名
(3).添加令牌,根据提示进入私人令牌 - Gitee.com,获取令牌后填入保存

image.png (4).测试是否链接成功,点击测试链接按钮,提示成功与否

四、创建构建任务

1.创建一个流水线任务 image.png

2.配置任务
(1).选择上面配置好的gitee链接 image.png

(2).构建触发选择,我这里只选择了推送代码,表示任何一次的push都会触发jenkins构建 image.png

(3).配置分支、以及配置Gitee WebHook,点击生成按钮生成密码,也可以自行设置密码。 image.png

进入gitee的仓库web hook配置界面,根据提示生成一条web hook,点击测试按钮测试是否配置成功 image.png

(4).编写流水线脚本 image.png ①从仓库获取代码,其中credentialsId可以使用jenkins的pipeline片段生成器,输入git仓库和密码生成

②打包,此处有坑就是容器里的jenkins无法识别mvn命令 image.png 解决方式是

  • 重新执行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文件。 image.png

DockerFile内容如下,很简单,基于打好的jar包和java8来构镜像,容器运行时候执行jar -jar 启动java服务 image.png

  • 镜像名和tag要注意,docker官方有限制,必须按照用户名/仓库名:标签名,来构建镜像,不符合规范的无法push image.png

④推送镜像

五、启动构建任务

(1).点击立即构建,jenkins开始执行构建流水线任务 image.png

(2).执行完毕后,查看本地镜像仓库,多了刚才构建的镜像suynan/suynane:v1 image.png 登录dockerHub查看 image.png

执行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
image.png

4.访问服务
image.png image.png