jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署

jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署

    • 1、 jenkins自动部署原理
    • 2、docker安装
    • 3、jenkins安装
    • 4、配置maven环境
    • 5、jenkins配置
    • 6、gitlab安装
    • 7、项目创建
    • 8、上传git
    • 9、新建item
    • 10、构建

1、 jenkins自动部署原理

jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

Jenkins可以构建一个自动化的持续集成环境可以使用它来“自动化”编译、打包、分发部署应用,它兼容ant、maven、gradle等多种第三方构建工具,同时与svn、git能无缝集成,也支持直接与知名源代码托管网站,如github、bitbucket直接集成。

开发push代码到gitlab,触发jenkins自动pull代码,通过maven编译、打包,然后通过执行shell脚本使docker构建镜像并push到私服(或者阿里云)仓库,此操作完成后jenkins服务器上再执行SSH命令登录到部署服务器,docker从仓库(私服)拉取镜像,启动容器。整个操作流程完成。
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第1张图片

2、docker安装

我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以上, RHEL/Centos 的内核修补过, centos6.5的版本就可以——这个可以试试)

1、root账户登录,查看内核版本如下

[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 
x86_64 x86_64 x86_64 GNU/Linux

2、把yum包更新到最新

[root@localhost ~]# yum update
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.ustc.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.cn99.com
base                                                                                                  | 3.6 kB  00:00:00     
extras                                                                                                | 3.4 kB  00:00:00     
updates                                                                                               | 3.4 kB  00:00:00     
正在解决依赖关系
--> 正在检查事务
---> 软件包 NetworkManager.x86_64.1.1.12.0-6.el7 将被 升级
---> 软件包 NetworkManager.x86_64.1.1.12.0-10.el7_6 将被 更新

(期间要选择确认,输入 y 即可)

3、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.ustc.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.cn99.com
软件包 device-mapper-persistent-data-0.7.3-3.el7.x86_64 已安装并且是最新版本
软件包 7:lvm2-2.02.180-10.el7_6.8.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 yum-utils.noarch.0.1.1.31-50.el7 将被 安装
--> 正在处理依赖关系 python-kitchen,它被软件包 yum-utils-1.1.31-50.el7.noarch 需要
...
...

4、设置yum源(选择其中一个)

yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)

[root@localhost ~]# yum-config-manager --add-repo 
https://download.docker.com/linux/centos/docker-ce.repo
已加载插件:fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to 
/etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

5、可以查看所有仓库中所有docker版本,并选择特定版本安装

[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
已加载插件:fastestmirror
可安装的软件包
 * updates: mirrors.cn99.com
Loading mirror speeds from cached hostfile
 * extras: mirrors.aliyun.com
docker-ce.x86_64            3:19.03.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable

6、安装Docker,命令:yum install docker-ce-版本号,我选的是docker-ce-18.03.1.ce,如下

[root@localhost ~]# yum install docker-ce-18.03.1.ce
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.ustc.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.cn99.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker-ce.x86_64.0.18.03.1.ce-1.el7.centos 将被 安装

7、 启动Docker,命令:systemctl start docker,然后加入开机启动,如下

[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable  docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# docker version
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:20:16 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm
 
Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:23:58 2018
  OS/Arch:      linux/amd64
  Experimental: false

3、jenkins安装

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

Docker添加阿里云镜像加速器,以便于docker在pul拉取l镜像文件的时候速度快些。

1、创建docker文件夹

[root@nginx-1 ~]# vi /etc/docker/daemon.json

2、编辑 daemon.json 文件

[root@nginx-1 ~]# vi /etc/docker/daemon.json

3、设置加速器地址

{
     
  "registry-mirrors": ["https://k9e55i4n.mirror.aliyuncs.com"]
}

4、重新加载和重启docker

[root@nginx-1 ~]# systemctl daemon-reload
[root@nginx-1 ~]# systemctl restart docker

5、部署jenkins

#拉取Jenkins官方提供的集成blueocean插件的镜像
docker pull jenkinsci/blueocean

#运行容器
docker run -d --name jenkins -u root -p 14639:8080 -p 50000:50000 --privileged=true  -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean

参数说明:
-d:守护进程的方式启动容器,不打印正在运行的此容器的Docker日志。(或 -it:交互的方式启动容器,打印容器的启动日志信息,相当执行了一遍 docker logs -f jenkins )。
-p:将容器的8080端口映射到宿主机的8888端口。
-v:挂载目录(宿主机目录:容器目录);挂载后,修改宿主机的挂载目录将直接影响到容器的目录。
--name:容器的名称。
--privileged:使用该参数,container内的root拥有真正的root权限。
jenkinsci/blueocean:指定镜像名。

6、访问jenkins
在浏览器上填入 http://<你的ip>:14639
失败:如果无法访问请检查系统防火墙或开端口。

 #CentOS7关防火墙
 systemctl stop firewalld
 
 #开放端口
 firewall-cmd --zone=public --add-port=14639/tcp --permanent
 firewall-cmd --reload

7、手动配置Jenkins
Jenkins初始化
出现如下页面,需要我们手动获取Admin初始密码。
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第2张图片

#进入容器
docker exec -it jenkins /bin/bash

#查看初始密码
cat /var/jenkins_home/secrets/initialAdminPassword

复制输出的内容,粘贴到Administrator password。此时进行下一步你会看到此界面,点击 Install suggested plugins
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第3张图片
等待安装完毕:
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第4张图片
漫长的等待之后到了下一步,创建admin用户:
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第5张图片
到这里,整个初始化Jenkins结束了,接下来是配置环境了……

4、配置maven环境

我们需要下载一个maven,然后配置自己公司setting.xml,比如私服地址。前面我们没有退出容器(也就是执行exit命令),如果退出了容器的朋友,可以执行如下命令进入容器,最后的时候我将对docker命令进行总结。

#进入容器
docker exec -it jenkins /bin/bash

#进入安装位置
cd /usr/local

#下载maven安装包
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

#解压压缩包
tar -zxvf apache-maven-3.3.9-bin.tar.gz

#删除压缩包
rm apache-maven-3.3.9-bin.tar.gz

#配置maven环境变量
vi /etc/profile
	在文件的最下面添加:
		#set Maven environment
		export MAVEN_HOME=/usr/local/maven
		export PATH=$MAVEN_HOME/bin:$PATH
		
#生效profile文件
source /etc/profile

#检查maven是否配置成功(显示maven home、java home等信息则配置成功)
mvn -v

从本机配置好setting文件,再将该文件传输到宿主机(也就是虚拟机)中

5、jenkins配置

jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第6张图片
到管理页面……
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第7张图片
点击Manage Plugins,安装maven插件……
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第8张图片
安装成功后,点击Global Tool Configuration,进行全局配置……

1、maven的setting提供:
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第9张图片
2、JDK配置(jenkins默认自动带dk1.8)
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第10张图片
3、Maven配置(之前手动安装的maven)
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第11张图片
最后,点击 应用 并 保存!

6、gitlab安装

1.gitlab镜像拉取

# gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本
$ docker pull gitlab/gitlab-ce

2.运行gitlab镜像

$ docker run -d  -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录

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

# gitlab.rb文件内容默认全是注释
$ vim /home/gitlab/config/gitlab.rb
# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://192.168.199.231'

# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.199.231'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
:wq #保存配置文件并退出
# 重启gitlab容器
$ docker restart gitlab

此时项目的仓库地址就变了。如果ssh端口地址不是默认的22,就会加上ssh:// 协议头
打开浏览器输入ip地址(因为我的gitlab端口为80,所以浏览器url不用输入端口号,如果端口号不是80,则打开为:ip:端口号)

7、项目创建

idea 创建springboot 的helloworld项目
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第12张图片
pom.xml

<?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.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>helloworld</artifactId>
    <version>0.0.1</version>
    <name>helloworld</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-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <finalName>app</finalName>
        <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>
                    <!--镜像名,这里用工程名-->
                    <imageName>${project.artifactId}:${project.version}</imageName>
                    <!--DockerFile文件所在目录-->
                    <dockerDirectory>src/main/docker</dockerDirectory>

                    <!--构建镜像的配置信息-->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <!-- docker配置,允许远程访问 -->
                    <dockerHost>http://10.2.130.179:2375</dockerHost>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
            <!-- Docker maven plugin -->
        </plugins>
    </build>

</project>

Dockerfile

FROM java:8
MAINTAINER luzc
COPY app.jar /
ENTRYPOINT ["java","-jar","app.jar"]

8、上传git

9、新建item

点击 新建Item ,出现如下页面……
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第13张图片
1、进入Item,配置你的任务……
git配置
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第14张图片
添加一个git的凭据提供者,填写git的账号和密码,然后Credentials选择刚刚添加的凭据者。
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第15张图片
配置Pre Steps(使用shell脚本对已存在的容器进行停止容器,删除容器,删除镜像)
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第16张图片

#!/bin/bash
result=$(docker ps| grep "hello-world") 
if [[ "$result" != "" ]]
then
echo "================docker stop hello-world================"
docker stop dec-netty
fi
result1=$(docker ps -a | grep "hello-world") 
if [[ "$result1" != "" ]]
then
echo "================docker rm hello-world================"
docker rm hello-world
fi
result2=$(docker images | grep "hello-world:0.0.1")
if [[ "$result2" != "" ]]
then
echo "================docker rmi hello-world:0.0.1================"
docker rmi hello-world:0.0.1
fi

Build Maven(maven构建项目)
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第17张图片

#maven命令(通过DockerFile将项目构建成docker镜像)
clean package docker:build

配置Post Steps(运行容器)
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第18张图片

#运行容器
docker run -d --name helloworld -p 12025:8080 helloworld :0.0.1
echo '================ 运行容器日志信息 ================'

最后,点击 应用 并 保存!

10、构建

jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第19张图片
点击第2步的构建列队中的任务,查看任务的日志信息……
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第20张图片
显示Finished: SUCCESS,则说明Jenkins自动构建成功!!!
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第21张图片
测试结果
jenkins+docker+maven+gitlab+springboot实现自动编译、打包、构建镜像、容器部署_第22张图片

你可能感兴趣的:(docker,jenkins,云计算,docker,云计算,jenkins)