CI/CD的总流程

流程图:
CI/CD的总流程图
流程简述:
1 用户提交代码
2.1 从 gitlab 拉取最新代码
2.2 使用 maven 构建成 jar
2.3 制作镜像
2.4 推送镜像到 Harbor
3.1 从 Harbor 拉取镜像
3.2 运行镜像
 

基础环境

安装GitLab : GitLab 安装及使用
安装Jenkins :Jenkins 安装和卸载
安装Harbor: Harbor 安装
安装Docker: Docker安装
 

初步持续集成

Jenkins配置

Jenkins插件安装

系统管理->插件管理
安装内容为:Maven、Gitlab、SSH、Docker
插件管理
安装Maven插件
安装Maven插件
安装Gitlab
安装Gitlab
安装SSH
安装SSH
安装Docker
安装Docker

添加凭据

进入凭证配置界面
凭证
新增凭证
新增
新增成功
新增成功

配置SSH远程服务器

SSH remote hosts,当我们需要使用ssh命令对发布服务器进行操作时,需要先配置发布服务器
场景:构建完成后,需要在发布服务器拉取镜像进行部署
系统配置
输入对应的信息,并校验是否连接成功!成功后,点击应用,保存。可配多个,配置方式一样
增加ssh远程配置

全局工具配置

项目使用SpringBoot,需要配置安装JDK、Maven、Docker、Git,勾选自动安装
全局工具配置

安装JDK

安装JDK

安装Git

安装Git

安装Maven

安装Maven

安装Docker

安装Docker

全局安全配置

 全局安全配置
不要防止跨站点请求伪造功能
不要防止跨站点请求伪造功能

新建Jenkins任务

新建任务,选择“构建一个Maven项目”,任务名称自定义
新建Jenkins任务

配置源码管理

选择Git,从gitlab复制克隆地址粘贴到Repository URL中,没有报错就表示OK的
注意:这里克隆的是HTTP方式的地址,如果用ssh,需要配置 API Token
源码管理配置

配置构建触发器

需要记录 URL 和 TOKEN,供 gitlab 配置 webhook 使用
配置触发条件
配置触发条件
点击高级,配置webhook策略,生成 TOKEN
生成token

配置构建环境

勾选后可以看到控制台打印的信息,属于可选配置
构建环境

配置构建命令

使用springboot项目的构建命令

clean package

构建

GitLab配置webhook

进入项目,进入webhook配置界面
进入webhook
填写记录好的 URL 和 TOKEN
按需勾选 webhook 的触发事件输入参数
关闭ssl验证
关闭ssl
点击 Add webhook,如图表示成功添加了 webhook,可以点击 Test 进行测试
webhook成功
添加webhook报错

 Url is blocked: Requests to the local network are not allowed

解决办法:Admin area => Settings => Network
进入admin
允许从webhook和服务向本地网络发出请求
允许

配置到这里,已经实现初步的持续集成了,效果是,分支提交后,自动打成jar包,剩下持续部署的任务就是运行这个jar包
但我们的方案不是直接运行这个jar包,而是构建成镜像,所以继续往下

 

镜像的持续集成

配置Harbor

新建项目

新建项目
新建项目
新建用户
新建用户

配置成员权限,按角色分配
配置成员权限

配置构建服务器

现在直接推送镜像到 Harbor,会有若干报错,挨个解决

1)报错:Got permission denied while trying to connect to the Docker daemon socket
原因:没有权限,因为用户Jenkins无法执行docker
解决方案:将jenkins用户加入docker组,重启Jenkins服务

sudo gpasswd -a jenkins docker
sudo service jenkins restart

2)报错: xxx server gave HTTP response to HTTPS client 或 Error response from daemon:xxx request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
原因:连接不上Harbor
解决方案:配置可访问
1、编辑 daemon.json,没有则创建一个

vim /etc/docker/daemon.json

内容如下,有端口需要加上端口

{
"insecure-registries": ["http://192.168.1.1:端口"]
}

重启

systemctl daemon-reload
systemctl restart docker

2、编辑 /usr/lib/systemd/system/docker.service

vim /usr/lib/systemd/system/docker.service

添加内容

EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/dockerd $OPTIONS

在这里插入图片描述

3)报错:Loaded: error (Reason: Invalid argument)
原因:/lib/systemd/system/docker.service 文件中 ExecStart 有两个值
解决方案:注释其中一个 ExecStart

配置 Dockerfile

Dockerfile 放在根目录下
dockerfile存放地方
指定jar包名称,修改pom文件

<build>
    <finalName>app</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.6.4</version>
        </plugin>
    </plugins>
</build>

SpringBoot 项目的 Dockerfile 配置

# 基础镜像
FROM java:8
# 制作人
MAINTAINER xxx
# 将工程的jar打包到镜像中
COPY target/app.jar demo.jar
# 暴露的端口
EXPOSE 7001
# 镜像启动后执行的命令
ENTRYPOINT  java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /demo.jar

构建后发现镜像的大小高达500多M,经过努力搜索资料,换成使用镜像 openjdk:8-jre-alpine
alpine镜像用的是Alpine Linux内核,比ubuntu内核要小很多
注意:进入容器时,后面的路径不是/bin/bash,而是 /bin/sh
$ docker exec -it container_name /bin/sh
新构建出来的镜像100多M,若有更好的镜像,大家互相交流

配置 Jenkins

选择执行shell
构建docker
shell脚本内容
Harbor部署地址为:192.168.1.1:8082,MAINTAINER为xxx

# 进入工作目录
cd $WORKSPACE
# 构建镜像
docker build -t xxx/app:v1 .
# 标记镜像
docker tag xxx/app:v1 192.168.1.1:8082/xxx/app:v1
# 查看镜像
docker images
# 登录 Harbor
docker login  192.168.1.1:8082 -u admin -p Harbor12345
# 推送到 Harbor
docker push 192.168.1.1:8082/xxx/app:v1

 

持续发布

配置发布服务器

安装Docke环境r:Docker安装
配置harbor服务器连接

vim /etc/docker/daemon.json

内容如下,有端口需要加上端口

{
"insecure-registries": ["http://192.168.1.1:端口"]
}

重启

systemctl daemon-reload
systemctl restart docker

配置Jenkins

进入工程配置界面,选择“Execute shell script on remote host using ssh”
发布

ssh内容
-p:主机(宿主)端口:容器端口,–name 自定义的容器名称

# 拉取镜像
docker pull 192.168.1.1:8082/xxx/app:v1
# 根据容器名称停止容器
docker stop app
# 根据容器名称删除容器
docker rm app
# 运行镜像,假设java项目端口为9999
docker run -p 9999:9999 -d --name app 192.168.1.1:8082/xxx/app:v1

开放发布服务器防火墙的端口

启停防火墙

systemctl start firewalld
systemctl stop firewalld

开放9999端口

firewall-cmd --zone=public --add-port=9999/tcp --permanent

重启防火墙:

systemctl reload firewalld

检查是否已开放

firewall-cmd --query-port=9999/tcp

报错记录

报错

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:

原因: jenkins 用户没有执行 docker 的权限

解决方案:docker.sock 赋予权限

chmod 777 /var/run/docker.sock

报错

unauthorized: unauthorized to access repository: xxxx, action: push

原因:没有 push 的权限
解决方案 :先登录 harbor,再 push

docker login  192.168.140.xx:xx -u admin -p Harbor12345
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐