前言
本博文主要介紹了基於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
中配置好git
,maven
(注意:本地需要先安裝好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
,實現了項目開發的持續集成、持續部署,讓我們省去了構建、測試和部署的精力。同時,通過容器和微服務這對好基友的配合,讓我們的微服務項目更加輕量化及可移植化,令開發的我們能夠更專注於業務功能和性能優化上。