1 利用jenkins的並行構建
如果服務器有多個CPU或多個核,則可以使用jenkins的並行構建提高構建效率,需要使用比較新的Declarative Pipeline語法,它的結構是這樣的:
pipeline { agent 'dev' stages { stage('Non-Parallel Stage') { steps { echo 'This stage will be executed first.' } } stage('Parallel Stage') { parallel { stage('Branch A') { steps { echo "On Branch A" } } stage('Branch B') { steps { echo "On Branch B" } } } } } }
這裏的Branch A和Branch B執行的時候會並行執行
2 gradle的並行構建
另外一種並行構建方法是利用gradle的並行構建功能,只要在properties文件中配置org.gradle.parallel=true即可開啓。如果項目中有多個互不依賴的子項目,則構建的時候,這些子項目會同時進行構建。
3 簡化gradle構建步驟
使用gradle構建微服務系統時,通常會用到application插件,但是這個插件中的步驟並不是全都用到,比如打包過程等,可以在腳本中將這些步驟排除掉:
startScripts.enabled = false test.enabled = false bootDistTar.enabled = false bootDistZip.enabled = false distTar.enabled = false distZip.enabled = false
4 使用自定義的基礎鏡像
構建java應用的docker鏡像時,我們使用openjdk:8u171-alpine做基礎鏡像。但是這個基礎鏡像的時區並不是東八區,我們需要在Dockerfile中添加以下兩行:
COPY localtime /etc/localtime RUN echo 'Asia/Shanghai' > /etc/timezone
微服務系統中通常會構建多個docker鏡像,每個Dockerfile都加這兩行有些重複。
我們使用openjdk:8u171-alpine構建了一個自定義的基礎鏡像,然後其它的應用再基於這個自定義的基礎鏡像進一步構建鏡像,解決了配置重複的問題。
5 使用docker-compose簡化腳本
構建鏡像以及啓動docker的時候,通常會傳很多參數,例如docker的IP和端口、docker的名字、docker所在網絡、掛載卷等,每個應用的參數都不一樣,
如果把這些構建參數全都寫在jenkins的pipeline腳本中,會讓腳本變得很繁瑣。
使用docker-compose可以將所有的構建參數全都寫在一個yml格式的配置文件中,構建鏡像和啓動docker的時候,只要引用這個配置文件即可。
這裏有一個配置示例:
portal: image: $DOCKER_REGISTRY/portal container_name: portal networks: mynetwork: ipv4_address: 172.18.1.100 ports: - "8180:80" environment: API_URL: $API_URL
這個示例可以啓動一個名叫portal的docker,它所基於的鏡像是$DOCKER_REGISTRY/portal,運行的docker名字叫portal,使用網絡名叫mynetwork,docker的IP是172.18.1.100,端口映射是80映射到8180,系統的環境變量API_URL傳遞到了docker內部的環境變量。
6 通過環境變量腳本區分構建環境
系統編譯、部署所用到的環境有多套,有內網的測試服務器環境,還有公網的阿里雲服務器環境,在不同服務器上構建所傳的參數是不一樣的。
我們根據環境名稱創建了幾個不同的環境變量文件ci.env、test.env等,構建之前先執行這些env文件激活環境變量。
文件示例如下:
export DOCKER_REGISTRY=registry.cn-shanghai.aliyuncs.com export SPRING_PROFILES_ACTIVE=ci export NGINX_PORT=1443 export API_URL=https://192.168.1.200:$NGINX_PORT
其中,DOCKER_REGISTRY是阿里雲鏡像服務器的url,辦公室內網訪問的阿里雲鏡像服務器url和阿里雲服務器直接訪問鏡像服務器url是不一樣的,所以這裏針對url進行了區分;
SPRING_PROFILES_ACTIVE是springboot所使用的profiles配置;
NGINX_PORT是nginx的端口,辦公室內網服務器通常會起多套系統,因此每個系統的nginx端口都不一樣,而阿里雲上每臺服務器只跑一個系統,爲了方便,端口都使用443端口;
API_URL則是用戶訪問web的使用所需要請求的url。
7 Declarative Pipeline腳本的其它功能
在jenkins中創建參數化的任務時,如果參數很多,需要一個一個手動配,非常繁瑣。
Declarative Pipeline腳本增加了parameters和triggers,可以把參數及觸發條件直接配置在腳本中,這樣就不需要在任務界面手動配置參數和觸發條件了。
parameters { choice(name: 'node', description: '運行結點', choices: ['dev', 'test01', 'test02', 'test03', 'ci']) choice(name: 'profile', description: 'profile', choices: ['ci', 'test']) choice(name: 'installModules', description: '編譯portal的時候是否完整安裝modules', choices: ['false', 'true']) } triggers { cron('H 0 * * *') }
參考資料:
https://testerhome.com/topics/10033
https://jenkins.io/doc/book/pipeline/syntax/