Jenkins Pipeline+Maven+Gitlab持續集成構建


 

1.以下全是個人理解,此文全是在實際工作環境中實現,如果您是想看着這篇博客去練習,可能有些環境您沒法搭建(maven庫,編譯順序),得問問一個搞開發的朋友,開發得提供些東西,或者,您可以通過此文檔,學習到pipeline腳本的知識,您可以去除掉用mvn  build這一項,其他的環境,作為運維人員,都可以搭建得好。

2.為了方便各位看得清楚,以及我個人這么多年生活知識的基類,我是很恨馬賽克的,所以全文沒有馬賽克,我的配置可以全部看到,沒有隱私。

3.文中服務器全是私有ip,本人現在維護的是私有雲環境,所以利用現有環境給各位看官寫這篇博客,你們是連不上我這兒的內網ip的。

 

 

#什么是pipeline?

pipeline 流水線,簡單來說就是將原本獨立運行的操作結合起來,統一有序的運作。

聯想一下,電視里面的工廠廠子里面的流水線,每部分人,任務可能不同,但是都是在一條線上工作的

工人做的事情可能是裝手機殼,裝電池,那pipeline中做什么呢,拉取代碼,提交代碼等

 

准備階段

#jenkins主機:安裝git客戶端  安裝maven

 

下面是git和maven的包:

 鏈接: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'
   
}
View Code

 

  共是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'
     }
}
View Code

#仔細看看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 #這是一次有順序的編譯操作,12,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
View Code

 

#需要額外注意一點: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腳本

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM