0%

持续集成与持续部署

Jenkins+Docker+Gitlab三剑客实现自动化服务部署

概述

持续集成流程:

图片

DevOps

https://www.zhihu.com/question/58702398

DevOps是一种思想或方法论,它涵盖开发,测试,运维的整个流程,DevOps强调软件开发人员与软件测试,软件运维,质量保障(QA)部门之间有效的沟通与协作,强调通过自动化的方法管理软件变更、软件集成,使软件从构建到测试、发布更加快捷、可靠,最终按时交付软件。

image-20210105223530449

1.安装启动Docker

1.1 安装docker

1
2
3
4
5
6
7
8
9
10
# 1.yum包更新
yum update
# 2.安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3.设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4.安装docker,出现输入的界面都按 Y
yum install -y docker-ce
# 5.查看docker版本,验证是否成功
docker -v

1.2 配置镜像加速

https://liuurick.github.io/2019/12/17/Centos7%E4%B8%8A%E5%AE%89%E8%A3%85docker/

1.3 安装私有仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#搜索镜像
docker search registry
#拉取镜像
docker pull registry
#创建容器
docker run -d -p 5000:5000 registry
#配置私有仓库地址
vim /etc/docker/daemon.json
{
"insecure-registries": [xxx.xxx.xxx.xxx:xxx]
}

sudo systemctl daemon-reload
sudo systemctl restart docker

#启动本地仓库容器
docker start 容器ID

1.4 访问私有仓库

http://192.168.60.129:5000/v2/_catalog

注意:如果访问不到,关闭防火墙,或者开放端口

https://liuurick.github.io/2019/01/11/%E9%98%B2%E7%81%AB%E5%A2%99%E7%AE%A1%E7%90%86/

2.Docker下gitlab安装配置使用

2.1 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 1.查找gitlab镜像
docker search gitlab
# 2.gitlab镜像拉取
docker pull gitlab/gitlab-ce
# 3.查看本地镜像
docker images

# 4.本机建立的3个目录
# 为了gitlab容器通过挂载本机目录启动后可以映射到本机,然后后续就可以直接在本机查看和编辑了,不用再进行容器操作
# 5.配置文件
mkdir -p /home/gitlab/etc
# 6.数据文件
mkdir -p /home/gitlab/data
# 7.日志文件
mkdir -p /home/gitlab/logs

# 启动容器
docker run --name='gitlab' -d \
--publish 4443:443 --publish 8888:80 \
-v /home/gitlab/etc:/etc/gitlab \
-v /home/gitlab/data:/var/opt/gitlab \
-v /home/gitlab/logs:/var/log/gitlab \
gitlab/gitlab-ce:latest
# 查看启动日志
docker logs -f gitlab

2.2 配置

按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb(宿主机路径:/home/github/config/gitlab.rb)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#配置域名或IP

#配置gitlab.rb
cd /home/gitlab/etc
vim gitlab.rb

#配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://192.168.60.129'

#配置gitlab.yml
cd /home/gitlab/data/gitlab-rails/etc
vim gitlab.yml

gitlab:
host: 192.168.60.129
port: 8888
https: false

2.3 初始化密码

gitlab默认管理用户是root

登录:http://192.168.60.129:8888登录修改root的密码

image-20210106154349786

2.4 登录

用户名密码

2.5 创建项目

http-demo

3.安装git

1
2
3
4
# 安装
yum install -y git
# 查看版本
git version

4.使用git管理项目

4.1 使用IDEA从Gitlab检出空项目

项目地址:http://192.168.60.129:8888/root/http-demo.git

4.2 复制项目并允许

IDEA中运行项目并访问:http://127.0.0.1:10000/user/1

image-20210106170848265

注意:记得开放防火墙端口

4.3 提交代码到gitlab

在工程根目录创建.gitignore,忽略掉无用的代码

1
2
3
.idea/
target/
*.iml

image-20210106165440198

5.SpringBoot工程制作镜像

https://liuurick.github.io/2021/01/06/SpringBoot%E5%B7%A5%E7%A8%8B%E5%88%B6%E4%BD%9C%E9%95%9C%E5%83%8F/

6.持续集成概述

持续集成是什么?:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html

传统的软件开发流程如下:

  1. 项目经理分配模块给开发人员
  2. 每个模块的开发人员并行开发,并进行单元测试
  3. 开发完毕,将代码集成部署到测试服务器,测试人员进行测试
  4. 测试人员发现bug,提交bug,开发人员修改bug
  5. bug修改完毕再次集成、测试

问题描述:

  1. 模块直接依赖关系复杂,在集成时发现大量bug
  2. 测试人员等待测试时间过长
  3. 软件交付无法保障

解决上述问题思考:

  1. 能否集成测试时间提前?
  2. 能否使用自动化工具代替人工集成部署的过程?

持续集成:

持续集成(Continuous integration,简称CI),持续集成的思想是每天要多次将代码合并到主干,并进行集成,测试,这样就可以提早发现错误,进行修正。持久集成也属于DevOps

持续集成的好处:

  1. 自动化集成部署,提高了集成效率
  2. 更快的修复问题
  3. 更快的进行交付
  4. 提高了产品质量

7.Jenkins安装配置使用

Jenkins一个领先自动化服务器的安装与配置

https://www.jenkins.io/

7.1 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#搜索镜像
docker search jenkins
#拉取镜像
docker pull jenkins/jenkins:lts
#创建容器
docker run --name=jenkins\
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64:/usr/java/jdk1.8.0_181 \
-v /usr/local/maven3:/usr/local/maven \
-v /usr/local/maven_repository:/usr/local/maven_repository \
-v /home/jenkins-data:/var/jenkins_home \
jenkins/jenkins:lts

7.2 解锁Jenkins

http://192.168.60.129:8080/ 首次登录需要解锁Jenkins

image-20210106193016306

进入容器内部docker exec -it jenkins bash

/home/jenkins-data:/var/jenkins_home/secrets/initialAdminPassword,得到密码并粘贴过去

然后是自动配置,配置了好久。。。。。。。。

image-20210106201608652

7.3登录

8.持续集成的实现

8.1 编写pom.xml文件

使用Jenkins进行构建,在http-demo工程根目录编写pom_docker_registry.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.liuurick</groupId>
<artifactId>http-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>http-demo</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<registryUrl>192.168.60.129:5000</registryUrl>
<pushImage>true</pushImage>
<imageName>192.168.60.129:5000/${project.artifactId}</imageName>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.artifactId}-${project.version}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>

提交 gitlab仓库

8.2.创建持续集成任务

8.2.1 创建构建任务

1
http-demo

image-20210106202915087

8.2.2 配置git仓库

1
Repository URL:http://192.168.60.129:8888/root/http-demo.git

image-20210106203306714

8.2.3 maven构建配置

使用shell脚本停止容器、删除容器、删除镜像,shell脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
result=$(docker ps | grep "192.168.60.129:5000/http-demo")
if [[ "$result" != "" ]]
then
echo "stop http-demo"
docker stop http-demo
fi
result1=$(docker ps -a | grep "192.168.60.129:5000/http-demo")
if [[ "$result1" != "" ]]
then
echo "rm http-demo"
docker rm http-demo
fi
result2=$(docker images | grep "192.168.60.129:5000/http-demo")
if [[ "$result2" != "" ]]
then
echo "192.168.60.129:5000/http-demohttp-demo:0.0.2-SNAPSHOT"
docker rmi 192.168.60.129:5000/http-demo-0.0.1-SNAPSHOT
fi

执行maven构建

1
clean package -f pom_docker_registry.xml  -DskipTests docker:build

拉取镜像,创建容器,启动容器

1
docker run --name http-demo -p 10000:10000 -idt 192.168.60.129:5000/http-demo-0.0.1-SNAPSHOT

image-20210106204110819

8.4 执行任务

修改代码内容自动构建

注意:可能会遇到容器端口号冲突的问题,docker stop即可

8.5 自动构建

1
2
3
jenkins中拿到钩子地址:**Build Triggers**

gitlab中配置钩子地址:http://192.168.60.129:8080/project/http-demo

image-20210106211347397

image-20210106211501350

添加成功后:Test–》Push events测试一下

注意:

  • URL is blocked Requests to the local network are not allowed

    Admin area–>Settings–>Network–>勾选

image-20210106212334409

  • 通过用户名密码构建的不需要配置gitlab