环境准备

  • Git: 安装部署使用略。
  • Jenkins: 2.46.2版本安装部署略(修改jenkins执行用户为root,省得配置权限)
  • JDK: 安装部署略。
  • Maven: 安装部署略。
  • 服务器免密登陆

Jenkinsfile文件编写

node {
def mvnHome
def workspace = pwd()
stage('Preparation') { // for display purposes
// Get some code from a GitHub repository
git 'http://192.168.161.118:8080/git/demo.git'
// Get the Maven tool.
// ** NOTE: This 'M3' Maven tool must be configured
// ** in the global configuration.
mvnHome = tool 'M3'
}
stage('Build') {
// Run the maven build
if (isUnix()) {
sh "'${mvnHome}/bin/mvn' -Dmaven.test.failure.ignore clean package" } else {
bat(/"${mvnHome}\bin\mvn" -Dmaven.test.failure.ignore clean package/)
}
}
stage('Deploy') {
sh "'/scripts/deploy.sh' ${workspace} deploy"
}
}

Jenkinsfile文件就放在你自己的Git仓库的更目录! 如图:

在Jenkins中创建Pipeline项目

   如上3图,3步,jenkins的pipeline项目创建完成。

编写部署Shell脚本

#!/bin/bash
#集群IP列表,多个用空格分开
#NODE_LIST="192.168.161.118 192.168.161.117"
NODE_LIST="192.168.161.245"
#应用部署到的远程服务器目录
REMOTE_DIR="/home/project"
#需要部署的项目名称(需和maven的project名一样,多个用空格分开)
#NEED_DEPLOY_PROJECT="user-server user-mgr info-mgr"
NEED_DEPLOY_PROJECT="user-mgr"
# Date/Time Veriables
LOG_DATE='date "+%Y-%m-%d"'
LOG_TIME='date "+%H:%M:%S"'
CDATE=$(date "+%Y%m%d")
CTIME=$(date "+%H%M%S")
#Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/deploy/log"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
#Code Env
JAR_DIR="/deploy/jar"
CONFIG_DIR="/deploy/config"
LOCK_FILE="/tmp/deploy.lock"
usage(){
echo $"Usage: $0 [projectJarPath] [ deploy | rollback ]"
}
init() {
create_dir $SHELL_DIR;
create_dir $JAR_DIR;
create_dir $CONFIG_DIR;
}
create_dir() {
if [ ! -d $1 ]; then
mkdir -p $1
fi
}
shell_lock(){
touch ${LOCK_FILE}
}
shell_unlock(){
rm -f ${LOCK_FILE}
}
write_log(){
LOGINFO=$1
echo "`eval ${LOG_DATE}` `eval ${LOG_TIME}` : ${SHELL_NAME} : ${LOGINFO}"|tee -a ${SHELL_LOG}
}
#拷贝jenkins的工作空间构建的jar包到特定目录,备份,为以后回滚等等操作
copy_jar() {
TARGET_DIR=${JAR_DIR}/${CDATE}${CTIME}
write_log "Copy jenkins workspace jar file to ${TARGET_DIR}"
mkdir -p $TARGET_DIR
for project in $NEED_DEPLOY_PROJECT;do
mkdir -p $TARGET_DIR/${project}
find $1 -name ${project}*.jar -exec cp {} $TARGET_DIR/${project}/ \;
done
}
#拷贝应用的jar包到远程服务器
scp_jar(){
SOURCE_DIR=${JAR_DIR}/${CDATE}${CTIME}
write_log "Scp jar file to remote machine..."
for node in $NODE_LIST;do
scp -r ${SOURCE_DIR}/* $node:${REMOTE_DIR}
write_log "Scp to ${node} complete."
done
}
# 杀掉远程服务器上正在运行的项目
cluster_node_remove(){
write_log "Kill all runing project on the cluster..."
for project in $NEED_DEPLOY_PROJECT;do
for node in $NODE_LIST;do
pid=$(ssh $node "ps aux|grep ${project}|grep -v grep|awk '{print $2}'"|awk '{print $2}')
if [ ! -n "$pid" ]; then
write_log "${project} is not runing..."
else
ssh $node "kill -9 $pid"
write_log "Killed ${project} at ${node}..."
fi
done
done
}
#在远程服务器上启动项目
cluster_deploy(){
write_log "Up all project on the cluster..."
for project in $NEED_DEPLOY_PROJECT;do
for node in $NODE_LIST;do
ssh $node "cd ${REMOTE_DIR}/${project};nohup java -jar ${project}*.jar >/dev/null 2>&1 &"
write_log "Up ${project} on $node complete..."
done
done
}
#回滚(暂未实现)
rollback(){
echo rollback
}
#入口
main(){
if [ -f ${LOCK_FILE} ];then
write_log "Deploy is running" && exit;
fi
WORKSPACE=$1
DEPLOY_METHOD=$2
init;
case $DEPLOY_METHOD in
deploy)
shell_lock;
copy_jar $WORKSPACE;
scp_jar;
cluster_node_remove;
cluster_deploy;
shell_unlock;
;;
rollback)
shell_lock;
rollback;
shell_unlock;
;;
*)
usage;
esac
}
main $1 $2

PS: deploy.sh放在/scripts目录,和JenkinsFile中写的路径一致就好

运行看效果

 部署成功。。。  Jenkins的Console Output也都打印成功。  浏览器访问部署的应用也一切正常。完事!

PS:本实践适合小型集群部署。(经验有限,欢迎大神指导)

[转]利用Jenkins的Pipeline实现集群自动化部署SpringBoot项目的更多相关文章

  1. MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

    一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  2. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境

    写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...

  3. linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)

    之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这 ...

  4. Kafka集群安装部署、Kafka生产者、Kafka消费者

    Storm上游数据源之Kakfa 目标: 理解Storm消费的数据来源.理解JMS规范.理解Kafka核心组件.掌握Kakfa生产者API.掌握Kafka消费者API.对流式计算的生态环境有深入的了解 ...

  5. ProxySQL Cluster 高可用集群环境部署记录

    ProxySQL在早期版本若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数据并不能共通,在主实例上配置后,仍需要在备用节点上进行配置,对管理来说非常不方便.但是Proxy ...

  6. HBase 1.2.6 完全分布式集群安装部署详细过程

    Apache HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,是NoSQL数据库,基于Google Bigtable思想的开源实现,可在廉价的PC Server上搭建大规模结构化存 ...

  7. 1.Hadoop集群安装部署

    Hadoop集群安装部署 1.介绍 (1)架构模型 (2)使用工具 VMWARE cenos7 Xshell Xftp jdk-8u91-linux-x64.rpm hadoop-2.7.3.tar. ...

  8. vivo大规模 Kubernetes 集群自动化运维实践

    作者:vivo 互联网服务器团队-Zhang Rong 一.背景 随着vivo业务迁移到K8s的增长,我们需要将K8s部署到多个数据中心.如何高效.可靠的在数据中心管理多个大规模的K8s集群是我们面临 ...

  9. Storm集群安装部署步骤【详细版】

    作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2012/11/30/how ...

随机推荐

  1. c#基础之abstract和interface

    一.abstract abstract 的词义是“抽象”,它用来定义抽象类.抽象类不能被实例化只能被继承. 定义抽象类的格式如下:public abstract ClassName{……} 注意:只有 ...

  2. Prometheus监控学习笔记之Prometheus 2.0 告警规则介绍

    0x00 变化 Prometheus 2.0 已经发布一段时间了,从今天开始我将分几篇文章为大家介绍其中的一些变化. 此篇文章主要介绍 2.0 的告警规则声明的新写法. 从 1.x 到 2.0 规则声 ...

  3. 集束搜索beam search和贪心搜索greedy search

    贪心搜索(greedy search) 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search) 集束搜索可以认为是维特比算法的贪心形式,在维特 ...

  4. HTTP简单解析

    一.简介 HTTP是一种基于TCP/IP的超文本传输协议,用于从WWW服务器传输超文本到本地浏览器. HTTP是一种基于客户端/服务器(C/S架构)的无状态.无连接.媒体独立的传输协议. HTTP是一 ...

  5. Synchronized使用方法

    Synchronized是我们常用来维持线程安全时使用的一个关键字,内部通过monitor(监视器锁,由C++实现)来实现.而monitor本质又是依赖底层操作系统的mutex lock来实现.而操作 ...

  6. topcoder srm 625 div1

    problem1 link 假设第$i$种出现的次数为$n_{i}$,总个数为$m$,那么排列数为$T=\frac{m!}{\prod_{i=1}^{26}(n_{i}!)}$ 然后计算回文的个数,只 ...

  7. 关于layui富文本编辑器和form表单提交的问题

    今天下午因为要做一个富文本编辑器上传文件给后台,所以看了一下layui的富文本编辑器,折腾了半天,终于把这玩意搞定了. 首先需要先创建layui的富文本编辑器 <textarea id=&quo ...

  8. 华为Java机试题

    1.程序实现目标: 输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果. 程序要求:该字符串只包含小写字母,若其值加5后的字符值大于'z',将其转换成从a开始的字符. package co ...

  9. jQuery添加删除

    //代码 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <titl ...

  10. jQuery_$方法、属性、点击切换

    jQuery_$方法 1.$.each():遍历数组或对象中的数据 2.$.trim():去除字符串两边的空格 3.$.type(obj):得到数据的类型 4.$.isArray(obj):判断是否为 ...