1.如下全是我的理解,此文全是在實際工做環境中實現,若是您是想看着這篇博客去練習,可能有些環境您無法搭建(maven庫,編譯順序),得問問一個搞開發的朋友,開發得提供些東西,或者,您能夠經過此文檔,學習到pipeline腳本的知識,您能夠去除掉用mvn build這一項,其餘的環境,做爲運維人員,均可以搭建得好。java
2.爲了方便各位看得清楚,以及我我的這麼多年生活知識的基類,我是很恨馬賽克的,因此全文沒有馬賽克,個人配置能夠所有看到,沒有隱私。node
3.文中服務器全是私有ip,本人如今維護的是私有云環境,因此利用現有環境給各位看官寫這篇博客,大家是連不上我這兒的內網ip的。linux
#什麼是pipeline?git
pipeline 流水線,簡單來講就是將本來獨立運行的操做結合起來,統一有序的運做。web
聯想一下,電視裏面的工廠廠子裏面的流水線,每部分人,任務可能不一樣,可是都是在一條線上工做的shell
工人作的事情多是裝手機殼,裝電池,那pipeline中作什麼呢,拉取代碼,提交代碼等tomcat
準備階段bash
#jenkins主機:安裝git客戶端 安裝maven服務器
下面是git和maven的包:less
連接:https://pan.baidu.com/s/1q5zNU2e69GKeoqz2Yfd94w 密碼:kvlp
git安裝:[jenkins@host-10-124-198-75 git-2.10.2]$ ./configure && make && make install
maven安裝:[jenkins@host-10-124-198-75 soft]$ tar xf maven.tar.gz -C /home/jenkins/
#maven安裝後在/etc/profile裏面配置環境變量PATH便可,如下是個人配置
export JAVA_HOME=/opt/edas/jdk/java/
export JRE_HOME=/opt/edas/jdk/java/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export JENKINS_HOME=/home/jenkins/jenkins
export MAVEN_HOME=/home/jenkins/maven
export PATH=${JAVA_HOME}/bin:$PATH:${MAVEN_HOME}/bin:/usr/local/bin/:$JRE_HOME/bin:/home/jenkins/soft/node-v8.12.0-linux-x64/lib/node_modules
#jenkins平臺上安裝:pipeline等插件
因爲jenkins的版本跟jenkins所須要的插件版本有着依賴性,我此次使用的jenkins版本跟上一篇博客是有區別的,因此,建議使用一致的版本,經過下面連接下載我如今版本的jenkins,以及一個plugins.tar.gz文件
連接:https://pan.baidu.com/s/11mZ6aK1p1q9ymb3pmjFNRA 密碼:ed2p
#plugins文件是幹嗎的??
當你安裝jenkins後,默認有一個變量JENKINS_HOME指向的是 第一次啓動jenkins時,若是沒指定這個變量,默認是 「啓動用戶家目錄下的.jenkins/」,此目錄用於存儲jenkins中的一些數據,jenkins家目錄下有一個叫plugins的目錄,此目錄用於存放插件,個人jenkins跟plugins版本是吻合的,因此,你若是要使用我這個版本的jenkins,就不用本身去尋思安裝啥插件了,我都給你準備好了。
#啓動jenkins
java -Djava.awt.headless=true -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -jar jenkins.war --ajp13Port=-1 --httpPort=8088 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20 &> /home/jenkins/jenkins_log/mesages &
這是講的jenkins,jvm調優參數啥意思本身百度吧,順便了解下,就是指定內存大小啥的。
java -jar 名稱.war # 前臺啓動某個jar包
--httpPort=8088 指定jenkins的端口
&> /home/jenkins/jenkins_log/mesages & #標準輸出,以及錯誤輸出,全都重定向到某個文件(實現了日誌功能),並將這個項目放入後臺運行
#jenkins啓動了,你要訪問http://localhost:8088 進行第一次啓動的配置,你配置的時候,什麼插件都不用安裝,只須要設置用戶名和密碼就好了,安裝成功後,將我給你的plugins.tar.gz 解壓,copy,並覆蓋掉jenkins家目錄下的plugins目錄,而後重啓jenkins(kill掉進程,而後再次執行上面的命令)
重啓成功後,登陸進入jenkins,選擇左側的系統管理-插件管理,已安裝插件,看有沒有pipeline等不少的插件
#好的,至此,恭喜你,你已經搞好了2/1了,剩下的按部就班便可。
1.添加git帳戶
#添加一個帳戶用來鏈接gitlab
進入後選擇 Add Credentials,進行用戶添加
#下圖的其餘選項你應該看得懂,可是那個箭頭指向的選項還得特別說下:給它設立一個簡潔,有含義的名稱,由於後面咱們將要在腳本中經過這個id名稱來調用這個帳戶來鏈接gitlab獲取數據。
2.新建任務
建立好帳戶後能夠直接新建任務了,起一個開發人員可以認識的名字,而且選擇pipeline
建立好任務後,直接拉到最下面,找到pipeline,編寫pipeline腳本
3.編寫pipeline腳本
#編寫以前,先想一想具體邏輯是什麼樣的。
1.從gitlab上拉取代碼
2.備份網站服務器以前的代碼
3.刪除網站服務器以前的代碼
4.將新代碼傳到網站服務器服務器上
5.重啓網站服務器上的web應用
總的來講就是這5個步驟,接下來要作的是將這5步翻譯成腳本命令。
腳本結構:
node () { def workspace = pwd() stage 'checkout' stage 'Build' stage 'backup' stage 'delete_old' stage 'upload' stage 'restart_tomcat' }
共是5個階段(stage)
具體代碼
node () { def workspace = pwd() war_name='custinfo_partner' tomcat_home='/home/admin/taobao-tomcat-production-7.0.59.3' host='10.124.193.76' user='admin' passwd='A1B2C3D4' stage 'checkout' dir('base'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/base.git' } dir('business_customer_inform'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_customer_inform.git' } dir('business_partner'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_partner.git' } dir('custinfo_partner'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/custinfo_partner.git' } stage 'Build' sh""" cd $workspace/base /home/jenkins/maven/bin/mvn clean install -U -Pdev cd $workspace/business_customer_inform /home/jenkins/maven/bin/mvn clean install -U -Pdev cd $workspace/business_partner /home/jenkins/maven/bin/mvn clean install -U -Pdev cd $workspace/custinfo_partner /home/jenkins/maven/bin/mvn clean install -U -Pdev """ stage 'backup' sh """ cd $workspace/'$war_name'/target tar cfz /home/jenkins/jenkins_work_backup/Web`date +%y%m%d-%s`-test.tar.gz '$war_name'.war """ stage 'delete_old' sh """sshpass -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' "rm -rf '$tomcat_home'/deploy/'$war_name'* " """ stage 'upload' sh """ cd $workspace/'$war_name'/target sshpass -p'$passwd' scp -o StrictHostKeyChecking=no '$war_name'.war '$user'@'$host':'$tomcat_home'/deploy/'$war_name'.war """ stage 'restart_tomcat' sh "sshpass -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' 'bash /home/admin/if_tomcat.sh'" echo 'done_______________' }
解釋:
#代碼中如下部分是定義變量部分,在一處定義變量,文中存在多處調用,這樣作能夠提升擴展性,別到時候,登陸密碼改了,還得一處一處去改
def workspace = pwd() #此處等同於linux命令行中pwd命令 等於把當前路徑賦值給workspace變量 war_name='mgr_resource' #最終網站服務器上的war包名稱,跟maven打包出來的名稱相同,故用變量標識,減小重複編寫工做 tomcat_home='/home/admin/taobao-tomcat-production-7.0.59.3' host='10.124.193.76' #網站服務器的ip和web應用地址,以及登陸密碼信息。 user='admin' passwd='A1B2C3D4'
#如下部分做用是從gitlab中拉取代碼
#選此處進行講解
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
dir('base'){ #建立目錄:base 用於存放下一行代碼從gitlab中拉取的代碼
#base目錄絕對路徑是:Jenkins家目錄下/workspace/任務名稱(這兒是mgr_resource-test)/base
#(個人環境中是:/home/jenkins/jenkins/workspace/mgr_resource-test/base)
git branch: 'dev', credentialsId: 'git_account', url: 'http://10.124.198.74/AsiaSatComBOSS/base.git' }
git客戶端 指定gitlab分支 指定用於登陸gitlab的帳戶id(沒忘吧,咱們在步驟1建立過的) #指定gitlab的地址
#除了git客戶端你本身安裝,實際工做環境中,gitlab分支,gitlab帳戶密碼,gitlab地址,以及編譯順序,都是開發人員給你的。
#不知道gitlab分支是什麼,沒事兒,忽略這個知識點,就當沒說,你理解爲簡單的拉取代碼,用哪一個用戶,拉哪塊的代碼,後期你再去了解分支是幹啥的。
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
stage 'checkout'
dir('base'){
git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/base.git'
}
dir('business_customer_inform'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_customer_inform.git' } dir('business_partner'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_partner.git' } dir('custinfo_partner'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/custinfo_partner.git' }
#我先從gitlab上拉取代碼,不作其餘操做,先試試水,結果以下(我只使用了stage('checkout')階段的代碼,從git上拉取數據,其餘操做還未指定。)
node () { def workspace = pwd() war_name='mgr_resource' tomcat_home='/home/admin/taobao-tomcat-production-7.0.59.3' host='10.124.193.76' user='admin' passwd='A1B2C3D4' stage 'checkout' dir('base'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/base.git' } dir('business_customer_inform'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_customer_inform.git' } dir('business_partner'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_partner.git' } dir('custinfo_partner'){ git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/custinfo_partner.git' } }
#仔細看看stage('checkout')階段的代碼,每一個dir('')生成的目錄,這裏面都有,而這些目錄裏面存儲的,就是每一個dir(‘’)後的那段git代碼拉取下來的數據
#好的,平緩下來,繼續解釋代碼
#如下代碼,做用於編譯代碼,*能夠在jenkins裏面執行bash命令,真好。
#maven編譯代碼以前,須要配置一些東西,如jar包倉庫,等才能成功編譯,也就是說,你要讓你本身獲得知識上的知足,你必須多看書,你從哪看這些書呢,要不你有書,要不你就上網找書,方案不少,可是須要跟開發人員配合後才知道如何獲取這些jar包,這裏就不作介紹。stage 'Build'
#沒忘記吧? $workspace是pwd(),也就是jenkins工做目錄,就是jenkins家目錄/jenkins/workspace/任務名稱/
#sh """command """ sh"command" 均可以執行shell命令(每一個單獨的sh,等於說新開一個bash環境執行命令),前者通常是執行多行的命令的時候使用,後者執行一條命令時用
sh"""
cd $workspace/base #進入從git下載了代碼的目錄中 /home/jenkins/maven/bin/mvn clean install -U -Pdev #編譯的結果是獲得一個war包,可是1個項目通常只有1個war包,爲何要編譯這麼多文件呢? cd $workspace/business_customer_inform #由於開發要求這樣編譯。 /home/jenkins/maven/bin/mvn clean install -U -Pdev #這是一次有順序的編譯操做,1,2,3,4,按照有循序的邏輯來 cd $workspace/business_partner #先有1纔能有2,有了2纔能有3,我最終要的結果是4,那麼也要一步一步來才行 /home/jenkins/maven/bin/mvn clean install -U -Pdev cd $workspace/custinfo_partner #一般,最後編譯的包裏面,就是須要的war包存在的目錄,前三個只是打鋪墊。 /home/jenkins/maven/bin/mvn clean install -U -Pdev #編譯成功後會在目錄下新建一個target目錄存放war包 """
#編譯完成後,我就獲得這個war包了,再試一下水,war包以下。
#下一段代碼,對網站服務器作一些操做,備份-刪除-上傳新的,重啓網站服務。
#如下全是linux命令,很少作解釋,這還看不懂,那就無法了。
sshpass:提供非交互式的密碼認證環境
StrictHostKeyChecking=no #主機key檢查,當你第一次鏈接某臺機器時,會出現交互式頁面,以下,腳本可不會只能幫咱們輸入「yes」,因此,避免出現這種狀況!
最後一個動做是重啓tomcat,當你把新的代碼傳上去,你得讓tomcat識別,因此得重啓,簡單的操做,個人腳本以下。
#!/bin/bash tomcat_home=/home/admin/taobao-tomcat-production-7.0.59.3 id=`ps aux |grep /home/admin/taobao-tomcat-production-7.0.59.3 |grep -v grep |awk -F" " '{print $2}'` tomcat_id=`cat $tomcat_home/catalina.pid` if [ $id = $tomcat_id ];then kill -9 $tomcat_id sleep 2 $tomcat_home/bin/startup.sh &>/dev/null else $tomcat_home/bin/startup.sh &>/dev/null fi
#須要額外注意一點:pipeline中使用變量,除了變量 workspace = pwd() 調用方法是$workspace,其餘自定義變量,如user,調用方式是 '$user'
stage 'backup' sh """ cd $workspace/'$war_name'/target #進入編譯後的target目錄,將war包作個備份,並以年月日-秒來命令,後期能夠本身寫shell腳原本判斷建立時間,超過一週的刪除 tar cfz /home/jenkins/jenkins_work_backup/Web`date +%y%m%d-%s`-test.tar.gz '$war_name'.war """ stage 'delete_old' sh """sshpass -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' "rm -rf '$tomcat_home'/deploy/'$war_name'* " """ #刪除網站服務器上的舊數據 stage 'upload' sh """ cd $workspace/'$war_name'/target #maven 編譯後,在目錄下新建一個target文件,將war包放在其中 sshpass -p'$passwd' scp -o StrictHostKeyChecking=no '$war_name'.war '$user'@'$host':'$tomcat_home'/deploy/'$war_name'.war """ #進入編譯後的target目錄,將war包scp到網站服務器上的web程序目錄下。 stage 'restart_tomcat' sh "sshpass -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' 'bash /home/admin/if_tomcat.sh'" echo 'done_______________' #執行重啓tomcat腳本