天天看點

Jenkins+Docker+git+Springboot 持續內建自動化部署

1、前述

1、在平時開發過程中,我們經常需要部署測試環境、生産環境、開發環境等等各種環境,作者所知的部署方法是如下方法

1)本地打包 war/jar,将包上傳,放到 Tomcat 啟動,或者用原始指令啟動

2)本地打包,伺服器跑腳本來啟動項目

3)伺服器安裝 git,進行 git 認證,在通過腳本在伺服器 git 拉代碼打包部署

2、架構流程圖

Jenkins+Docker+git+Springboot 持續內建自動化部署

3、環境搭建

相信看了上面的流程圖以後,大家心裡對本篇文章已經有一個基本的認識了,接下來就開始實際的環境搭建,将該呈現的每一步都呈現出來

3.1 Jenkins 必要插件:

git、github、publish over ssh

3.2 Jenkins 配置 Publish over ssh:

1)系統管理 -> 系統配置->Publish over ssh

2) 如下圖所示配置:

這裡主要是配置 Jenkins ssh key 來登入伺服器,然後通過 ssh 的方式發送的遠端主機,以達到遠端部署的目的,一般有密碼和密鑰兩種方式配置,本文使用密鑰的方式來配置

Jenkins+Docker+git+Springboot 持續內建自動化部署

Passphrase

:私鑰 key 的密碼,如果密鑰使用了密碼加密,則在此處進行設定。

Path to key

:Jenkins master上要使用的私有 SSH密鑰 的位置,路徑可以是密鑰的絕對路徑,也可以是相對于JENKINS_HOME目錄的路徑。(可忽略)

Key

:将伺服器上的私鑰粘貼到這裡,密鑰應包括頁眉和頁腳(----)以及介于兩者之間的所有内容。

3)ssh server 配置

SSH Server Name

:表示這個 ssh 的名字,自定義

Hostname

:需要連接配接ssh的主機名或ip位址,此處填寫應用伺服器IP,本文中,Jenkins 伺服器跟應用伺服器一台機,是以是 127.0.0.1

Username

:伺服器 ssh 登入的使用者名

Remote Directory

:遠端部署目錄,Jenkins 會将包傳到這個目錄下

點選 Test Configuration,出現 success 就表示成功了,如果是 auth fail ,就要注意密鑰是否正确以及配對成功。

可以添加多個 ssh server,發送給多個應用伺服器進行部署,jenkins 配置 ssh 伺服器的時候,需要在伺服器生成密鑰對,私鑰複制到 key 值裡,然後将公鑰複制到 authorized_keys 檔案裡面去,才可以連接配接遠端主機成功

至此 Publish over ssh 插件的配置就配置完了

3.3 Jenkins 伺服器安裝配置 git

Jenkins+Docker+git+Springboot 持續內建自動化部署

配置 git 并且測試

Jenkins+Docker+git+Springboot 持續內建自動化部署

如果倉庫是私有的,則需要認證添加 git ssh key

參考:git 安裝配置

3.4 Jenkins 伺服器安裝 maven 或者在 Jenkins 管理頁面上安裝 maven 插件,用來打包代碼,将 maven 的setting.xml 裡的鏡像倉庫換成阿裡雲的,速度會快些

四、建立 Jenkins 任務并配置

4.1 建立一個自由風格的軟體項目

Jenkins+Docker+git+Springboot 持續內建自動化部署

4.2

Jenkins+Docker+git+Springboot 持續內建自動化部署

4.3

Jenkins+Docker+git+Springboot 持續內建自動化部署

4.4

Jenkins+Docker+git+Springboot 持續內建自動化部署

4.5

Jenkins+Docker+git+Springboot 持續內建自動化部署
  1. 建構後操作這裡選擇

    Send build artifacts over SSH

    2)

    SSH Server

    就是前面

    Publish over ssh

    配置的

    SSH server

    ,由于現在都是負載均衡或者叢集方式部署生産環境,是以在這裡可以配置多個遠端主機部署,

    Name

    :Publish over ssh 自定義設定的 name

    Source files

    : jenkins 工作空間下目前任務檔案目錄的相對路徑源檔案,這裡為 var/lib/jenkins/workspace/faith-jenkins,那麼這裡的 Source files 就是填 target/faith-jenkins.jar

    Remove prefix

    :需要移除的檔案字首,如果指定了此選項,則源檔案中所選的所有檔案都必須以該路徑字首開始,如果選擇要傳輸的檔案且該檔案不低于Remove字首,則釋出将失敗。其實也就是将工作任務目錄下的源檔案目錄移除掉,這樣傳輸的時候就不需要在遠端主機建立目錄,直接将 jar/war 傳輸到目錄下

    Remote directory:如果指定,檔案将在此目錄下傳輸(相對于 Publish over ssh 配置中指定的遠端目錄)。如果目錄不存在,将建立它,本文為 /faith_jenkins/tmp

    Exec command:

    如果這個配置框中有任何内容,那麼它将在遠端伺服器上執行。如果配置了源檔案,那麼将在執行Exec指令之前傳輸這些檔案。如果指令的退出狀态不為零,則釋出将失敗。指令執行中的STDOUT和STDERR記錄在Jenkins控制台中。

    例如下所示:這次釋出中,Exec command 的 exit status not zero,說明這次 Jenkins 建構失敗

    Jenkins+Docker+git+Springboot 持續內建自動化部署
    Exec command:
    cp /faith_jenkins/tmp/faith-jenkins.jar /data/workspace/faith-jenkins
    cd /data/workspace/faith-jenkins
    ./dockerBuild.sh
    ./dockerRun.sh
               
    參考:Publish over ssh plugin

4.6 上述提供的一些檔案或者檔案夾是需要提前建立好的

1)

/data/workspace/faith-jenkins

2)

dockerBuild.sh

:遠端主機用來建構 docker 鏡像的腳本

3)

dockerRun.sh

:遠端主機用來啟動 docker 容器的腳本

其中 dockerBuild.sh 内容為:

docker build -t faith-jenkins .
docker image prune -f 
           

dockerRun.sh 内容為:

docker rm -f faith-jenkins
docker run --name="faith-jenkins" -p 8010:8010 -d faith-jenkins
           

4)

docker build -t faith-jenkins .

的意思就是在遠端主機的目錄下建構一個 docker 鏡像,docker build 會加載目前目前上下文的 Dockerfile 檔案,根據這個 Dockerfile 來建立一個檔案,具體指令參考:docker 文檔

5)Dockerfile:

FROM java:8
ADD faith-jenkins.jar /usr/local/jar/
# 修正 docker 容器裡面的時間
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
#聲明暴漏端口,這裡一般不強制,因為我們通常用 docker -p port:port 來映射端口,以達到通路容器内部的目的
EXPOSE 8010
CMD ["java","-jar","/usr/local/jar/faith-jenkins.jar"]
           

這裡要注意的兩點是:

1)當我們的項目用到了資料庫(mysql、redis)的時候,我們要注意容器内部能否通路到 db,docker 與主控端有四種網絡模式,當網絡沒有共享的時候,docker 容器内部是無法用 localhost 這樣的方式來連接配接資料庫的,同時也要注意資料庫是否 public 以及 ip 、port 是否允許

2) 一般來說,如果我們的項目有産生檔案的時候,需要用 docker -v 來将内部的檔案資料卷挂載到我們的主控端目錄,docker 容器關閉以後,内部資料是無法持久化的

docker -v 主控端目錄:容器目錄
           

說明:本文示範一個大概的流程,是以這裡直接采用 java -jar 的方式來啟動 jar 包,一般來說,我們會将 jar 包放進 web 容器來啟動項目

至此我們 jenkins 的一個任務就是配置完了,接下來就是應用伺服器安裝 docker

五、安裝 docker

根據不通的 linux 核心版本安裝 docker,這裡就不多做闡述了

六、jenkins 建構項目

1)點選立即建構,本文采用的是手動建構,在任務配置裡,可以選擇定時建構等多種建構方式

Jenkins+Docker+git+Springboot 持續內建自動化部署

2)建構成功

點選 build history 剛才的建構,點選控制台輸出,就可以看到如下成功的資訊

Jenkins+Docker+git+Springboot 持續內建自動化部署

3)伺服器執行指令

docker logs -f -t 100 容器 id

就可以看到項目的實時日志

Jenkins+Docker+git+Springboot 持續內建自動化部署

注意事項:

1)出現下圖所示的錯誤時,可能是由于容器已經在跑了,沒有被删除,是以導緻無法啟動新的容器,

Jenkins+Docker+git+Springboot 持續內建自動化部署

2)當在執行 dockerRun.sh 腳本這一步的時候,如果報錯無法找到容器删除,可以去腳本裡把删除容器的這個操作先去掉,重新 jenkins 建構一次 ,等跑起來以後,再加進去删除容器的那條指令,之後再次啟動就不會報錯了,這裡有更好的解決辦法,本文不做闡述

3) 建構的時候,可能有時候網絡原因、遠端主機太多等等原因導緻 build 逾時,可以在任務配置裡,将 ssh server 的 exec timeout 設定稍微大點,如下所示,點選進階,進行設定

Jenkins+Docker+git+Springboot 持續內建自動化部署

七、配置多台應用伺服器,滿足負載均衡

7.1 增加 ssh server

重複第三大點 3.2 的操作

Jenkins+Docker+git+Springboot 持續內建自動化部署

7.2 填寫遠端主機 ip,并且将 Jenkins 伺服器的 公鑰複制妨到遠端主機 authorized_keys 檔案裡,然後再遠端主機建立 Remote Directory 目錄,Test 成功即可

Jenkins+Docker+git+Springboot 持續內建自動化部署

7.3 将 dockerBuild.sh、dockerRun.sh、Dockerfile 三個檔案複制到,賦予腳本執行權限

7.4 遠端主機安裝 docker

7.5 在任務裡增加一個 ssh server,下圖的 faith_jenkins_ssh_02 就是 7.1 步驟中新增的遠端主機

Jenkins+Docker+git+Springboot 持續內建自動化部署

7.5 儲存退出,重新建構就會發現在第二台遠端主機的目錄下有了一個 jar 包

Jenkins+Docker+git+Springboot 持續內建自動化部署

在 data/workspace/faith-jenkins 目錄下也會有這個 jar 包

7.6 docker 指令檢視啟動日志,可以看到啟動成功

Jenkins+Docker+git+Springboot 持續內建自動化部署

7.7 頁面通路效果

Jenkins+Docker+git+Springboot 持續內建自動化部署

當兩台伺服器的項目都起來以後,可以通過設定 nginx 轉發請求,分流、減少單機壓力等等

八、總結

通過本文,大概了解了Jenkins+docker+git 持續釋出以及自動化部署的大概流程,當然還有其他很多更加優秀的方法和技術,值得作者去學習,文中若有不了解或者錯誤的地方,還望不吝賜教。

繼續閱讀