項目案例之Pipeline流水線發布JAVA項目(三)


項目案例之Pipeline流水線發布JAVA項目(三)

鏈接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ
提取碼:z7gj
復制這段內容后打開百度網盤手機App,操作更方便哦

6. 項目案例二:流水線自動化發布JAVA項目

主機名 IP地址 備注
Git 192.168.200.61 Git服務器
Jenkins 192.168.200.62 Jenkins服務器
Web01 192.168.200.65 Tomcat服務器
#所有服務器進行如下操作
[root@Git ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@Git ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[root@Git ~]# systemctl stop firewalld
[root@Git ~]# systemctl disable firewalld
[root@Git ~]# systemctl stop NetworkManager
[root@Git ~]# systemctl disable NetworkManager

6.1 Tomcat服務器環境部署

#在tomcat服務器進行如下操作
#部署jdk
[root@Web02 ~]# ls
anaconda-ks.cfg  apache-maven-3.5.0-bin.tar.gz  apache-tomcat-8.5.33.tar.gz  jdk-8u171-linux-x64.tar.gz
[root@Web02 ~]# tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/
[root@Web02 ~]# cd /usr/local/
[root@Web02 local]# mv jdk1.8.0_171 jdk
[root@Web02 local]# ln -s /usr/local/jdk/bin/java /usr/local/bin/
[root@Web02 local]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
#部署java環境變量
[root@Web02 local]# vim /etc/profile
[root@Web02 local]# tail -4 /etc/profile
#部署java環境變量
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
[root@Web02 local]# source /etc/profile
#部署maven
[root@Web02 ~]# tar xf apache-maven-3.5.0-bin.tar.gz -C /usr/local
[root@Web02 ~]# cd /usr/local/
[root@Web02 local]# mv apache-maven-3.5.0 maven
[root@Web02 local]# ln -s /usr/local/maven/bin/mvn /usr/local/bin/
[root@Web02 local]# mvn -version
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_171, vendor: Oracle Corporation
Java home: /usr/local/jdk/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.14.4.el7.x86_64", arch: "amd64", family: "unix"

#部署maven環境變量
[root@Web02 local]# vim /etc/profile
[root@Web02 local]# tail -3 /etc/profile
#部署maven環境變量
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:${MAVEN_HOME}
[root@Web02 local]# source /etc/profile
#解壓tomcat
[root@Web02 ~]# tar xf apache-tomcat-8.5.33.tar.gz -C /usr/local/
[root@Web02 ~]# cd /usr/local/
[root@Web02 local]# mv apache-tomcat-8.5.33 tomcat
[root@Web02 local]# cd tomcat/
[root@Web02 tomcat]# ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
[root@Web02 tomcat]# rm -rf webapps/*
[root@Web02 tomcat]# ls webapps/
[root@Web02 tomcat]# 
#部署tomcat環境變量
[root@Web02 tomcat]# vim /etc/profile
[root@Web02 tomcat]# tail -2 /etc/profile
#部署tomcat環境變量
export TOMCAT_HOME=/usr/local/tomcat
[root@Web02 tomcat]# source /etc/profile

#自動部署需要解壓maven構建后的war包,因此需要安裝unzip
[root@Web02 tomcat]# yum -y install unzip
[root@Web02 tomcat]# rpm -qa unzip
unzip-6.0-19.el7.x86_64

#自動部署需要git遠程倉庫代碼,因此需要安裝git
[root@Web02 tomcat]# yum -y install git
[root@Web02 tomcat]# rpm -qa git
git-1.8.3.1-14.el7_5.x86_64

6.2 構建一個B-JAVA流水線項目

image.png-83kB

image.png-38.2kB

image.png-23.5kB

image.png-60.9kB

6.3 下載solo項目源代碼並上傳Git遠程倉庫

solo源代碼下載地址 https://github.com/b3log/solo

#在Git服務器上創建用於存放solo源代碼的倉庫
[root@Git ~]# hostname -I
192.168.200.61 
[root@Git ~]# cd /home/git/repos/
[root@Git repos]# mkdir solo.git
[root@Git repos]# cd solo.git/
[root@Git solo.git]# git --bare init
初始化空的 Git 版本庫於 /home/git/repos/solo.git/
[root@Git solo.git]# cd ..
[root@Git repos]# chown -R git.git solo.git
#在jenkins服務器上進行如下操作
#解壓solo.tar.gz源代碼包
[root@Jenkins ~]# tar xf solo.tar.gz
[root@Jenkins ~]# mkdir -p /mycode
[root@Jenkins ~]# cd /mycode/
[root@Jenkins mycode]# git clone git@192.168.200.61:/home/git/repos/solo.git
正克隆到 'solo'...
warning: 您似乎克隆了一個空版本庫。
[root@Jenkins mycode]# ls
solo
[root@Jenkins mycode]# cd solo/
[root@Jenkins solo]# ls
[root@Jenkins solo]# mv /root/solo/* .
[root@Jenkins solo]# ls
CHANGE_LOGS.html    Dockerfile   LICENSE       pom.xml    README_zh_CN.md
docker-compose.yml  gulpfile.js  package.json  README.md  src
[root@Jenkins solo]# rm -rf /root/solo
#為了最后的測試,我們需要修改源代碼的一個配置文件
[root@Jenkins solo]# cd src/main/resources/
[root@Jenkins resources]# ll -d latke.properties 
-rw-r--r-- 1 root root 1241 10月 25 14:29 latke.properties
[root@Jenkins resources]# vim latke.properties 
[root@Jenkins resources]# cat -n latke.properties | sed -n '29p;31p'
    29	serverHost=192.168.200.65
    31	serverPort=8080
    

#將solo源代碼提交到Git倉庫
[root@Jenkins resources]# cd /mycode/solo/
[root@Jenkins solo]# git add *
[root@Jenkins solo]# git commit -m "第一次提交"
[root@Jenkins solo]# git push -u origin master
[root@Jenkins solo]# git push -u origin master
Counting objects: 2099, done.
Compressing objects: 100% (2044/2044), done.
Writing objects: 100% (2099/2099), 27.44 MiB | 9.27 MiB/s, done.
Total 2099 (delta 367), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/solo.git
 * [new branch]      master -> master
分支 master 設置為跟蹤來自 origin 的遠程分支 master。
#將代碼克隆到本地進行克隆驗證
[root@Jenkins solo]# mkdir -p /test
[root@Jenkins solo]# cd /test/
[root@Jenkins test]# git clone git@192.168.200.61:/home/git/repos/solo.git
正克隆到 'solo'...
remote: Counting objects: 2099, done.
remote: Compressing objects: 100% (1677/1677), done.
remote: Total 2099 (delta 367), reused 2099 (delta 367)
接收對象中: 100% (2099/2099), 27.44 MiB | 22.41 MiB/s, done.
處理 delta 中: 100% (367/367), done.
[root@Jenkins test]# ls
solo
[root@Jenkins test]# cd solo/
[root@Jenkins solo]# ls
CHANGE_LOGS.html    Dockerfile   LICENSE       pom.xml    README_zh_CN.md
docker-compose.yml  gulpfile.js  package.json  README.md  src

6.4 創建一個流水線腳本並提交Git遠程倉庫

#在jenkins服務器上進行如下操作
[root@Jenkins ~]# mkdir -p /jenkinsfile
[root@Jenkins ~]# cd /jenkinsfile/
[root@Jenkins jenkinsfile]# git clone git@192.168.200.61:/home/git/repos/jenkinsfile
正克隆到 'jenkinsfile'...
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 20 (delta 3), reused 0 (delta 0)
接收對象中: 100% (20/20), done.
處理 delta 中: 100% (3/3), done.

[root@Jenkins jenkinsfile]# ls
jenkinsfile
[root@Jenkins jenkinsfile]# cd jenkinsfile/
[root@Jenkins jenkinsfile]# ls
itemA

image.png-55.4kB

image.png-16kB

image.png-28.8kB

image.png-10.1kB

image.png-43.5kB

[root@Jenkins jenkinsfile]# mkdir itemB
[root@Jenkins jenkinsfile]# cd itemB/
[root@Jenkins jenkinsfile]# vim itemB/jenkinsfile-java-solo
[root@Jenkins jenkinsfile]# cat itemB/jenkinsfile-java-solo
node ("PHP-slave2-192.168.200.65") {
   stage('git checkout') {
      checkout([$class: 'GitSCM', branches: [[name: '${branch}']], 
      doGenerateSubmoduleConfigurations: false, extensions: [],submoduleCfg: [], 
      userRemoteConfigs: [[credentialsId: 'f58165e3-e5a7-408a-a57d-a4b643b14308', 
      url: 'git@192.168.200.61:/home/git/repos/solo.git']]])
   }
   stage('maven build') {
      sh '/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'
   }
   stage('deploy') {
      sh '''WWWROOT=/usr/local/tomcat/webapps/ROOT
      [ -d /data/backup ] || mkdir -p /data/backup
      if [ -d $WWWROOT ];then
         mv $WWWROOT /data/backup/tomcat-$(date +%F_%T)
      fi
      unzip ${WORKSPACE}/target/*.war -d $WWWROOT
      PID=$(ps -ef | grep tomcat | egrep -v "grep|$$" | awk \'{print $2}\')
      [ -n "$PID" ] && kill -9 $PID
      /bin/bash /usr/local/tomcat/bin/startup.sh'''
   }
   stage('test') {
       sh 'echo susses'
   }
}
#推送本地倉庫到遠程Git
[root@Jenkins jenkinsfile]# git add *
[root@Jenkins jenkinsfile]# git commit -m "java流水線腳本"
[master 89a206e] java流水線腳本
 1 file changed, 25 insertions(+)
 create mode 100644 itemB/jenkinsfile-java-solo
[root@Jenkins jenkinsfile]# git push -u origin master
Counting objects: 6, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 913 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/jenkinsfile
   6106cee..89a206e  master -> master
分支 master 設置為跟蹤來自 origin 的遠程分支 master。
#進行流水線腳本克隆測試
[root@Jenkins jenkinsfile]# cd /test/
[root@Jenkins test]# ls
solo
[root@Jenkins test]# rm -rf *
[root@Jenkins test]# git clone git@192.168.200.61:/home/git/repos/jenkinsfile
正克隆到 'jenkinsfile'...
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 24 (delta 4), reused 0 (delta 0)
接收對象中: 100% (24/24), done.
處理 delta 中: 100% (4/4), done.
[root@Jenkins test]# ls
jenkinsfile
[root@Jenkins test]# cd jenkinsfile/
[root@Jenkins jenkinsfile]# ls
itemA  itemB
[root@Jenkins jenkinsfile]# ls itemB/jenkinsfile
itemB/jenkinsfile

6.5 設置分布式構建的slave管理節點

6.5.1 添加用於ssh連接的賬戶和密碼

image.png-25.3kB

6.5.2 配置slave從節點

image.png-27.5kB

image.png-57.4kB

image.png-13kB

6.6 進行流水線的單Slave從節點分布式構建測試

如果不出意外,構建會失敗在最后一步(tomcat進程未啟動)。
jenkins沒辦法啟動tomcat的socket進程
原因在於Pipeline流水線在啟動一個腳本程序的時候,這個腳本程序會運行在后台。
但是當pipeline結束以后,jenkins會自動kill掉所有和pipeline有關的派生子進程
因此,我們需要在流水線腳本里加一個變量參數,不讓pipeline殺掉才可以
JENKINS_NODE_COOKIE=dontkillme

#修改流水線腳本,添加參數,並提交遠程倉庫
[root@Jenkins jenkinsfile]# cat itemB/jenkinsfile-java-solo 
node ("PHP-slave2-192.168.200.65") {
   stage('git checkout') {
      checkout([$class: 'GitSCM', branches: [[name: '${branch}']], 
      doGenerateSubmoduleConfigurations: false, extensions: [],submoduleCfg: [], 
      userRemoteConfigs: [[credentialsId: 'f58165e3-e5a7-408a-a57d-a4b643b14308', 
      url: 'git@192.168.200.61:/home/git/repos/solo.git']]])
   }
   stage('maven build') {
      sh '/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'
   }
   stage('deploy') {
      sh '''
      JENKINS_NODE_COOKIE=dontkillme    #添加此行
      WWWROOT=/usr/local/tomcat/webapps/ROOT
      [ -d /data/backup ] || mkdir -p /data/backup
      if [ -d $WWWROOT ];then
         mv $WWWROOT /data/backup/tomcat-$(date +%F_%T)
      fi
      unzip ${WORKSPACE}/target/*.war -d $WWWROOT
      PID=$(ps -ef | grep tomcat | egrep -v "grep|$$" | awk \'{print $2}\')
      [ -n "$PID" ] && kill -9 $PID
      /bin/bash /usr/local/tomcat/bin/startup.sh'''
   }
   stage('test') {
       sh 'echo susses'
   }
}


#提交遠程Git倉庫
[root@Jenkins jenkinsfile]# git add *
[root@Jenkins jenkinsfile]# git commit -m "第二次提交java流水線腳本"
[master 1677c59] 第二次提交java流水線腳本
 1 file changed, 3 insertions(+), 1 deletion(-)
[root@Jenkins jenkinsfile]# git push -u origin master
Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 457 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
To git@192.168.200.61:/home/git/repos/jenkinsfile
   89a206e..1677c59  master -> master
分支 master 設置為跟蹤來自 origin 的遠程分支 master。

進行分布式構建測試
image.png-23.6kB

image.png-56.2kB

image.png-32.3kB

6.7 進行流水線的單Slave從節點SSH遠程分布式構建測試

克隆一台tomcat服務器,進行SSH遠程構建

主機名 IP地址 備注
Git 192.168.200.192 Git服務器
Jenkins 192.168.200.193 Jenkins服務器
Web01 192.168.200.196 Tomcat服務器
Web02 192.168.200.197 TomcatB服務器

6.7.1 安裝SSH Pipeline Steps插件

image.png-97.5kB

image.png-82.5kB

6.7.2 修改流水線腳本,並提交Git倉庫

#修改流水線腳本,並提交Git倉庫
[root@Jenkins jenkinsfile]# cat itemB/jenkinsfile-java-solo 
node ("PHP-slave2-192.168.200.196") {
   //def mvnHome
   def remote = [:]
   stage('git checkout') {
    sh 'hostname -I'
        checkout([$class: 'GitSCM', branches: [[name: '${branch}']], 
        doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], 
        userRemoteConfigs: [[credentialsId: 'd0721eb3-07e1-49f2-bb30-2fae94220fad', 
        url: 'git@192.168.200.192:/home/git/repos/solo.git']]])
   }
   stage('maven build') {
        sh '/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'
   }
   stage('Remote SSH 200.192') {
        remote.name = 'test'
        remote.host = '192.168.200.192'
        remote.user = 'root'
        remote.password = '666666'
        remote.allowAnyHosts = true
        writeFile file: '192.sh',text:'echo "`hostname -I`"'
        sshScript remote: remote,script: "192.sh"
   }
   stage('Remote SSH 200.197') {
        remote.name = 'test'
        remote.host = '192.168.200.197'
        remote.user = 'root'
        remote.password = '666666'
        remote.allowAnyHosts = true
    writeFile file: '197.sh',text:'''
echo "`hostname -I`"
'''
    sshScript remote: remote,script: "197.sh"
   }
}

6.7.3 進行分布式構建測試

image.png-105.6kB

image.png-43.4kB

image.png-76.1kB

image.png-88.4kB
6.8 進行流水線的多Slave從節點分布式構建測試

添加Slave從節點,並進行多節點構建

image.png-48.9kB

#修改流水線腳本,並提交Git倉庫
[root@Jenkins jenkinsfile]# cat itemB/jenkinsfile-java-solo
node ("PHP-slave2-192.168.200.196") {
   //def mvnHome
   stage('git checkout') {
        sh 'hostname -I'
        checkout([$class: 'GitSCM', branches: [[name: '${branch}']], 
        doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], 
        userRemoteConfigs: [[credentialsId: 'd0721eb3-07e1-49f2-bb30-2fae94220fad', 
        url: 'git@192.168.200.192:/home/git/repos/solo.git']]])
   }
   stage('maven build') {
        sh '/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'
   }
   stage('deploy') {
        sh '''
        JENKINS_NODE_COOKIE=dontkillme
        WWWROOT=/usr/local/tomcat/webapps/ROOT
        [ -d /data/backup ] || mkdir -p /data/backup
        if [ -d $WWWROOT ];then
            mv $WWWROOT /data/backup/tomcat-$(date +%F_%T)
        fi
        unzip ${WORKSPACE}/target/*.war -d $WWWROOT
        PID=$(ps -ef | grep tomcat | egrep -v "grep|$$" | awk \'{print $2}\')
        [ -n "$PID" ] && kill -9 $PID
        /bin/bash /usr/local/tomcat/bin/startup.sh'''
   }
}
node ("PHP-slave3-192.168.200.197") {
   //def mvnHome
   stage('git checkout') {
        sh 'hostname -I'
        checkout([$class: 'GitSCM', branches: [[name: '${branch}']], 
        doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], 
        userRemoteConfigs: [[credentialsId: 'd0721eb3-07e1-49f2-bb30-2fae94220fad', 
        url: 'git@192.168.200.192:/home/git/repos/solo.git']]])
   }
   stage('maven build') {
        sh '/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'
   }
   stage('deploy') {
        sh '''
	JENKINS_NODE_COOKIE=dontkillme
	WWWROOT=/usr/local/tomcat/webapps/ROOT
        [ -d /data/backup ] || mkdir -p /data/backup
        if [ -d $WWWROOT ];then
            mv $WWWROOT /data/backup/tomcat-$(date +%F_%T)
        fi
        unzip ${WORKSPACE}/target/*.war -d $WWWROOT
        PID=$(ps -ef | grep tomcat | egrep -v "grep|$$" | awk \'{print $2}\')
        [ -n "$PID" ] && kill -9 $PID
        /bin/bash /usr/local/tomcat/bin/startup.sh'''
   }
}

image.png-58.3kB

7.生產環境網站項目發布思路

image.png-181.2kB


免責聲明!

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



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