基於Jenkins+Docker+Github實現SpringCloud自動化部署

前言

本博文主要介紹了基於Jenkins+Docker+Github實現了對SpringCloud微服務項目的快速打包、部署。

正文

項目準備

首先有如下SpringCloud項目(這裏以本人的畢設項目舉例),目錄結構如下:

在這裏插入圖片描述

bishe_base中的每個module代表一個服務,其中client爲後綴的代表的是客戶端,其用來暴露server服務中提供的服務接口,給外部的服務使用。

爲了讓項目最終打的jar能夠在服務器正常啓動,需要在pom.xml中添加一個maven插件,如下

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

同時,爲了方便我們docker鏡像的生成,可在打包同時生成鏡像,添加如下插件

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.3.6</version>
    <configuration>
        <repository>${project.artifactId}</repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>

而在每個server服務(即需要啓動的項目)的根目錄下,需要各添加一個Dockerfile

hpsyche-gateway-server服務(端口8750)下有此Dockerfile

FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8750
ENTRYPOINT ["java","-jar","/app.jar"]

其中的ARG參數JAR_FILE即在pom.xml中傳入的buildArgs:JAR_FILE。

我們給每個server服務都添加上述代碼。

最後,需要將項目上傳到代碼倉庫中,這是使用的是個人github的私有倉庫。

Jenkins準備

安裝好Jenkins,網上教程很多,這裏不多贅述,需要注意的是Jenkins默認插件的安裝由於某些原因可能會很慢,需要我們將站點改爲國內的鏡像。

在插件管理處,將站點url改爲:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

在上面的站點修改後,我發現還是很慢,後面經過一番折騰,才得以解決。具體如下:

cd 到Jenkins下的updates目錄(linux默認在/root/.jenkins下),找到default.json文件,使用vim編輯器,替換所有插件的url

:1,$s/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g

替換連接測試url

:1,$s/http:\/\/www.google.com/https:\/\/www.baidu.com/g

進入vim先輸入:然後再粘貼上邊的:後邊的命令,注意不要寫兩個冒號!修改完成保存退出:wq

在安裝好Jenkins的插件後,需要在頁面的configureTools中配置好gitmaven(注意:本地需要先安裝好git和maven,並在Jenkisn的configureTools引用其路徑)。

在這裏插入圖片描述

Jenkins配置

在完成以上準備步驟後,開始我們真正的配置。

首先新建item,選擇流水線項目(方便groovy腳本的編寫),填寫項目名,進入下一步。

在這裏插入圖片描述

在流水線中寫入如下腳本

pipeline {
   agent any

   stages {
      stage('pull code') {
         steps {
            xxxxxxxx
         }
      }
      stage('build project') {
         steps {
            sh 'mvn -f hpsyche-auth/hpsyche-auth-server clean package dockerfile:build'
            sh 'mvn -f hpsyche-gateway/hpsyche-gateway-server clean package dockerfile:build'
        }
      }
      stage('start consul') {
         steps {
            sh 'docker run -p 8500:8500 -di consul'
         }
      }
      stage('start dockers') {
         steps {
            sh 'docker run -p 8762:8762 -di hpsyche-auth-server'
            sh 'docker run -p 8750:8750 -di hpsyche-gateway-server'
         }
      }
   }
}

其中pull code中的xxxxxxxx,需要替換成自己的git及credentialsId信息,具體如下操作

選擇“流水線語法”

在這裏插入圖片描述

在片段生成器中,填入自己的git url和賬密信息,點擊“生成流水線腳本”,即可生成腳本語句,將其複製替換以上的xxxxxx即可。

對腳本的具體解釋:
stage('pull code'):從源碼倉庫拉取代碼
stage('build project'):進入目錄打包生成jar包,並使用dockerfile生成鏡像(這裏我只拿了auth和gateway服務做實例
stage('start consul'):啓動consul服務
stage('start dockers'):運行docker鏡像,並映射成服務端口

注意:如果你的docker鏡像已經啓動了,在’start dockers’可能會重複啓動多個容器,此時在此步驟前可以價格stage用來stop和rm運行中的容器。

最後,點擊build now構建,就可以等待docker鏡像的生成並啓動啦。

當然,這樣的構建是一次性的,如果你想定時或者穩定構建的話,可以添加構建觸發器,如下:

在這裏插入圖片描述

解釋如下:

build after other projects are built:當本job依賴的job被build時,執行本job
Build periodically:定時執行構建任務,不管遠程代碼分支上的代碼是否發生變化,都執行一次構建。(類似cron,有相應的語法規則)
github hook trigger for GITScm polling:此方式需要配置github上項目的setting,實現push時出發
poll scm:設置定時檢查代碼倉庫是否有變更,有變更則構建(語法同Build periodically)
觸發遠程構建:拼接url後寫入代碼中可以實現在腳本或者工具執行構建(即訪問:JENKINS_URL/job/mooc_base/build?token=TOKEN_NAME就可以實現構建 )

延伸

前端項目

當然,對於我們前端的Vue項目,也可以實現基於Jenkins的自動化構建,通過配合nginx作爲靜態服務器+Docker製作項目的鏡像來使用。

具體可見:https://segmentfault.com/a/1190000020868116?utm_source=tag-newest

鏡像倉庫

由於我最終項目運行的服務器和利用Jenkins打包部署是在同一個機器上進行的,所以在build project之後直接啓動鏡像就可以了,較爲簡單,但如果要將鏡像推送到其他服務器上運行,此時就需要使用到鏡像倉庫了。
可以使用Docker官方提供的docker hub,將images推送到自己的私有倉庫上,然後在Jenkins通過ssh遠程服務器,拉取images並啓動運行。

注意:以上步驟均可在Jenkins中自動化實現。

總結

以上部署過程其實比較簡單,但由於關於CI的東西自己較少實踐,還是耗費了不少精力。

通過Jenkins,實現了項目開發的持續集成、持續部署,讓我們省去了構建、測試和部署的精力。同時,通過容器和微服務這對好基友的配合,讓我們的微服務項目更加輕量化及可移植化,令開發的我們能夠更專注於業務功能和性能優化上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章