[转]利用Jenkins的Pipeline实现集群自动化部署SpringBoot项目
环境准备
- 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项目的更多相关文章
- MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现
一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境
写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...
- linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)
之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这 ...
- Kafka集群安装部署、Kafka生产者、Kafka消费者
Storm上游数据源之Kakfa 目标: 理解Storm消费的数据来源.理解JMS规范.理解Kafka核心组件.掌握Kakfa生产者API.掌握Kafka消费者API.对流式计算的生态环境有深入的了解 ...
- ProxySQL Cluster 高可用集群环境部署记录
ProxySQL在早期版本若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数据并不能共通,在主实例上配置后,仍需要在备用节点上进行配置,对管理来说非常不方便.但是Proxy ...
- HBase 1.2.6 完全分布式集群安装部署详细过程
Apache HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,是NoSQL数据库,基于Google Bigtable思想的开源实现,可在廉价的PC Server上搭建大规模结构化存 ...
- 1.Hadoop集群安装部署
Hadoop集群安装部署 1.介绍 (1)架构模型 (2)使用工具 VMWARE cenos7 Xshell Xftp jdk-8u91-linux-x64.rpm hadoop-2.7.3.tar. ...
- vivo大规模 Kubernetes 集群自动化运维实践
作者:vivo 互联网服务器团队-Zhang Rong 一.背景 随着vivo业务迁移到K8s的增长,我们需要将K8s部署到多个数据中心.如何高效.可靠的在数据中心管理多个大规模的K8s集群是我们面临 ...
- Storm集群安装部署步骤【详细版】
作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2012/11/30/how ...
随机推荐
- datagridview 添加数据库数据
private void btnadd_Click(object sender, EventArgs e) { string str = @"Data Source=(localdb)\MS ...
- MySQL ERROR 1698 (28000): Access denied for user 'root'@'localhost'
今天在安装MySQL的过程中竟然没有让我输入密码,登录的时候也不需要密码就能进入,这让我很困惑. 进了数据库就设置密码,用了各种方式都不行. 虽然我这数据库没啥东西但也不能没有密码就裸奔啊,有点丢人是 ...
- KVO的使用二:常用方法及小技巧
(文章及代码接上一篇) options详解: KVO的注册方法中有一个options枚举,用来确定观察者的接收消息方法接收的信息,那么具体有什么关联呢?下面通过一段代码来验证是如何关联的.依次选择op ...
- 一个基于nuxt的基础架子,支持aixos,sass,es6,elementUI
nuxt官网:Nuxt.js docs github: 项目地址 项目版本说明 package 版本号 "babel-cli" "^6.26.0" " ...
- NOIP 2018 划水记
(此处不应有目录) (本来想咕掉这篇游记) Day -1 今天信心题,这个毒瘤出题人怎么出了一堆垃圾题(smallfat批判这个垃圾题). T2,T3是送分题.T1考了个noip根本不会考得类欧几里德 ...
- 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存(argparse详细解释)
将下面文档存为load_display_save.py #-*- coding:utf-8 -*- ap = argparse.ArgumentParser() ap.add_argument(&qu ...
- (void) (&_min1 == &_min2);【转】
本文转载自:https://blog.csdn.net/xiaofeng_yan/article/details/5248693 偶然在<./linux/include/linux/kernel ...
- spring mvc 简单的文件上传与下载
上传文件有很多种方法,这里主要讲解的是spring mvc内提供的文件上传 前提使用:spring mvc 在这个之前我们需要把环境给配置好 1:springmvc的XML配置文件加上这一段就即可, ...
- 分页查询最好加排序(order by)
昨天,与外部化系统对接时,发现有一个数据一直咩有集成到,双方各自排查了自己系统的代码,都觉得逻辑非常简单,无法就是一个分页查询而已. 问题就出在这个分页查询上. 为了说明当时问题发生的情景,我模拟了一 ...
- Android之人脸识别
**前言** 人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运用,例如刷脸打卡.刷脸App,身份识别,人脸门禁等等.当前的人脸识别技术分为WEBAPI和SDK调用两种法方式 ...