当前位置:网站首页>Alibaba Cloud Toolkit —— 项目一键部署工具
Alibaba Cloud Toolkit —— 项目一键部署工具
2022-07-26 16:20:00 【涛歌依旧fly】
Alibaba Cloud Toolkit —— 项目一键部署工具
Alibaba Cloud Toolkit
介绍
简介
- Alibaba Cloud Toolkit(后文简称Cloud Toolkit)可以帮助开发者更高效地部署、测试、开发和诊断应用。
- Cloud Toolkit与主流IDE(IDEA, Eclipse等)及阿里云其他产品无缝集成,帮助您简化应用部署到服务器。
- 您还可以通过其内嵌的Arthas程序诊断、Terminal Shell终端和MySQL执行器等工具,简化应用开发、测试和诊断的过程。
原理
传统部署方式
在传统部署方式中,需要多个步骤才能完成应用的部署,并且需要在本地IDE、云产品控制台、Git/SVN、Maven/Gradle、镜像仓库、ECS、容器等多个界面间来回切换操作。

Cloud Toolkit部署方式
Cloud Toolkit将项目构建、SCP上传部署包、制作Docker Image、登录机器、推送至镜像仓库等多个步骤进行了集成和简化。

整合步骤
整合的思路是: 准备一台服务器, 以及一台含有IDE(IDEA)的设备. 通过整合 Cloud Toolkit, 实现将项目进行自动部署的功能实现
前提
- 云服务器 or Windows设备(me: 腾讯云服务器)
- IDE( me: IDEA)
- Maven项目 or Spring项目 (me: SpringBoot)
下载插件
- 在IntelliJ IDEA顶部菜单栏中选择File > Settings。
- 在Settings对话框的左侧导航栏中单击Plugins。
- 在Plugins区域单击Marketplace。
- 在搜索栏中输入
Alibaba Cloud Toolkit。 - 等待下载、安装完成后,单击Restart IDE。

ps: 基于其他方式安装Cloud Toolkit如下:
参数配置与使用
补充:
1. 如果使用Windows作为部署服务器
如果服务器是Windows, 需要我们安装OpenSSL, 步骤如下
2. 如果是多模块部署
如果当前工程为多模块工程,仅仅只需要发布其中的某一个子模块,应该怎么办呢? 可以添加两个mvn任务: 任务一、在父工程里执行"clean install",(默认会有) 任务二、在需要发布的子模块里执行"
clean package" (需要手动实现)
- 点击上面的号,选择“Run Maven Goal”:

- 在弹出的界面上,可以点击文件夹小图标来选择模块,在"Command line"上填写mvn goal:

- 选择执行模块后, 在Command line填写
clean package即可 详情见: 多模块 Maven 工程部署

3. 文件上传
- 在IntelliJ IDEA顶部菜单栏中选择Tools>Alibaba Cloud>Deploy to host, 选择Upload File, 页面图下图所示. 输入文件上传的相关参数即可完成上传

- 也可以点击idea下面的Alibaba Cloud View进行文件的快捷上传入口

填写相关参数进行文件上传

启动脚本
注意事项(一定要看)
在Windows环境下复制下面的脚本保存成文件, 然后入到linux环境中, 在每一行的最后会有^M 的字符, 会影响脚本的执行. 因此在授权脚本后需要检查脚本中有没有这种字符 或者我们可以直接在linux创建好文件后, 点击编辑在可输入文字的状态下将脚本复制进去
# 检查脚本中有没有^M的特殊字符
vim -b 脚本名称
# 如果有, 执行sed字符替换命令
sed -i 's/\r//g' 脚本名称
复制

脚本1
#!/bin/bash
#======这里可替换为jar包名字=======
APP_NAME=xxx-1.0.jar
#======根据实际情况修改参数=========
JVM="-server -Xms2g -Xmx2g -Xmn512m -XX:PermSize=128M -XX:MaxNewSize=128m -XX:MaxPermSize=25zh6m -Xss256k -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -Xloggc:/logs/xxx-server/GC/xxx-gc.log"
#APPFILE_PATH="-Dspring.config.location=/usr/local/config/application.properties"
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status|log|backup]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
#nohup java $JVM -jar $APPFILE_PATH $APP_NAME > /dev/null 2>&1
#后台启动jar包,且控制环境变量,根据实际情况修改吧。
#=======如果想使用上面的JVM参数, 则在nohup java添加 $JVM 即可============
nohup java -jar $APP_NAME --spring.profiles.active=prod > /dev/null 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#日志
log(){
# 输出实时日志
tail -n 100 -f /logs/fdc-server/fdc-server.log
}
#备份
backup(){
#根据需求自定义备份文件路径。
BACKUP_PATH=/usr/local/webapps/backup/xxx-server/
#获取当前时间作为备份文件名
BACKUP_DATE=`date +"%Y%m%d(%H:%M:%S)"`
echo 'backup file ->'$BACKUP_PATH$BACKUP_DATE'.jar'
#备份当前jar包
cp -r /usr/local/webapps/$APP_NAME $BACKUP_PATH$BACKUP_DATE'.jar'
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
"log")
log
;;
"backup")
backup
;;
*)
usage
;;
esac
脚本2
#!/bin/sh
# JAVA应用程序的名称
APP_NAME=uid-consumer
# JAVA应用程序端口号
SERVER_PORT=9999
# jar包存放路径
JAR_PATH='/app/uid-consumer'
# jar包名称
JAR_NAME=uid-consumer-1.1.0-SNAPSHOT.jar
# PID 代表是PID文件
JAR_PID=$JAR_NAME\.pid
# 日志输出文件
LOG_FILE=logs
# java虚拟机启动参数
JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:ParallelGCThreads=4 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"
# 根据实际情况来修改以上配置信息 ##################################
# 检查程序是否处于运行状态
is_exist() {
# 查询出应用服务的进程id,grep -v 是反向查询的意思,查找除了grep操作的run.jar的进程之外的所有进程
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
# [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
# [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
# 如果不存在返回0,存在返回1
if [ -z "${pid}" ]; then
return 0
else
return 1
fi
}
# ######### Shell脚本中$0、$?、$!、$$、$*、$#、[email protected]等的说明 #########
# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
# $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
# $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
# $- 显示shell使用的当前选项,与set命令功能相同
# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
# [email protected] 所有参数列表。如"[email protected]"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
# $# 添加到Shell的参数个数
# $0 Shell本身的文件名
# $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
# 服务启动方法
start() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is already running pid is ${pid}"
else
# jar服务启动脚本
nohup java $JAVA_OPTS -Xloggc:$LOG_FILE/gc/gclog.log -XX:HeapDumpPath=$LOG_FILE/gc/HeapDump.hprof -jar $JAR_PATH/$JAR_NAME >./$LOG_FILE/run.log 2>&1 &
echo $! > $JAR_PID
echo "start $APP_NAME successed pid is $! "
tail -1000f $LOG_FILE/run.log
fi
}
# 服务停止方法
stop() {
# is_exist
pidf=$(cat $JAR_PID)
# echo "$pidf"
echo "pid = $pidf begin kill $pidf"
kill $pidf
rm -rf $JAR_PID
sleep 2
# 判断服务进程是否存在
is_exist
if [ $? -eq "1" ]; then
echo "pid = $pid begin kill -9 $pid"
kill -9 $pid
sleep 2
echo "$APP_NAME process stopped!"
else
echo "$APP_NAME is not running!"
fi
}
# 服务运行状态查看方法
status() {
is_exist
if [ $? -eq "1" ]; then
echo "$APP_NAME is running,pid is ${pid}"
else
echo "$APP_NAME is not running!"
fi
}
# 重启服务方法
restart() {
# 调用服务停止命令
stop
# 调用服务启动命令
start
}
# 帮助说明,用于提示输入参数信息
usage() {
echo "Usage: sh run-service.sh [ start | stop | restart | status ]"
exit 1
}
###################################
# 读取脚本的第一个参数($1),进行判断
# 参数取值范围:{
start | stop | restart | status }
# 如参数不在指定范围之内,则打印帮助信息
###################################
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
status
;;
*)
usage
;;
esac
exit 0
边栏推荐
- Digital currency of quantitative transactions - merge transaction by transaction data through timestamp and direction (large order consolidation)
- ACL-IJCAI-SIGIR顶级会议论文报告会(AIS 2022)笔记3:对话和生成
- Selection of industrial serial port to WiFi port to Ethernet module of Internet of things
- kubernetes之ConfigMap
- A preliminary understanding of MVC and ECS design architectures
- Replicationcontroller and replicaset of kubernetes
- 该怎么写单元测试呢
- 最终一致性性分布式事务 TCC
- 研发效能的道与术 - 道篇
- Collection of open source expert opinions on trusted privacy computing framework "argot"
猜你喜欢

Guetzli simple to use

Difference between C event and delegation

TDengine 落地协鑫能科,数百亿数据压缩至 600GB

PAT甲级 1049 Counting Ones

2022年最新北京建筑安全员模拟题库及答案

PAT甲级1048 Find Coins

2022 test questions and answers for the latest national fire facility operator (senior fire facility operator)

Linux安装mysql8.0.29详细教程
![[RCTF2015]EasySQL](/img/68/328ee5cffc8b267b6b0f284eb8db2c.png)
[RCTF2015]EasySQL

可信隐私计算框架“隐语”开源专家观点集锦
随机推荐
初识OpenGL (2)编译着色器
Development daily summary (11): file upload function improvement: Chinese character detection and text content processing
Compiler analysis of clojure operation principle
技术风向标 | 云原生技术架构成熟度模型解读
Tao and art of R & D Efficiency - Tao chapter
Vs2017 opens the project and prompts the solution of migration
Re7:读论文 FLA/MLAC Learning to Predict Charges for Criminal Cases with Legal Basis
vlang捣鼓之路
A preliminary understanding of MVC and ECS design architectures
Summary of key knowledge of C language
2022牛客暑期多校训练营2(BDGHJKL)
Pat grade a 1049 counting ones
Re7: reading papers fla/mlac learning to predict charges for critical cases with legal basis
How to test the circle of friends (mind map)
Sword finger offer special assault edition day 11
该怎么写单元测试呢
MVC和ECS两种设计架构的初浅理解
[BJDCTF2020]Easy MD5
Botu PLC Sequential switch function block (SCL)
My SQL is OK. Why is it still so slow? MySQL locking rules