Jenkins結合Docker部署踐行記錄

背景:已經用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 "[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>項目名稱&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自動編譯,自動部署,啓動。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章