本篇文章給大家分享的是有關(guān)Jenkins中怎么實現(xiàn)Pipeline自動化部署,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都地區(qū)優(yōu)秀IDC服務器托管提供商(創(chuàng)新互聯(lián)公司).為客戶提供專業(yè)的成都服務器托管,四川各地服務器托管,成都服務器托管、多線服務器托管.托管咨詢專線:028-86922220
為了快速搭建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還需要在遠程服務器執(zhí)行任務,需要通過ssh連接,那么我們就需要在Jenkins里面生成ssh的公鑰密鑰:
$ sudo docker exec -it jenkins /bin/bash $ ssh-keygen -C "root@jenkins"
在遠程節(jié)點的~/.ssh/authorized_keys中添加jenkins的公鑰(id_rsa.pub)
還需要安裝一些必要的插件:
Pipeline Maven Integration
SSH Pipeline Steps
安裝完插件后,還需要去全局工具那里添加maven:
這里后面Jenkinsfile有用到。
由于我們的開發(fā)是基于多分支開發(fā),每個開發(fā)環(huán)境都對應有一條分支,所以普通的Pipeline自動化構(gòu)建并不能滿足現(xiàn)有的開發(fā)部署需求,所以我們需要使用Jenkins的mutiBranch Pipeline。
首先當然是新建一個mutiBranch多分支構(gòu)建job:
接著設置分支源,分支源就是你項目的git地址,選擇Jenkinsfile在項目的路徑
接下來Jenkins會在分支源中掃描每個分支下的Jenkinsfile,如果該分支下有Jenkinsfile,那么就會創(chuàng)建一個分支Job
該job下的分支job如下:
這里需要注意的是,只有需要部署的分支,才加上Jenkinsfile,不然Jenkins會將其余分支也創(chuàng)建一個分支job。
到這里之前,基本就可以基于Pipeline腳本自動化部署了,但如果你是一個追求極致,不甘于平庸的程序員,你一定會想,隨著項目的增多,Pipeline腳本不斷增多,這會造成越來越大的維護成本,隨著業(yè)務的增長,難免會在腳本中修改東西,這就會牽扯太多Pipeline腳本了,而且這些腳本基本都相同,那么對于我這么優(yōu)秀的程序員,怎么會想不到這個問題呢,我第一時間就想到通用化pipeline腳本。所幸,Jenkins已經(jīng)看出了我不斷騷動的心了,Jenkins甩手就給我一個Shared Libraries。
Shared Libraries是什么呢?顧名思義,它就是一個共享庫,它的主要作用是用于將通用的Pipeline腳本放在一個地方,其它項目可以從它那里獲取到一個全局通用化的Pipeline腳本,項目之間通過不通的變量參數(shù)傳遞,達到通用化的目的。
接下來我們先創(chuàng)建一個用于存儲通用Pipeline腳本的git倉庫:
倉庫目錄不是隨便亂添加了,Jenkins有一個嚴格的規(guī)范,下面是官方說明:
官方已經(jīng)講得很清楚了,大概意思就是vars目錄用于存儲通用Pipeline腳本,resources用于存儲非Groovy文件。所以我這里就把Pipeline需要的構(gòu)建腳本以及編排文件都集中放在這里,完全對業(yè)務工程師隱蔽,這樣做的目的就是為了避免業(yè)務工程師不懂瞎幾把亂改,導致出bug。
創(chuàng)建完git倉庫后,我們還需要在jenkins的Manage Jenkins ? Configure System ? Global Pipeline Libraries
中定義全局庫:
這里的name,可以在jenkinsfile中通過以下命令引用:
@Library 'objcoding-pipeline-library'
下面我們來看通用Pipeline腳本的編寫規(guī)則:
#!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('構(gòu)建鏡像') { 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('執(zhí)行發(fā)版') { 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" } } } } }
由于我們需要在遠程服務器執(zhí)行任務,所以定義一個遠程服務器的信息其中remote.identityFile
就是我們上面在容器生成的密鑰的地址;
定義一個call()方法,這個方法用于在各個項目的Jenkinsfile中調(diào)用,注意一定得叫call;
在call()方法中定義一個pipeline;
environment參數(shù)即是可變通用參數(shù),通過傳遞參數(shù)Map來給定值,該Map是從各個項目中定義的傳參;
接下來就是一頓步驟操作啦,“編譯代碼”這步驟需要填寫上面我們在全局工具類設置的maven,“構(gòu)建鏡像”的構(gòu)建腳本巧妙地利用wget從本遠程倉庫中拉取下來,”執(zhí)行發(fā)版“的編排文件也是這么做,“init-server”步驟主要是初始化一個server對象,供“執(zhí)行發(fā)版使用”。
從腳本看出來Jenkins將來要推崇的一種思維:配置即代碼。
寫完通用Pipeline腳本后,接下來我們就需要在各個項目的需要自動化部署的分支的根目錄下新建一個Jenkinsfile腳本了:
接下來我來解釋一下Jenkinsfile內(nèi)容:
#!groovy // 在多分支構(gòu)建下,嚴格規(guī)定Jenkinsfile只存在可以發(fā)版的分支上 // 引用在jenkins已經(jīng)全局定義好的library library 'objcoding-pipeline-library' def map = [:] // 遠程管理節(jié)點地址(用于執(zhí)行發(fā)版) 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') // 調(diào)用library中var目錄下的build.groovy腳本 build(map)
通過library 'objcoding-pipeline-library'
引用我們在Jenkins定義的全局庫,定義一個map參數(shù);
接下來就是將項目具體的參數(shù)保存到map中,調(diào)用build()方法傳遞給通用Pipeline腳本。
以上就是Jenkins中怎么實現(xiàn)Pipeline自動化部署,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。