jenkins自动部署_使用Jenkins搞定后端自动化部署

先了解一下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、拉取代码
docker pull jenkins/jenkins:lts
d37c927dbb51c43d6ae40197eedb2cde.png
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
692d915f7b87e915aee1fae8ca86ee05.png

启动后在浏览器输入:http://容器ip:8080 访问。

73677a210c946702a24cdae288e7b709.png

管理员密码需要我们在log中查询:

docker logs jenkins
441a9b6119b602ab0a3ec925e99ef67b.png
3、安装推荐的插件

输入密码登陆后,会弹出插件安装提示,我们在这选择安装推荐的插件

aeaee03af318c99484fe951e6a53ff9d.png

接下来就进入漫长的等待状态~

2d4805d735b0c9dbf37a298a98af760c.png
4、创建管理员账号

安装之后,接下来创建一个账号:

0aa7a3467904378ece6594a01d3ccdec.png

进行实例地址配置,该地址将作为将来Jenkins的访问地址:

bb71324daa1634403bcf586fc2bd4ee4.png

至此,保存并完成,会重启Jenkins,然后我们可以通过刚刚创建的账户登录「使用管理员root也可以」:

14dfbd1cd097c4a584cf860f7f14c3ff.png
5、Maven配置修改

之前我们创建容器时复用了本地宿主机的Maven环境变量,但是安装完Jenkins后还是要指定一下Maven目录的,依次进入:系统管理 > 全局工具配置

de3cf66bba9737de0894a8d69c1e707b.png

首先是顶部的Maven,我们选择文件系统中的setting文件,文件路径使用创建容器时指定的Maven路径 usr/local/maven

/usr/local/maven/conf/settings.xml
be51679c52da1ab0a5c76efe71322f5c.png

然后拉到最下边Maven节点,点击新增Maven,起一个名字,然后指定maven路径,去掉自动安装的选项,然后应用>保存

1ca68616c010fdecab186c7da9d8d903.png
6、新建一个任务

然后我们新建一个任务,选择构建一个自由风格的软件项目

ebf51d751ff7a5a1625950ce366e91c6.png

点击确定之后会跳入配置界面,接下来就是配置我们的自动化操作,首先是配置项目的拉取地址,在这我是基于Gitlab的,关于Gitlab的搭建可以参考这篇:https://www.cnblogs.com/niceyoo/p/13057533.html

08391f29fd8cb8402e1108bb6124abbe.png

点击添加GitLab的账户密码,不添加时会报红,是没法在GitLab中拉取代码的:

1a3905eaafa9cd520010ef3cb4b3f39a.png

接着我们选择一下构建指令执行shell

417c19c9fed2b6f82156c56af2141a47.png
#!/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" 是我项目打包后的镜像名称,组成规则为:镜像地址/项目名称

6b0385c6a68286c448df111c695dfb11.png

然后添加Maven指令,用于构建项目,简单说一下这个地方,我在项目的 pom.xml,文件中使用了 docker-maven-plugin 插件,同时替换了 mvn pavkage 指令,当每次执行该命令时就会自动提交至Docker远程私有仓库中,私有仓库是基于Docker+Registry搭建的,关于Registry的搭建可以参考这篇:https://www.cnblogs.com/niceyoo/p/13058238.html

b154152655481b4ba7470a76cf64399a.png
clean package

如下是SpringBoot项目 pom.xml 文件中的插件编写,已经把注释写的很清楚了:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
        plugin>
        <plugin>
            <groupId>com.spotifygroupId>
            <artifactId>docker-maven-pluginartifactId>
            <version>1.0.0version>
            <configuration>
                
                <imageName>10.211.55.4:5000/${project.artifactId}imageName>
                
                
                
                <imageTags>
                    <imageTag>latestimageTag>
                imageTags>
                
                <registryUrl>10.211.55.4:5000registryUrl>
                <pushImage>truepushImage>
                
                <baseImage>javabaseImage>
                
                <maintainer>niceyoo apkdream@163.commaintainer>
                
                <workdir>/ROOTworkdir>
                <cmd>["java","-version"]cmd>
                <entryPoint>["java","-jar","${project.build.finalName}.jar"]entryPoint>
                
                <dockerHost>http://10.211.55.4:2375dockerHost>
                
                <resources>
                    <resource>
                        <targetPath>/ROOTtargetPath>
                        
                        <directory>${project.build.directory}directory>
                        
                        <include>${project.build.finalName}.jarinclude>
                    resource>
                resources>
            configuration>
            
            <executions>
                <execution>
                    <id>build-imageid>
                    <phase>packagephase>
                    <goals>
                        <goal>buildgoal>
                    goals>
                execution>
            executions>
        plugin>
    plugins>
build>

接下来再添加一个执行shell,用来执行构建容器:

e1608b3456d1b4fc249d2b50553915c5.png
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,接下来就是应用+保存了:

2a244cbad118e7f44c270ff8fb777503.png

到这,我们就可以运行一下了,点击立即构建,然后通过点击 Build History 中的 控制台输出

ab4dd0cba70a15dbd882b608504ad91f.png

等待一会,最后看到下图所示,BUILD SUCCESS 就可以了

574de26245063753105c63503a00bc73.png

然后我们在Registry私有镜像仓库看一下是否推送:

370cdce426e2460782bba3a531e0034b.png

再看看最后一步的shell脚本帮我们创建并启动容器了没~

ce2b6702b0ba3abfae0b46fcb11fae3a.png

到这我们就可以在浏览器访问项目了:

2331349f44cbedacb98d6797c7c34ae1.png
7、创建Gitlab钩子

我们要实现的最终效果是一上传代码就帮我们自动执行如上整个过程~,那么我们需要配合Gitlab的钩子实现,首先我们先去系统管理 > 插件管理 安装 GitLab 插件。

509529ed15801b3b10ddd8302d639b1a.png

安装后我们进入项目配置界面,切换至构建触发器

35307d2cb9cac34aff0ae63da294ed55.png

我们复制这个链接,然后进入GitLab项目中的 setting > Webhooks 「注意,这里是项目中的,非GitLab的setting配置」:

de2f7080d9faa0fa483d0f02e8235146.png

点击Add webhook时,如果出现 Url is blocked: Requests to the local network are not allowed

b33c45c133ef96ae59251efeb64cf1b6.png

解决方法: 进入GitLab首页顶部的小扳手 setting > Network 目录,执行如下4步,不要忘记最后点击 save changes

0220058cc5d9937d387cbbf9b45335e1.png

然后我们再回到之前界面重新添加一下链接,点击Add webhook配置之后测试一下:

f7574e68b38b67f4bb819d2099c86efb.png

如果上方提示200代表配置成功:

9b45acebe2a35dcf89de2c1e6913dd7b.png

然后我们回到Jenkins项目面板就可以看到自动构建了:

021011509367a2a225d27a2bbfdac4a1.png

到这基本就完成自动化创建了,只要上传代码就能完成构建了,比如我们通过Idea上传代码至GitLab,那么Jenkins就会帮我们实现自动化部署了:

72ac961a853aed6793ca645a0f798faa.png

上传完代码后Jenkins自动构建的截图:

b0ec2aeabdae2f1baeefe5c4ac219f89.png

可能会出现的问题 - 仅针对本文

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.

d1005579a35f92471189855f57017bab.png

这个问题我曾尝试使用 yum 安装最新的 docker-client,最后放弃了,然后就在纠结为何别人没出现这个问题,后来几经测试,果断卸载重装!

猜测之前使用 yum 默认安装的 docker 实在是太老了, 默认安装的是1.13.x版本,而现在最新版本都 19.x 了...

卸载重装最新版是不会把之前下载的镜像删掉的,前提是不要完全删除干净哈,我测试过了,咳咳.....

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  

CentOS中安装最新Docker可以参考这篇:https://www.cnblogs.com/niceyoo/p/13096181.html

重装后再重新拉取Jenkins,重新创建一下容器。

a2d11b3b3e56f0ac06d5b676d58dcd51.png

推荐阅读

基于Docker搭建私有镜像仓库

基于Docker的Maven私服搭建

点击写留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值