所有的全局變量
export JAVA_HOME=/usr/local/jdkexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jarexport TOMCAT_HOME=/usr/local/tomcatexport MAVEN_HOME=/usr/local/mavenexport PATH=$PATH:${MAVEN_HOME}export TOMCAT_HOME=/usr/local/tomcat
項目案例二:流水線自動化發布JAVA項目
| 主機名 | IP地址 | 備注 |
|---|---|---|
| Git | 192.168.200.70 | Git服務器 |
| Jenkins | 192.168.200.91 | Jenkins服務器 |
| Tomcat | 192.168.200.104 | Tomcat服務器 |
所有服務器進行如下操作
cat /etc/redhat-release
uname -r
systemctl stop firewalld
systemctl disable firewalld
systemctl stop NetworkManager
systemctl disable NetworkManager

Tomcat服務器環境部署
tomcat所有包
鏈接:https://pan.baidu.com/s/1bFIsmqk0AdFGeB2-fbb7cQ
提取碼:uvyw
部署jdk
ls
tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local
cd /usr/local
mv jdk1.8.0_171 jdk
ln -s /usr/local/jdk/bin/java /usr/local/bin
java -version

部署java環境變量
sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
tail -3 /etc/profile
source /etc/profile

部署maven
ls
tar xf apache-maven-3.5.0-bin.tar.gz -C /usr/local/
cd /usr/local
mv apache-maven-3.5.0 maven
ln -s /usr/local/maven/bin/mvn /usr/local/bin
mvn -version

部署maven環境變量
vim /etc/profile
export MAVEN_HOME=/usr/local/mavenexport PATH=$PATH:${MAVEN_HOME}
tail -2 /etc/profile
source /etc/profile

部署tomcat
ls
tar xf apache-tomcat-8.5.31.tar.gz -C /usr/local/
cd /usr/local
mv apache-tomcat-8.0.27 tomcat
cd tomcat
rm -rf webapps/*
ls webapps/

部署tomcat環境變量
echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
tail -1 /etc/profile
source /etc/profile

自動部署需要解壓maven構建后的war包,因此需要安裝unzip
yum -y install unzip
which unzip

自動部署需要git遠程倉庫代碼,因此需要安裝git
yum -y install git
which git

構建一個B-JAVA流水線項目的提前准備工作
在Git服務器上創建用於存放solo源代碼的倉庫
hostname -I
cd /home/git/repos
mkdir solo.git
cd solo.git
git --bare init
cd ..
chown -R git.git solo.git

在jenkins服務器上進行解壓solo.tar.gz
鏈接:https://pan.baidu.com/s/1Fui3TNCwEsmv4TeUZ0fiWA
提取碼:tjo6 --->solo源代碼ls
tar xf solo.tar.gz
mkdir -p /mycode
cd /mycode
git clone git@192.168.200.70:/home/git/repos/solo.git
ls
cd solo
mv /root/solo/* .
ls

為了最后的測試,我們需要修改源代碼的一個配置文件
ls
cd src/main/resources
cat -n latke.properties | sed -n '29p;31p'
vim latke.properties +29
cat -n latke.properties | sed -n '29p;31p'
29 serverHost=192.168.200.104 --->tomcat服務器IP地址31 serverPort=8080 --->監聽端口

將solo源代碼提交到git倉庫
cd /mycode/solo
git add *
git commit -m "第一次提交"
git push -u origin master

將代碼克隆到本地進行克隆驗證
cd /test
git clone git@192.168.200.70:/home/git/repos/solo.git
cd solo
ls

在jenkins服務器上創建一個流水線腳本並提交git遠程倉庫(構建B-JAVA的時候生成過腳本)
mkdir /jenkinsfile
cd /jenkinsfile
git clone git@192.168.200.70:/home/git/repos/jenkinsfile
ls
cd jenkinsfile
mkdir itemB
vim itemB/jenkinsfile-java-solo
cat itemB/jenkinsfile-java-solo
node ("JAVA-slave1-192.168.200.104"){//def mvnHomestage('checkout') { // for display purposescheckout([$class: 'GitSCM', branches: [[name: '${branch}']],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],userRemoteConfigs: [[credentialsId: '9f98962f-1a82-4da1-8a0f-bc906e92d998',url: 'git@192.168.200.70:/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/backupif [ -d $WWWROOT ];thenmv $WWWROOT /data/backup/tomcat-$(date +%F_%T)fiunzip ${WORKSPACE}/target/*.war -d $WWWROOTPID=$(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'}}

在jenkins網頁上創建tomcat服務器的節點信息





構建一個B-JAVA流水線項目(有上文生成的腳本信息)




推送本地倉庫到遠程git
git add *
git commit -m "java流水線腳本"
git push -u origin master

在B-JAVA立即構建並測試


在tomcat服務器上查看tomcat服務並在瀏覽器查看測試結果
ss -antup | grep 8080


如果進行流水線的單Slave從節點分布式構建測試(出現tomcat服務未啟動情況)
如果構建會失敗在最后一步(tomcat進程未啟動)
jenkins沒辦法啟動tomcat的socker進程
原因在於Pipeline流水線在啟動一個腳本程序的時候,這個腳本程序會運行在后台。
但是當Pipeline結束以后,jenkins會自動kill掉所有和Pipeline有關的派生子進程
因此,我們需要在流水線腳本里加一個變量參數,不讓Pipeline殺掉才可以JENKINS_NODE_COOKIE=dontkillme
在jenkins服務器上重新克隆遠程倉庫代碼
cd /jenkinsfile
rm -rf *
git clone git@192.168.200.70:/home/git/repos/jenkinsfile
ls
cd /jenkinsfile
ls

修改jenkins服務器上的流水線腳本
cd /jenkinsfile/jenkinsfile/
vim itemB/jenkinsfile-java-solo
cat itemB/jenkinsfile-java-solo
node ("JAVA-slave1-192.168.200.104"){//def mvnHomestage('checkout') { // for display purposescheckout([$class: 'GitSCM', branches: [[name: '${branch}']],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],userRemoteConfigs: [[credentialsId: '9f98962f-1a82-4da1-8a0f-bc906e92d998',url: 'git@192.168.200.70:/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=dontkillmeWWWROOT=/usr/local/tomcat/webapps/ROOT[ -d /data/backup ] || mkdir -p /data/backupif [ -d $WWWROOT ];thenmv $WWWROOT /data/backup/tomcat-$(date +%F_%T)fiunzip ${WORKSPACE}/target/*.war -d $WWWROOTPID=$(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
git add *
git commit -m "java-流水線腳本"
git push -u origin master

在B-JAVA立即構建並測試


在tomcat服務器上查看進程並瀏覽器上查看測試結果
ss -antup | grep 8080 --->不添加內段話,流水線腳本默認殺掉tomcat服務


讓ssh支持流水線,需要安裝插件SSH Pipeline Steps



流水線ssh方式的腳本詳解
def remote = [:] #定義變量不需要改remote.name = 'test' #遠程主機的名字remote.host = 'test.domain.com' #遠程主機的IPremote.user = 'root' #遠程主機的用戶remote.password = 'password' #遠程主機的密碼remote.allowAnyHosts = true #照着超就可以stage('Remote SSH') { #階段名稱writeFile file: 'abc.sh', text: 'ls -lrt' #把后面的命令,讓如abc.sh腳本里sshScript remote: remote, script: "abc.sh" #把腳本分發自定義的主機}
在瀏覽器進入jenkins主用戶來添加新節點信息(有幾點節點就添加幾個)

流水線ssh方式的腳本內容(一個節點給多台發送SSH腳本)
node ("JAVA-slave1-192.168.200.104"){//def mvnHomedef remote = [:]stage('checkout') { // for display purposescheckout([$class: 'GitSCM', branches: [[name: '${branch}']],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],userRemoteConfigs: [[credentialsId: '9f98962f-1a82-4da1-8a0f-bc906e92d998',url: 'git@192.168.200.70:/home/git/repos/solo.git']]])}stage('maven build') {sh '/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'}stage('Remote ssh 200.104') {remote.name = 'test'remote.user = '192.168.200.104'remote.user = 'root'remote.password = 'linyaonie'remote.allowAnyHosts = truewriteFile file: '104.sh',text:'''echo "`hostname -I`"'''sshScript remote: remote,script: "104.sh"}stage('Remote ssh 200.xxx') {remote.name = 'test'remote.user = '192.168.200.xxx'remote.user = 'root'remote.password = 'linyaonie'remote.allowAnyHosts = truewriteFile file: 'xxx.sh',text:'''echo "`hostname -I`"'''sshScript remote: remote,script: "xxx.sh"}}
重新把新修過的內容添加到遠程倉庫並構建測試在查看logs日志的結果
git add *
git commit -m "測試SSH"
git push -u origin master
流水線項目發布多節點需要注意的事項
多節點流水線腳本內容(多個節點)
node ("JAVA-slave1-192.168.200.104"){//def mvnHomestage('checkout') { // for display purposescheckout([$class: 'GitSCM', branches: [[name: '${branch}']],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],userRemoteConfigs: [[credentialsId: '9f98962f-1a82-4da1-8a0f-bc906e92d998',url: 'git@192.168.200.70:/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=dontkillmeWWWROOT=/usr/local/tomcat/webapps/ROOT[ -d /data/backup ] || mkdir -p /data/backupif [ -d $WWWROOT ];thenmv $WWWROOT /data/backup/tomcat-$(date +%F_%T)fiunzip ${WORKSPACE}/target/*.war -d $WWWROOTPID=$(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'}}node ("JAVA-slave2-192.168.200.xxx"){//def mvnHomestage('checkout') { // for display purposescheckout([$class: 'GitSCM', branches: [[name: '${branch}']],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],userRemoteConfigs: [[credentialsId: '9f98962f-1a82-4da1-8a0f-bc906e92d998',url: 'git@192.168.200.70:/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=dontkillmeWWWROOT=/usr/local/tomcat/webapps/ROOT[ -d /data/backup ] || mkdir -p /data/backupif [ -d $WWWROOT ];thenmv $WWWROOT /data/backup/tomcat-$(date +%F_%T)fiunzip ${WORKSPACE}/target/*.war -d $WWWROOTPID=$(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'}}
假如是克隆的機器需要把hosts文件里的映射修改一下
在瀏覽器進入jenkins主用戶來添加新節點信息(有幾點節點就添加幾個)
重新把新修過的內容添加到遠程倉庫並構建測試在查看logs日志的結果
git add *
git commit -m "測試SSH"
git push -u origin master
生產環境網站項目發布思路

Pipeline流水線雲架構參考圖

