背景:已经用spring cloud编写了一个项目,设想通过提交代码到github或者自己构建的gitlab来触发jenkins服务器自动构建并通过docker自动部署到服务器上。

1 软件安装部署

1.1 安装虚拟机用于模拟jenkins 和 docker

采用kali linux 【后面改为zorin linux 因为界面比较好看】,具体安装方法百度。
在这里插入图片描述
安装完成后如下界面
在这里插入图片描述
Zorin Linux 基于Ubuntu优化的linux界面如下:
在这里插入图片描述

1.2 在虚拟linux上安装Docker

cd /etc/apt 
gedit sources.list

编辑填入软件源:

#清华大学 [更新源]
deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free 
deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free 
#浙江大学[更新源]
deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free 
deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free 
#jenkins
deb https://pkg.jenkins.io/debian-stable binary/

执行更新命令

//step 1

apt-get update
apt-get install -y apt-transport-https ca-certificates
apt-get install dirmngr

//step 2

apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 \
--recv-keys 58118E89F3A912897C070ADBF76221572C52609D

//step 3
echo 'deb https://apt.dockerproject.org/repo debian-stretch main' > \
/etc/apt/sources.list.d/docker.list

//step 4
apt-get update
apt-get install docker-engine 

//step 5
service docker start //启动docker服务即可

//step 6 开启远程api 端口
sudo gedit /lib/systemd/system/docker.service  
#在ExecStart 后面补上  -H unix:///var/run/docker.sock -H 0.0.0.0:2375

//step 7 刷新配置并重启
sudo systemctl daemon-reload 
sudo systemctl restart docker

有防火墙的自行开放2375端口

1.3安装jenkins

jenkins官方安装文档

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install jenkins

还有一个比较简单的办法,官方下载 war 包 官方下载页面
在这里插入图片描述
然后linux下执行 java -jar jenkins.war 即可。
访问 http://localhost:8080

2 项目结合Docker改造

POM.xml 增加,自行修改私服地址

<plugin>
   <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <!-- docker私服的地址 -->
        <dockerHost>http://192.168.93.135:2375</dockerHost>
        <!--镜像名称以及版本号-->
        <imageName>srv-gateway:${project.version}</imageName>
        <!--依赖的基础镜像-->
        <baseImage>java</baseImage>
        <!--Dockerfile的位置 -->
        <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
        <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

项目目录新建 src/main/docker 并新建文件 dockerfile,注意无后缀。编辑内容

# Pull base image 使用jdk8
FROM  java:8
#作者信息
MAINTAINER katasea "1126883892@qq.com"
#挂在tmp保持不变即可
VOLUME /tmp

# 添加,修改为自己的jar文件 后面是别名
ADD srv-gateway-Finchley.RELEASE.jar srv-gateway.jar
RUN bash -c 'touch /srv-gateway.jar'


# Define default command. 修改jar 别名即可
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/srv-gateway.jar"]
#ENV JAVA_OPTS=""
#ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

执行mvn package docker:build 或者图形界面操作如下:
在这里插入图片描述
在docker服务器上输入

sudo docker image ls

看看自己的jar是否上传了,如果上传就是成功了
在这里插入图片描述
执行自己的jar

sudo docker run -p 8004:8004 srv-gateway:Finchley.RELEASE 【jar名称:版本号自行修改】 

这个时候会看到控制台开始输出,然后会启动失败,因为我的项目配置文件是外移的。

本地配置文件外移到config文件夹,但是不知道如何将config文件夹一起上传docker【这里有知道如何处理的朋友请评论赐教。】,只能拷贝配置文件到项目的resource文件夹下面一起打包上传docker启动。

启动成功画面
在这里插入图片描述

3 Jenkins自动构建配置

3.1 配置项目

  • 新建项目
    在这里插入图片描述
  • 配置项目git/maven
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    maven jdk 等在系统设置那边自行配置。
    在这里插入图片描述
    编译后,就会看到成功。
    在这里插入图片描述
  • 配置邮件信息
    每次编译成功后都希望他可以发邮件通知我,这里要在系统设置里面配置邮箱信息和邮件模板。
    QQ邮箱需要开启smtp,第一次开启会直接生成密码,如果之前开过忘记密码,可以重新生成授权码。在配置的密码框需要输入授权码而非qq密码。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    输入邮件模板,网上搜索一下
    在这里插入图片描述
    附上邮件模板内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
    offset="0">
    <table width="95%" cellpadding="0" cellspacing="0"
        style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
        <tr>
            <td>(本邮件是程序自动下发的,请勿回复!)</td>
        </tr>
        <tr>
            <td><h2>
                    <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
                </h2></td>
        </tr>
        <tr>
            <td><br />
            <b><font color="#0B610B">构建信息</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>项目名称&nbsp;:&nbsp;${PROJECT_NAME}</li>
                    <li>构建编号&nbsp;:&nbsp;第${BUILD_NUMBER}次构建</li>
                    <li>SVN&nbsp;版本:&nbsp;${SVN_REVISION}</li>
                    <li>触发原因:&nbsp;${CAUSE}</li>
                    <li>构建日志:&nbsp;<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>构建&nbsp;&nbsp;Url&nbsp;:&nbsp;<a href="${BUILD_URL}">${BUILD_URL}</a></li>
                    <li>工作目录&nbsp;:&nbsp;<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                    <li>项目&nbsp;&nbsp;Url&nbsp;:&nbsp;<a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                </ul>
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">Changes Since Last
                        Successful Build:</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
                </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="&nbsp;&nbsp;&nbsp;&nbsp;%p"}
            </td>
        </tr>
        <tr>
            <td><b>Failed Test Results</b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td><pre
                    style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
                <br /></td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">构建日志 (最后 100行):</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <!-- <tr>
            <td>Test Logs (if test has ran): <a
                href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
                <br />
            <br />
            </td>
        </tr> -->
        <tr>
            <td><textarea cols="80" rows="30" readonly="readonly"
                    style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
            </td>
        </tr>
    </table>
</body>
</html>

项目设置发送邮件进入项目进行设置
邮件点下方高级设置
在这里插入图片描述
新增Recipient List 否则不会发送邮件
重新构建就会看到发出的邮件,如果遇到问题就百度jenkins 邮件 一大堆教程
在这里插入图片描述

这里只是简单的触发下载github代码,并自动编译,并不能做到自动部署。有两种方式可以实现自动部署:
1、在jenkins写脚本,来控制停止tomcat或者停止应用,然后重新拷贝编译后的包到具体位置,重启应用。
2、利用docker来部署重启应用。

第二种docker方式在 4Docker+Jenkins结合自动部署里实践。
下面尝试一下jenkins直接写脚本来重启应用:

在全局属性里面新增:BUILD_ID=DONTKILLME 这个键值

projectName="aio-service.jar"
#kill
ps -ef | grep -v 'grep' | grep 'aio-service.jar' | awk '{print $2}'| xargs kill -9

ps -ef|grep java

echo "start ${projectName}"

java  -jar $WORKSPACE/target/${projectName}  &

//后续补充

  • jenkins通过shell自动部署启动
  • 结合docker自动部署启动
  • gitlab / github 触发jenkins自动编译,自动部署,启动。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐