Jenkins最佳實踐

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/

 

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