背景:已經用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 "[email protected]"
#掛在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自動編譯,自動部署,啓動。