先了解一下Jenkins
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,提供了数百个插件来支持构建,部署和自动化任何项目。我们可以使用Jenkins
结合常用的版本控制工具(git、svn等)
来实现自动部署项目,比如说我们从本地上传代码到Gitlab代码仓库,Jenkins就会帮我们自动同步代码,然后经编译打包之后推送至远程Docker仓库,再之后我们通过服务器从远程Docker仓库拉取镜像、创建及启动容器,然后就可以通过浏览器访问了,整个过程几乎都是自动完成的,而我们只需要上传代码就可以了,接下来我们一起来看看整个搭建过程吧。
本文环境
Docker Version 19.03.11:https://www.cnblogs.com/niceyoo/p/13096181.html
Maven Version 3.3.9:https://www.cnblogs.com/niceyoo/p/13068935.html
JDK Version 1.8.0_181:https://www.cnblogs.com/niceyoo/p/11483139.html
GitLab:https://www.cnblogs.com/niceyoo/p/13057533.html
Jenkins Version 2.222.4:参考本文
通过本文可以了解哪些
- 通过Docker部署Jenkins
- 使用Jenkins一键部署Springboot项目
- 整合GitLab实现上传代码自动部署项目
如下Jenkins安装及配置过程
1、拉取代码
代码语言:txt复制docker pull jenkins/jenkins:lts
2、创建并启动容器:
在构建的过程,由于我本身CentOS已经安装JDK、Maven了「可以参考上方的安装链接」,所以在这我就直接指定本地环境变量了,当然,如果你不指定的话,安装完Jenkins后还是可以在全局工具配置
中修改的:
docker run --name=jenkins --privileged=true
-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 $(which docker):/usr/bin/docker
-v /etc/sysconfig/docker:/etc/sysconfig/docker
-v /usr/java/jdk1.8.0_181:/usr/java/jdk1.8.0_181
-v /home/maven/apache-maven-3.3.9:/usr/local/maven
-v /home/maven/repo:/usr/local/maven_repository
-v /home/jenkins-data:/var/jenkins_home
jenkins/jenkins:lts
启动后在浏览器输入:http://容器ip:8080 访问。
管理员密码需要我们在log
中查询:
docker logs jenkins
3、安装推荐的插件
输入密码登陆后,会弹出插件安装提示,我们在这选择安装推荐的插件:
接下来就进入漫长的等待状态~
4、创建管理员账号
安装之后,接下来创建一个账号:
进行实例地址配置,该地址将作为将来Jenkins
的访问地址:
至此,保存并完成,会重启Jenkins
,然后我们可以通过刚刚创建的账户登录「使用管理员root也可以」:
5、Maven配置修改
之前我们创建容器时复用了本地宿主机的Maven环境变量
,但是安装完Jenkins
后还是要指定一下Maven
目录的,依次进入:系统管理
> 全局工具配置
首先是顶部的Maven
,我们选择文件系统中的setting
文件,文件路径
使用创建容器时指定的Maven
路径 usr/local/maven
:
/usr/local/maven/conf/settings.xml
然后拉到最下边Maven
节点,点击新增Maven
,起一个名字,然后指定maven路径
,去掉自动安装
的选项,然后应用>保存
:
6、新建一个任务
然后我们新建一个任务,选择构建一个自由风格的软件项目
:
点击确定之后会跳入配置界面,接下来就是配置我们的自动化操作,首先是配置项目的拉取地址,在这我是基于Gitlab的,关于Gitlab的搭建可以参考这篇:https://www.cnblogs.com/niceyoo/p/13057533.html
点击添加GitLab的账户密码,不添加时会报红,是没法在GitLab中拉取代码的:
接着我们选择一下构建指令执行shell
:
#!/bin/bash
result=$(docker ps | grep "10.211.55.4:5000/niceyoo-demo")
if [[ "$result" != "" ]]
then
echo "stop niceyoo-demo"
docker stop niceyoo-demo
fi
result1=$(docker ps -a | grep "10.211.55.4:5000/niceyoo-demo")
if [[ "$result1" != "" ]]
then
echo "rm niceyoo-demo"
docker rm niceyoo-demo
fi
result2=$(docker images | grep "10.211.55.4:5000/niceyoo-demo")
if [[ "$result2" != "" ]]
then
echo "10.211.55.4:5000/niceyoo-demo:latest"
docker rmi 10.211.55.4:5000/niceyoo-demo:latest
fi
这个地方解释一下为啥要用到shel脚本,这个脚本有两个操作,首先是通过 docker ps | grep "10.211.55.4:5000/niceyoo-demo"
查询是否存在容器,如果存在的话则stop
停止容器,然后再rm
删除容器,第二步是通过 docker ps -a | grep "10.211.55.4:5000/niceyoo-demo"
查看是否存在该镜像,如果存在则 rmi
删除该镜像,为啥要删除镜像 容器?其实这样是帮助我们把每次自动化构建镜像、容器之前都把旧的给删除掉。
"10.211.55.4:5000/niceyoo-demo" 是我项目打包后的镜像名称,组成规则为:镜像地址/项目名称
然后添加Maven指令,用于构建项目,简单说一下这个地方,我在项目的 pom.xml
,文件中使用了 docker-maven-plugin
插件,同时替换了 mvn pavkage
指令,当每次执行该命令时就会自动提交至Docker远程私有仓库中,私有仓库是基于Docker Registry搭建的,关于Registry的搭建可以参考这篇:https://www.cnblogs.com/niceyoo/p/13058238.html
clean package
如下是SpringBoot项目 pom.xml
文件中的插件编写,已经把注释写的很清楚了:
<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>
<!--镜像名称-->
<imageName>10.211.55.4:5000/${project.artifactId}</imageName>
<!--指定dockerfile路径-->
<!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>-->
<!--指定标签-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--远程仓库地址-->
<registryUrl>10.211.55.4:5000</registryUrl>
<pushImage>true</pushImage>
<!--基础镜像jdk1.8-->
<baseImage>java</baseImage>
<!--制作者提供本人信息-->
<maintainer>niceyoo apkdream@163.com</maintainer>
<!--切换到ROOT目录-->
<workdir>/ROOT</workdir>
<cmd>["java","-version"]</cmd>
<entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
<!--指定远程docker地址-->
<dockerHost>http://10.211.55.4:2375</dockerHost>
<!--这里是复制jar包到docker容器指定目录配置-->
<resources>
<resource>
<targetPath>/ROOT</targetPath>
<!--指定需要复制的根目录,${project.build.directory}表示target目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件,${project.build.finalName}.jar表示打包后的jar包文件-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<!--执行mvn package时,替换为执行mvn package docker:build-->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
接下来再添加一个执行shell
,用来执行构建容器:
docker run --rm -d -p 9999:9999 --name niceyoo-demo 10.211.55.4:5000/niceyoo-demo
部分参数解释:在这我用的 -p 9999
端口,--nama
后面指向的是重命名后的容器名称 niceyoo-demo
镜像的名称 10.211.55.4:5000/niceyoo-demo
,接下来就是应用 保存
了:
到这,我们就可以运行一下了,点击立即构建
,然后通过点击 Build History
中的 控制台输出
等待一会,最后看到下图所示,BUILD SUCCESS
就可以了
然后我们在Registry
私有镜像仓库看一下是否推送:
再看看最后一步的shell脚本帮我们创建并启动容器了没~
到这我们就可以在浏览器访问项目了:
7、创建Gitlab钩子
我们要实现的最终效果是一上传代码就帮我们自动执行如上整个过程~,那么我们需要配合Gitlab的钩子实现,首先我们先去系统管理
> 插件管理
安装 GitLab
插件。
安装后我们进入项目配置界面,切换至构建触发器
:
我们复制这个链接,然后进入GitLab项目中的 setting
> Webhooks
「注意,这里是项目中的,非GitLab的setting配置」:
点击Add webhook
时,如果出现 Url is blocked: Requests to the local network are not allowed
:
解决方法: 进入GitLab首页顶部的小扳手 setting
> Network
目录,执行如下4步,不要忘记最后点击 save changes
然后我们再回到之前界面重新添加一下链接,点击Add webhook
配置之后测试一下:
如果上方提示200代表配置成功:
然后我们回到Jenkins项目面板就可以看到自动构建了:
到这基本就完成自动化创建了,只要上传代码就能完成构建了,比如我们通过Idea上传代码至GitLab,那么Jenkins就会帮我们实现自动化部署了:
上传完代码后Jenkins自动构建的截图:
可能会出现的问题 - 仅针对本文
1、/usr/bin/docker: 2: .: Can't open /etc/sysconfig/docker
/usr/bin/docker: 2: .: Can't open /etc/sysconfig/docker
出现这个问题说明创建的Jenkins是无法使用宿主机里的docker命令的,我们可以进入jenkins容器执行docker version
,正常情况是可以打印信息的,而不正常则如上方错误提示。
这个问题可以通过挂载 -v /etc/sysconfig/docker:/etc/sysconfig/docker
完成,再回到第2步看看是不是漏掉了。
2、You don't have either docker-client
You don't have either docker-client or docker-client-latest installed. Please install either one and retry.
这个问题我曾尝试使用 yum 安装最新的 docker-client,最后放弃了,然后就在纠结为何别人没出现这个问题,后来几经测试,果断卸载重装!
猜测之前使用 yum 默认安装的 docker 实在是太老了, 默认安装的是1.13.x版本,而现在最新版本都 19.x 了...
卸载重装最新版是不会把之前下载的镜像删掉的,前提是不要完全删除干净哈,我测试过了,咳咳.....
代码语言:txt复制yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
rm -rf /var/run/docker
安装最新Docker可以参考这篇:https://www.cnblogs.com/niceyoo/p/13096181.html
然后再重新拉取Jenkins,重新创建一下容器。
本文首发于博客园:https://www.cnblogs.com/niceyoo/p/13096218.html