1. 程式人生 > >基於Jenkins Pipeline自動化部署

基於Jenkins Pipeline自動化部署

微信公眾號「後端進階」,專注後端技術分享:Java、Golang、WEB框架、分散式中介軟體、服務治理等等。 老司機傾囊相授,帶你一路進階,來不及解釋了快上車!

最近在公司推行Docker Swarm叢集的過程中,需要用到Jenkins來做自動化部署,Jenkins實現自動化部署有很多種方案,可以直接在jenkins頁面寫Job,把一些操作和指令碼都通過頁面設定,也可以在每個專案中直接寫Pipeline指令碼,但像我那麼優秀,那麼追求極致的程式設計師來說,這些方案都打動不了我那顆騷動的心,下面我會跟你們講講我是如何通過Pipeline指令碼實現自動化部署方案的,並且實現多分支構建,還實現了所有專案共享一個Pipeline指令碼。

使用Jenkins前的一些設定

為了快速搭建Jenkins,我這裡使用Docker安裝執行Jenkins:

$ sudo docker run -it -d \
  --rm \
  -u root \
  -p 8080:8080 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v "$HOME":/home \
  --name jenkins jenkinsci/blueocean

初次使用jenkins,進入Jenkins頁面前,需要密碼驗證,我們需要進入docker容器檢視密碼:

$ sudo docker exec -it jenkins /bin/bash
$ vi /var/jenkins_home/secrets/initialAdminPassword

Docker安裝的Jenkins稍微有那麼一點缺陷,shell版本跟CenOS宿主機的版本不相容,這時我們需要進入Jenkins容器手動設定shell:

$ sudo docker exec -it jenkins /bin/bash
$ ln -sf /bin/bash /bin/sh

由於我們的Pipeline還需要在遠端伺服器執行任務,需要通過ssh連線,那麼我們就需要在Jenkins裡面生成ssh的公鑰金鑰:

$ sudo docker exec -it jenkins /bin/bash
$ ssh-keygen -C "root@jenkins"

在遠端節點的~/.ssh/authorized_keys中新增jenkins的公鑰(id_rsa.pub)

還需要安裝一些必要的外掛:

  1. Pipeline Maven Integration
  2. SSH Pipeline Steps

安裝完外掛後,還需要去全域性工具那裡新增maven:

maven

這裡後面Jenkinsfile有用到。

mutiBranch多分支構建

由於我們的開發是基於多分支開發,每個開發環境都對應有一條分支,所以普通的Pipeline自動化構建並不能滿足現有的開發部署需求,所以我們需要使用Jenkins的mutiBranch Pipeline。

首先當然是新建一個mutiBranch多分支構建job:

maven

接著設定分支源,分支源就是你專案的git地址,選擇Jenkinsfile在專案的路徑

maven

接下來Jenkins會在分支源中掃描每個分支下的Jenkinsfile,如果該分支下有Jenkinsfile,那麼就會建立一個分支Job

maven

該job下的分支job如下:

maven

這裡需要注意的是,只有需要部署的分支,才加上Jenkinsfile,不然Jenkins會將其餘分支也建立一個分支job。

通用化Pipeline指令碼

到這裡之前,基本就可以基於Pipeline指令碼自動化部署了,但如果你是一個追求極致,不甘於平庸的程式設計師,你一定會想,隨著專案的增多,Pipeline指令碼不斷增多,這會造成越來越大的維護成本,隨著業務的增長,難免會在指令碼中修改東西,這就會牽扯太多Pipeline指令碼了,而且這些指令碼基本都相同,那麼對於我這麼優秀的程式設計師,怎麼會想不到這個問題呢,我第一時間就想到通用化pipeline指令碼。所幸,Jenkins已經看出了我不斷騷動的心了,Jenkins甩手就給我一個Shared Libraries。

Shared Libraries是什麼呢?顧名思義,它就是一個共享庫,它的主要作用是用於將通用的Pipeline指令碼放在一個地方,其它專案可以從它那裡獲取到一個全域性通用化的Pipeline指令碼,專案之間通過不通的變數引數傳遞,達到通用化的目的。

接下來我們先建立一個用於儲存通用Pipeline指令碼的git倉庫:

maven

倉庫目錄不是隨便亂添加了,Jenkins有一個嚴格的規範,下面是官方說明:

maven

官方已經講得很清楚了,大概意思就是vars目錄用於儲存通用Pipeline指令碼,resources用於儲存非Groovy檔案。所以我這裡就把Pipeline需要的構建指令碼以及編排檔案都集中放在這裡,完全對業務工程師隱蔽,這樣做的目的就是為了避免業務工程師不懂瞎幾把亂改,導致出bug。

建立完git倉庫後,我們還需要在jenkins的Manage Jenkins » Configure System » Global Pipeline Libraries中定義全域性庫:

maven

這裡的name,可以在jenkinsfile中通過以下命令引用:

@Library 'objcoding-pipeline-library'

下面我們來看通用Pipeline指令碼的編寫規則:

#!groovy

def getServer() {
    def remote = [:]
    remote.name = 'manager node'
    remote.user = 'dev'
    remote.host = "${REMOTE_HOST}"
    remote.port = 22
    remote.identityFile = '/root/.ssh/id_rsa'
    remote.allowAnyHosts = true
    return remote
}

def call(Map map) {

    pipeline {
        agent any

        environment {
            REMOTE_HOST = "${map.REMOTE_HOST}"
            REPO_URL = "${map.REPO_URL}"
            BRANCH_NAME = "${map.BRANCH_NAME}"
            STACK_NAME = "${map.STACK_NAME}"
            COMPOSE_FILE_NAME = "docker-compose-" + "${map.STACK_NAME}" + "-" + "${map.BRANCH_NAME}" + ".yml"
        }

        stages {
            stage('獲取程式碼') {
                steps {
                    git([url: "${REPO_URL}", branch: "${BRANCH_NAME}"])
                }
            }

            stage('編譯程式碼') {
                steps {
                    withMaven(maven: 'maven 3.6') {
                        sh "mvn -U -am clean package -DskipTests"
                    }
                }
            }

            stage('構建映象') {
                steps {
                    sh "wget -O build.sh https://git.x-vipay.com/docker/jenkins-pipeline-library/raw/master/resources/shell/build.sh"
                    sh "sh build.sh ${BRANCH_NAME} "
                }
            }

            stage('init-server') {
                steps {
                    script {
                        server = getServer()
                    }
                }
            }

            stage('執行發版') {
                steps {
                    writeFile file: 'deploy.sh', text: "wget -O ${COMPOSE_FILE_NAME} " +
                        " https://git.x-vipay.com/docker/jenkins-pipeline-library/raw/master/resources/docker-compose/${COMPOSE_FILE_NAME} \n" +
                        "sudo docker stack deploy -c ${COMPOSE_FILE_NAME} ${STACK_NAME}"
                    sshScript remote: server, script: "deploy.sh"
                }
            }
        }
    }
}
  1. 由於我們需要在遠端伺服器執行任務,所以定義一個遠端伺服器的資訊其中remote.identityFile就是我們上面在容器生成的金鑰的地址;
  2. 定義一個call()方法,這個方法用於在各個專案的Jenkinsfile中呼叫,注意一定得叫call;
  3. 在call()方法中定義一個pipeline;
  4. environment引數即是可變通用引數,通過傳遞引數Map來給定值,該Map是從各個專案中定義的傳參;
  5. 接下來就是一頓步驟操作啦,“編譯程式碼”這步驟需要填寫上面我們在全域性工具類設定的maven,“構建映象”的構建指令碼巧妙地利用wget從本遠端倉庫中拉取下來,”執行發版“的編排檔案也是這麼做,“init-server”步驟主要是初始化一個server物件,供“執行發版使用”。

從指令碼看出來Jenkins將來要推崇的一種思維:配置即程式碼。

寫完通用Pipeline指令碼後,接下來我們就需要在各個專案的需要自動化部署的分支的根目錄下新建一個Jenkinsfile指令碼了:

maven

接下來我來解釋一下Jenkinsfile內容:

#!groovy

// 在多分支構建下,嚴格規定Jenkinsfile只存在可以發版的分支上

// 引用在jenkins已經全域性定義好的library
library 'objcoding-pipeline-library'
def map = [:]

// 遠端管理節點地址(用於執行發版)
map.put('REMOTE_HOST','xxx.xx.xx.xxx')
// 專案gitlab程式碼地址
map.put('REPO_URL','https://github.com/objcoding/docker-jenkins-pipeline-sample.git')
// 分支名稱
map.put('BRANCH_NAME','master')
// 服務棧名稱
map.put('STACK_NAME','vipay')

// 呼叫library中var目錄下的build.groovy指令碼
build(map)
  1. 通過library 'objcoding-pipeline-library'引用我們在Jenkins定義的全域性庫,定義一個map引數;
  2. 接下來就是將專案具體的引數儲存到map中,呼叫build()方法傳遞給通用Pipeline指令碼。

Shared Libraries共享庫極大地提升了Pipeline指令碼的通用性,避免了指令碼過多帶來的問題,也符合了一個優秀程式設計師的審美觀,如果你是一個有追求的程式設計師,你一定會愛上它。

流程圖:

maven

公眾號「後端進階」,專注後   
 
 </div> 
 <div class=

相關推薦

基於Jenkins Pipeline自動化部署

微信公眾號「後端進階」,專注後端技術分享:Java、Golang、WEB框架、分散式中介軟體、服務治理等等。 老司機傾囊相授,帶

基於 Jenkins Pipeline 自動化部署

最近在公司推行Docker Swarm叢集的過程中,需要用到Jenkins來做自動化部署,Jenkins實現自動化部署有很多種方案,可以直接在jenkins頁面寫Job,把一些操作和指令碼都通過頁面設定,也可以在每個專案中直接寫Pipeline指令碼,但像我那麼優秀,那麼追求極致的程式設計師來說,這些方案都打

基於【SpringBoot】的微服務【Jenkins自動化部署

基於【SpringBoot】的微服務【Jenkins】自動化部署   一、關於自動化部署   關於自動化部署的優點,我就不在這裡贅述了;只要想想手工打包、上傳、部署、重啟的種種,就會有很多場景歷歷在目,相信經歷過的朋友都能體會其中的酸甜苦辣; 而一旦到了大型專案,比如所微服務化之後的

jenkins中配置基於docker的自動化部署

1、新建一個任務2、構建一個自由風格的軟體專案3、配置Github,包括github地址,使用者名稱和密碼,分支4、配置構建環境增加構建步驟 -> invoker top-level-Maven targetsMaven version: maven3.5.0Goals

基於gitlab和jenkins自動化部署例項

gitlab+jenkins服務簡述: GitLab是一個程式碼倉庫,用來管理程式碼。Jenkins是一個自動化伺服器,可以執行各種自動化構建、測試或部署任務。 所以這兩者結合起來,就可以實現開發者提交程式碼到GitLab,Jenkins以一定頻率自動執行

搭建jenkins實現自動化部署

ubunt 關閉 kcon 部署 epo java gpo add perm 1、安裝Jenkins Install Jenkins On Ubuntu wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.ke

Jenkins pipeline自動化構建審批功能

docker 思路 執行 目的 支持 擴展 dsl ges 提醒 Jenkins Pipeline是一套插件,支持將連續輸送Pipeline實施和整合到Jenkins。Pipeline提供了一組可擴展的工具,用於通過PipelineDSL為代碼創建簡單到復雜的

使用jenkins實現自動化部署的案例記錄:tomcat+svn+maven+ssh+jenkins

使用jenkins實現自動化部署的案例記錄:tomcat+svn+maven+ssh+jenkins 1.全域性配置,配置專案對應的tomcat伺服器的ssh登入地址,埠,密碼,路徑(寫/即可) 2.2-系統maven配置 3.構建一個maven風格的專案,選擇jdk版本

Maven、Jenkins實現自動化部署

工程例項程式碼:https://github.com/chocolateBlack/multi_env_folder_maven 利用Maven、Jenkins實現專案自動化部署,能夠按照bin、conf、lib檔案進行打包,並能夠通過Jenkins按照環境一鍵發不到伺服器上 首先通過Maven外掛

在Centos7搭建jenkins實現自動化部署springboot專案

在Centos7搭建jenkins實現自動化部署springboot專案 安裝前要把基本的環境裝好 1.jdk安裝 關於centos上的java    Jenkins不支援在centos的預設的jdk上工作。所以要刪除自己裝 查詢jdk命令 rpm -qa | grep jdk 或者 rpm

效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(Docker篇)

文章目錄 前言 關於Docker 整體設計 新建Jenkins Job 配置Job Post Steps 新建buildimage指令碼 建立Dockerfile 部署專

效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(實戰篇)

文章目錄 前言 整體設計 先決條件 Step 1:安裝sun jdk1.8環境 Step 2:安裝Maven 3.5 Step 3:安裝Jenkins Step 4:安裝Jenkins外掛 Step

k8s+Jenkins+GitLab-自動化部署asp.net core專案

0、目錄 整體架構目錄:ASP.NET Core分散式專案實戰-目錄 k8s架構目錄:Kubernetes(k8s)叢集部署(k8s企業級Docker容器叢集管理)系列目錄 此文閱讀目錄: 1、閒聊 2、部署流程介紹 3、部署Harbor倉庫 4、jenkins-slav

Jenkins+Docker自動化部署Spring boot專案 (二)搭建docker私庫Harbor

前言 docker映象的push、pull都需要映象庫。現在不少大廠提供免費的映象庫,如docker hub,163 hub,也可以自己搭建一個私有映象庫。我用了vmware公司開源的harbor作為docker私有庫,相比docker官方提供的私有庫regi

Jenkins+docker自動化部署管理springBoot專案

* 伺服器環境支援 Jenkins服務+Git+Maven+Docker1.開啟jenkins構建一個maven專案,名字取為maven-test2.填寫jenkins配置3.立即構建    到此jenkins構建成功 我們可以拿到專案構建的最新jar包(/root/.jen

jenkins&docker自動化部署maven專案

jenkins和docker實現自動化構建部署一、應用場景開發人員開發應用,開發後需要提交svn,然後從svn拉取程式碼,進行構建,釋出到伺服器上,然後看呈現效果,這樣的工作是頻繁反覆的在進行的,浪費了大量時間,現在我們把這些工作自動化,只需要開發人員更新程式碼到svn,然後

58趕集基於 Docker 的自動化部署實踐_Kubernetes中文社群

58趕集運維開發高階工程師史祥陽 專案背景 58現有的部署系統只管理線上環境,在資源和環境兩個維度,分別存在以下問題: 在這個現狀下,我們提出了『基於 docker 的自動化部署』專案,在不破壞現有專案管理流程的基礎上,實現接管所有環境的部署,提高生產效率。 自動打包 引入 dock

基於jenkins自動化單元測試實踐

一、 單元測試並生成報告 1、maven外掛 <reporting> <plugins> <plugin> <groupId>org.apache.

jenkins搭建自動化部署平臺(svn+tomcat重啟)

jenkins 自動化部署和整合程式碼的平臺 可以將git svn 上的程式碼 checkout 然後重新部署伺服器,節省開發測試的效率 一、https://jenkins.io/index.html 下載jenkins包(war包) 二、下載完war包   在伺服器上最好

maven+jenkins 搭建自動化部署平臺

express ron def activate webapps mvn further plugin under jenkins 自動化部署 1、安裝JDK 1.1、上傳linux的JDK安裝包到opt目錄下,並解壓 1.2、配置jdk環境變量vim /