Jenkins结合Docker部署践行记录
背景:已经用spring cloud编写了一个项目,设想通过提交代码到github或者自己构建的gitlab来触发jenkins服务器自动构建并通过docker自动部署到服务器上。1 软件安装部署1.1 安装虚拟机用于模拟jenkins 和 docker采用kali linux ,具体安装方法百度。安装完成后如下界面1.2 在虚拟linux上安装Dockercd /etc/ap...
背景:已经用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
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>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>SVN 版本: ${SVN_REVISION}</li>
<li>触发原因: ${CAUSE}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <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=" %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自动编译,自动部署,启动。
更多推荐
所有评论(0)