项目案例之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流水线项目

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

[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连接的账户和密码

6.5.2 配置slave从节点

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。

进行分布式构建测试

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插件

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 进行分布式构建测试



6.8 进行流水线的多Slave从节点分布式构建测试

添加Slave从节点,并进行多节点构建

#修改流水线脚本,并提交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'''
}
}

7.生产环境网站项目发布思路

项目案例之Pipeline流水线发布JAVA项目(三)的更多相关文章

  1. 项目案例之Pipeline流水线及流水线发布PHP项目(二)

    项目案例之Pipeline流水线及流水线发布PHP项目(二) 链接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ 提取码:z7gj 复制这段内容后打开 ...

  2. Centos 如何 发布Java项目

    在发布Java项目之前,我们先要安装如下软件 一.Windows 1.winscp(Windows到centos上传下载) 2.PuTTY(Windows访问centos服务器) 3.Navicat客 ...

  3. 【linux】【jenkins】自动化运维四 整合gitlab、docker发布java项目

    jenkins发布java项目 过程参考发布vue项目.https://www.cnblogs.com/jxd283465/p/11543431.html 大同小异. vue建立的是Freestyle ...

  4. MyEclipse2015 javaweb项目从svn检出后变成java项目,clean之后不能编译,解决办法是

     javaweb项目从svn检出后变成java项目,解决办法是:1.项目右键–properties–Project Facets,勾选上Dynamic Web Module .Java 两个复选框.点 ...

  5. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  6. 从零开始部署发布Java项目到服务器的Docker中

    本以为很简单,由于没用过docker和java,本文将会阐述一路遇到的拦路虎. 首先,写好Java项目,本地跑通. 可能会遇到的问题: 1.jar包正常运行,war包404: 如何打包很多教程都有介绍 ...

  7. 【图文】 使用ant编译和发布java项目

        开发JavaEE项目经常会碰到修改代码后,项目没有重新编译的问题.老大给指明了一个解决办法:用ant编译项目. ant是apache基金会下的一个项目,是基于Java语言的构建工具.      ...

  8. 解决eclipse“copy项目重命名后重新发布,项目名在地址栏仍然是原来的项目名”的问题

    任务描述:复制项目spring_user并重命名为spring_user_test 一.通过按F2和以下方式可以修改目标项目在workspace的名字 点击项目右键选择properties,输入关键字 ...

  9. Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目

    一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...

随机推荐

  1. elasticsearch 关联单词查询以及Shingles

    Shingle Token Filter A token filter of type shingle that constructs shingles (token n-grams) from a ...

  2. dotNET面试(一)

    1.列举ASP.NET 页面之间传递值的几种方式. 1).使用QueryString, 如....?id=1; response. Redirect().... 2).使用Session变量 3).使 ...

  3. Codeforces 669E cdq分治

    题意:你需要维护一个multiset,支持以下操作: 1:在某个时间点向multiset插入一个数. 2:在某个时间点在multiset中删除一个数. 3:在某个时间点查询multiset的某个数的个 ...

  4. 前端学习(二十六)移动端s(笔记)

    ===================================================弹性布局rem布局---------------------------------------- ...

  5. 十、设计模式之代理(Proxy)模式

    什么是代理模式 代理模式是对象的结构模式,为其他对象提供一种对象以控制对这个对象的访问. 代理模式的结构图如下:(源自大话设计模式)   Subject:定义了RealSubject和Proxy的公共 ...

  6. deep features for text spotting 在linux,windows上使用

    做文本检测这个方向的同学应该都知道 deep features for text spotting 这篇ECCV14的文章. 用的是Matconvnet这个是深度学习框架来做文本检测,同时他还提供了代 ...

  7. [转]C# CancellationTokenSource 终止线程

    我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationT ...

  8. ubuntu安装samba

    1,  sudo apt-get install samba sudo apt-get install smbclient 2,  vi /etc/samba/smb.conf 在最后加字段(为可读可 ...

  9. MariaDB 安装

    MariaDB的所有下载都位于官方MariaDB基金会网站的下载部分. 单击所需版本的链接,并显示多个操作系统,体系结构和安装文件类型的下载列表. 在LINUX / UNIX上安装 如果你熟悉Linu ...

  10. 【Guava】Guava Cache用法

    背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁.但是由于受限于硬盘IO的性能或者远程网络 ...