项目案例之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. console.log的另一种用法

    // console.log用法 var foo, bar; console.log(`foo's type: ${foo}`, `bar's type: ${bar}`); 输出:

  2. PHP 接口签名验证

    目录 概览 常用验证 单向散列加密 对称加密 非对称加密 密钥安全管理 接口调试工具 在线接口文档 扩展 小结 概览 工作中,我们时刻都会和接口打交道,有的是调取他人的接口,有的是为他人提供接口,在这 ...

  3. 第6篇如何访问pod

        一.通过 Service 访问 Pod: 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 con ...

  4. solrconfig.xml主要配置项

    solrconfig.xml中的配置项主要分以下几大块: 1.依赖的lucene版本配置,这决定了你创建的Lucene索引结构,因为Lucene各版本之间的索引结构并不是完全兼容的,这个需要引起你的注 ...

  5. Oracle查询用户所有表

    https://blog.csdn.net/wssiqi/article/details/44617197 Oracle查询用户所有表   下面为您介绍的语句用于实现Oracle查询用户所有表,如果您 ...

  6. Charles IOS https抓包

    步骤 1.下载charles: https://www.charlesproxy.com/download/ 只有一个30天试用版,每次打开只能30分钟,如果想时间长点,就找破解版或者买个licenc ...

  7. CSP2019赛前小复习:

    虽然觉得复习也没有什么用,还不吃好睡好,保持好心情. SA: 坑就那几个. \(s[0]=s[n+1]=-1\). 和\(rank\)交换的\(tp\)数组的\(tp[n+1]=0\). 一般加上这两 ...

  8. 探索Redis设计与实现15:Redis分布式锁进化史

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  9. C++ Compiling… Error spawning cl.exe

    转自VC错误:http://www.vcerror.com/?p=500 解决方法: 方法(一): 启动VC时不要用图形界面,通过在命令提示符下输入:Msdev /useenv运行(注意啦/前面有个空 ...

  10. spss乱码问题解决

    spss乱码问题解决 方法1:网友kuangsir6提供 选择字体为:DFKai-SB 格式(我并没有找到这个格式) 方法是 SPSS(PASW)---Edit---Options---Viewer- ...