Jenkins+Docker+Gitlab三剑客实现自动化服务部署
概述
持续集成流程:
DevOps
https://www.zhihu.com/question/58702398
DevOps是一种思想或方法论,它涵盖开发,测试,运维的整个流程,DevOps强调软件开发人员与软件测试,软件运维,质量保障(QA)部门之间有效的沟通与协作,强调通过自动化的方法管理软件变更、软件集成,使软件从构建到测试、发布更加快捷、可靠,最终按时交付软件。
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的密码
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
注意:记得开放防火墙端口
4.3 提交代码到gitlab
在工程根目录创建.gitignore
,忽略掉无用的代码
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
传统的软件开发流程如下:
- 项目经理分配模块给开发人员
- 每个模块的开发人员并行开发,并进行单元测试
- 开发完毕,将代码集成部署到测试服务器,测试人员进行测试
- 测试人员发现bug,提交bug,开发人员修改bug
- bug修改完毕再次集成、测试
问题描述:
- 模块直接依赖关系复杂,在集成时发现大量bug
- 测试人员等待测试时间过长
- 软件交付无法保障
解决上述问题思考:
- 能否集成测试时间提前?
- 能否使用自动化工具代替人工集成部署的过程?
持续集成:
持续集成(Continuous integration,简称CI),持续集成的思想是每天要多次将代码合并到主干,并进行集成,测试,这样就可以提早发现错误,进行修正。持久集成也属于DevOps
持续集成的好处:
- 自动化集成部署,提高了集成效率
- 更快的修复问题
- 更快的进行交付
- 提高了产品质量
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
进入容器内部docker exec -it jenkins bash
/home/jenkins-data:/var/jenkins_home/secrets/initialAdminPassword,得到密码并粘贴过去
然后是自动配置,配置了好久。。。。。。。。
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/> </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 创建构建任务
8.2.2 配置git仓库
1
| Repository URL:http://192.168.60.129:8888/root/http-demo.git
|
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
|
8.4 执行任务
修改代码内容自动构建
注意:可能会遇到容器端口号冲突的问题,docker stop即可
8.5 自动构建
1 2 3
| jenkins中拿到钩子地址:**Build Triggers**
gitlab中配置钩子地址:http://192.168.60.129:8080/project/http-demo
|
添加成功后:Test–》Push events测试一下
注意: