最優雅的Docker+Jenkins pipeline部署Spring boot項目

使用Jenkins發佈項目已經4年多,作過屢次改進,儘可能減小Jenkins的配置和發佈腳本的書寫。從最初的構建一個自由風格的軟件項目流水線項目到如今的流水線+docker,流水線可讓項目發佈流程更加清晰,docker能夠大大減小Jenkins配置。java

下面帶你們使用最簡單,最快速的方式使用Jenkins,無需配置git、maven、jdk、node等環境,一切用docker搞定,只須要寫腳本,其餘無需配置node

此教程僅爲進階教程,具體的jenkins安裝,git憑據配置,郵件發送等須要自行查找教程進行配置。git

本教程使用的環境

  • centos7
  • docker-ce 18.09.1(務必使用docker-ce,老版本的docker會致使Jenkins中沒法使用docker daemon)

準備工做

安裝docker

yum install docker-ceweb

配置docker加速器(可選)

不少廠商都提供docker加速服務,好比阿里雲,騰訊雲 詳情請自行百度。不配置國內加速器,下載鏡像可能很緩慢。spring

使用docker安裝Jenkins

docker pull jenkins/jenkins,切勿docker pull jenkins已經廢棄docker

Jenkins docker hub地址centos

啓動Jenkins

docker run -u root -itd --name jenkins -p 6001:8080 -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -v /volume1/docker/jenkins:/var/jenkins_home jenkins/jenkins
複製代碼
啓動命令含義

-p 6001:8080Jenkins默認網頁訪問端口爲8080,將端口映射到外部主機api

-v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock使Jenkins內部可使用docker命令bash

-e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro配置Jenkins容器的時區服務器

-v /volume1/docker/jenkins:/var/jenkins_home 將Jenkins的配置映射到外部主機卷,容器刪除仍可保留配置

進入Jenkins容器內部,判斷docker命令是否正常執行

docker exec -it jenkins bash

docker info

可能須要安裝libltdl7,若是須要執行如下命令

apt-get update

apt-get install -y libltdl7

配置Jenkins

http://主機IP:6001可訪問Jenkins網頁端,其餘流程忽略,所有默認就能夠。

無需配置git、maven、jdk、node等環境,咱們使用docker解決

新建一個流水線項目

image

關於流水線腳本書寫,有兩種寫法,官方文檔

Using Docker with Pipeline,官方文檔

編寫腳本

image

分享我本身項目的發佈腳本,適用於spring boot項目,細節須要本身修改。此腳本須要使用Dockfile,參考下一節
import java.text.SimpleDateFormat
node {
    try {
        //名字這麼寫是爲了能夠發佈到騰訊docker倉庫,可隨意更改
        def dockerId='tengxun'
        def dockerUrl='ccr.ccs.tencentyun.com'
        def dockerNamespace='esms'
        def dockerName='esms-api'
        def env='test'
        
        def dateFormat = new SimpleDateFormat("yyyyMMddHHmm")
        def dockerTag = dateFormat.format(new Date())
        
        stage('git pull'){
            sh 'pwd'
            git credentialsId: '此處填寫git憑證,須要在Jenkins憑據中配置', url: '此處填寫git地址'
        }
        stage('mvn install') {
            sh 'pwd'
            docker.image('maven:3.6.0-jdk-8-alpine').inside('-v /volume1/docker/.m2:/root/.m2') {
                sh 'mvn --version'
                sh 'mvn clean install'
            }
        }
        stage('docker run') {
            dir("esms-main") {
                sh 'pwd'
                def imageUrl = "${dockerUrl}/${dockerNamespace}/${dockerName}:${dockerTag}"
                def customImage = docker.build(imageUrl)
                sh "docker rm -f ${dockerName} | true"
                //--network esms-net配置網絡信息,須要先docker network create esms-net,用於多個服務交互,可選
                customImage.run("-it -d --name ${dockerName} -p 8090:8090 --network esms-net -e SPRING_PROFILES_ACTIVE=${env}")
                //only retain last 3 images,自動刪除老的容器,只保留最近3個
                sh """docker rmi \$(docker images | grep ${dockerName} | sed -n '4,\$p' | awk '{print \$3}') || true"""
            }
        }
        currentBuild.result="SUCCESS"
    } catch (e) {
        currentBuild.result="FAILURE"
        throw e
    } finally {
        //此處若想發佈郵件,須要在系統管理-系統設置中配置郵件服務器
        mail to: 'xxxx@qq.com',subject: "Jenkins: ${currentBuild.fullDisplayName}${currentBuild.result}",body:"${currentBuild.result}"
    }
}
複製代碼
最終發佈之後docker images查看,名稱格式相似以下,如使用上面的代碼發佈後名稱爲

ccr.ccs.tencentyun.com/esms/esms-api

image

Sprint Boot項目結構以及Dockerfile

image

Dockerfile書寫,僅作參考,具體根據本身項目結構

FROM openjdk:8-jdk-alpine

MAINTAINER liunewshine@qq.com

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && mkdir -p /esms

WORKDIR /esms

EXPOSE 8090

ADD ./target/esms.jar ./

CMD java -Djava.security.egd=file:/dev/./urandom -jar esms.jar
複製代碼

發佈項目

直接構建便可,未作git的webhook,不能聯動git push等,有需求的能夠本身加上

image

總結

整體過程很簡單,主要就是安裝Jenkins->編寫pipeline腳本->編寫Dockerfile腳本。

相關文章
相關標籤/搜索