Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
I
install_sh
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Administrator
install_sh
Commits
b9f93ac6
提交
b9f93ac6
authored
11月 26, 2024
作者:
yoyoyo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1
上级
f1b157d3
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
462 行增加
和
0 行删除
+462
-0
mt4_run.sh
mt4_run.sh
+462
-0
没有找到文件。
mt4_run.sh
0 → 100644
浏览文件 @
b9f93ac6
#!/bin/bash
#bash <(curl -sSL https://git.wkwork.xyz/root/install_sh/raw/master/mt4_run.sh)
install_dir
=
"/mt4"
production_run_dir
=
"
$install_dir
/install_projects"
production_run_repo
=
"git.wkwork.xyz/root/install_projects.git"
production_install_dir
=
"
$production_run_dir
/mt4"
projects
=(
"server git.wkwork.xyz/root/mt4.git
$install_dir
/server"
)
if
[
!
-d
"
$install_dir
"
]
;
then
mkdir
-p
"
$install_dir
"
fi
cd
$install_dir
BRANCH_FILE_SUFFIX
=
".branch"
CREDENTIALS_FILE
=
"
$HOME
/.git_credentials"
# 输出函数
echo_content
()
{
ECHO_TYPE
=
"echo -e"
case
$1
in
"red"
)
${
ECHO_TYPE
}
"
\0
33[31m
$2
\0
33[0m"
;;
"green"
)
${
ECHO_TYPE
}
"
\0
33[32m
$2
\0
33[0m"
;;
"yellow"
)
${
ECHO_TYPE
}
"
\0
33[33m
$2
\0
33[0m"
;;
"blue"
)
${
ECHO_TYPE
}
"
\0
33[34m
$2
\0
33[0m"
;;
"purple"
)
${
ECHO_TYPE
}
"
\0
33[35m
$2
\0
33[0m"
;;
"skyBlue"
)
${
ECHO_TYPE
}
"
\0
33[36m
$2
\0
33[0m"
;;
"white"
)
${
ECHO_TYPE
}
"
\0
33[37m
$2
\0
33[0m"
;;
esac
}
# 函数:检查并安装 Git
check_git
()
{
echo_content
"green"
"检查并安装 Git..."
if
!
command
-v
git &> /dev/null
;
then
echo
"Git 未安装,正在安装 git..."
if
[
-f
/etc/debian_version
]
;
then
sudo
apt-get update
sudo
apt-get
install
-y
git
elif
[
-f
/etc/redhat-release
]
;
then
sudo
yum
install
-y
git
else
echo
"不支持的系统"
exit
1
fi
fi
}
check_unzip
(){
if
!
command
-v
unzip &> /dev/null
;
then
if
command
-v
apt &> /dev/null
;
then
sudo
apt update
sudo
apt
install
-y
unzip
elif
command
-v
yum &> /dev/null
;
then
sudo
yum
install
-y
unzip
fi
fi
}
# 函数:检查并安装 Docker
install_docker
()
{
echo_content
"green"
"检查并安装 Docker..."
if
!
[[
$(
docker
-v
2>/dev/null
)
]]
;
then
sh <
(
curl
-sL
https://get.docker.com
)
fi
if
!
[[
$(
docker
-v
2>/dev/null
)
]]
;
then
curl
-sSL
http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
fi
if
!
[[
$(
docker
-v
2>/dev/null
)
]]
;
then
curl
-sSL
https://get.daocloud.io/docker | sh
fi
#!/bin/bash
if
!
command
-v
docker-compose &> /dev/null
;
then
# 下载 docker-compose
sudo
curl
-L
"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-
$(
uname
-s
)
-
$(
uname
-m
)
"
-o
/usr/local/bin/docker-compose
# 设置执行权限
sudo chmod
+x /usr/local/bin/docker-compose
# 检查是否安装成功
if
!
command
-v
docker-compose &> /dev/null
;
then
echo
"docker-compose 安装失败。"
exit
1
fi
fi
}
# 函数:解析项目信息
get_project_info
()
{
local
project_info
=
"
$1
"
local
index
=
"
$2
"
IFS
=
' '
read
-r
-a
project_array
<<<
"
$project_info
"
echo
"
${
project_array
[
$index
]
}
"
}
# 函数:获取所有项目名称
get_project_names
(){
local
names
=()
for
project
in
"
${
projects
[@]
}
"
;
do
names+
=(
"
$(
get_project_info
"
$project
"
0
)
"
)
done
echo
"
${
names
[@]
}
"
}
set_branches
(){
repo_dir
=
$1
repo_name
=
$2
cd
"
$repo_dir
"
||
exit
1
# 获取当前分支
current_branch
=
$(
git branch
--show-current
)
if
[
-z
"
$current_branch
"
]
;
then
echo_content
"red"
"未能获取当前分支,可能项目没有被正确初始化为git仓库。"
exit
1
fi
# 获取所有远程分支
branches
=
$(
git branch
-r
|
sed
's/origin\///'
|
grep
-v
'HEAD'
)
#打印当前分支名称
branch_count
=
$(
echo
"
$branches
"
|
wc
-l
)
if
[
"
$branch_count
"
-gt
1
]
;
then
echo_content
"yellow"
"
$repo_name
项目:分支选择 (如继续使用 '
$current_branch
' 直接回车):"
# 显示分支列表
i
=
1
for
branch
in
$branches
;
do
echo
"
$i
)
$branch
"
i
=
$((
i
+
1
))
done
# 提示用户选择
read
-p
"请输入分支对应的数字 (回车保持当前分支:
$current_branch
): "
input
# 如果用户直接按回车,保持当前分支
if
[
-z
"
$input
"
]
;
then
echo_content
"yellow"
"继续使用当前分支:
$current_branch
"
branch
=
"
$current_branch
"
else
# 验证输入是否为有效的数字
if
[[
"
$input
"
=
~ ^[0-9]+
$
]]
&&
((
input
>=
1
&&
input <
=
branch_count
))
;
then
selected_branch
=
$(
echo
"
$branches
"
|
sed
-n
"
${
input
}
p"
| xargs
)
echo_content
"green"
"你选择了分支:
$selected_branch
"
# 切换到选定分支
if
git show-ref
--verify
--quiet
"refs/heads/
$selected_branch
"
;
then
git checkout
"
$selected_branch
"
# 切换到本地分支
else
git checkout
-b
"
$selected_branch
"
"origin/
$selected_branch
"
# 从远程分支创建并切换
fi
else
echo_content
"red"
"无效的输入,请重新运行脚本。"
exit
1
fi
fi
fi
}
updata_project
(){
repo_dir
=
$1
repo_name
=
$2
set_branches
$repo_dir
$repo_name
cd
"
$repo_dir
"
||
exit
1
# 检查工作区是否有未提交的更改
if
[[
-n
$(
git status
--porcelain
)
]]
;
then
git add
.
git commit
-m
"Auto-commit: 保存当前变动"
fi
CURRENT_BRANCH
=
$(
git rev-parse
--abbrev-ref
HEAD
)
# git pull origin "$CURRENT_BRANCH"
git pull
--rebase
-X
theirs origin
"
$CURRENT_BRANCH
"
if
[
$?
-ne
0
]
;
then
echo_content
"red"
"更新代码失败,请手动检查冲突。"
else
echo_content
"green"
"代码更新完成。"
fi
}
# 函数:拉取项目代码
pull_project
()
{
repo_url
=
$1
repo_dir
=
$2
repo_name
=
$3
# 检查凭据是否存在
if
[
-f
"
$CREDENTIALS_FILE
"
]
;
then
source
"
$CREDENTIALS_FILE
"
else
echo
"请输入 Git 用户名:"
read
-r
-p
"用户名: "
git_username
echo
"请输入 Git 密码:"
read
-s
-p
"密码: "
git_password
echo
# 换行
# 询问是否保存凭据
echo
"是否保存凭据到
$CREDENTIALS_FILE
以便下次使用?"
read
-p
"请选择(y/n): "
save_credentials
echo
# 换行
if
[
"
$save_credentials
"
=
"y"
]
;
then
echo
"git_username=
\"
$git_username
\"
"
>
"
$CREDENTIALS_FILE
"
echo
"git_password=
\"
$git_password
\"
"
>>
"
$CREDENTIALS_FILE
"
chmod
600
"
$CREDENTIALS_FILE
"
# 设置文件权限,仅用户可读写
fi
fi
# 克隆私有仓库
repo
=
"https://
$git_username
:
$git_password
@
$repo_url
"
echo_content
"green"
"克隆仓库
$repo
..."
git clone
$repo
"
$repo_dir
"
if
[
$?
-ne
0
]
;
then
rm
$CREDENTIALS_FILE
echo_content
"red"
"克隆仓库失败,请检查仓库地址和凭据"
pull_project
$repo_url
$repo_dir
$repo_name
fi
set_branches
$repo_dir
$repo_name
}
# 函数:卸载项目
uninstall_project
()
{
if
[
-d
"
$install_dir
"
]
;
then
echo_content
"yellow"
"你确定要卸载项目吗?此操作将删除项目目录 '
$install_dir
' (y/n):"
read
-r
confirm_uninstall
if
[
"
$confirm_uninstall
"
=
"y"
]
;
then
echo_content
"green"
"正在卸载项目..."
cd
$production_install_dir
docker-compose down
docker network
rm
production_mall_network
rm
-rf
"
$install_dir
"
# 删除项目目录
if
[
$?
-eq
0
]
;
then
echo_content
"green"
"项目已成功卸载。"
else
echo_content
"red"
"卸载失败。"
fi
else
echo_content
"yellow"
"卸载操作已取消。"
fi
else
echo_content
"red"
"项目目录不存在,无法卸载。"
fi
}
# 函数:启动或重启项目
start_project
()
{
cd
"
$production_install_dir
"
||
exit
1
echo_content
"green"
"是否要启动/重启 项目?(y/n):"
read
-r
restart
if
[
"
$restart
"
=
"y"
]
;
then
if
docker-compose ps |
grep
-q
"Up"
;
then
docker-compose restart mall-admin mall-api mall-data nginx mall-tools go-nginx myiframe
echo
"重启中 预计 60秒左右启动成功 ..."
sleep
60
else
docker-compose up
-d
echo
"第一次启动 预计 150 秒左右启动成功 ..."
sleep
100
docker-compose restart mall-admin mall-api mall-data
echo
"重启中 预计 60秒左右启动成功 ..."
sleep
60
fi
fi
}
# 函数:选择要更新的项目
select_project
()
{
local
project_names
=(
$(
get_project_names
)
)
# 判断项目数量
if
[
${#
project_names
[@]
}
-eq
1
]
;
then
selected_project
=
"
${
project_names
[0]
}
"
project_dir
=
$(
get_project_info
"
${
projects
[0]
}
"
2
)
project_name
=
$(
get_project_info
"
${
projects
[0]
}
"
0
)
else
echo_content
"yellow"
"
\n\n
"
echo_content
"yellow"
"请选择要更新的的项目
\n
"
# 自定义 PS3 提示符
PS3
=
"请输入项目对应的数字:"
select
selected_project
in
"
${
project_names
[@]
}
"
;
do
if
[
-n
"
$selected_project
"
]
;
then
for
project
in
"
${
projects
[@]
}
"
;
do
if
[
"
$(
get_project_info
"
$project
"
0
)
"
=
"
$selected_project
"
]
;
then
project_dir
=
$(
get_project_info
"
$project
"
2
)
project_name
=
$(
get_project_info
"
$project
"
0
)
break
2
fi
done
else
echo_content
"red"
"无效的选择,请重新选择。"
continue
fi
done
fi
updata_project
"
$project_dir
"
"
$project_name
"
}
# 函数:选择要执行的操作
select_operation
()
{
echo_content
"yellow"
"请选择要执行的操作:"
PS3
=
"请输入操作对应的数字:"
select
operation
in
"更新项目"
"启动/重启"
"卸载"
"退出"
;
do
case
$REPLY
in
1
)
echo_content
"green"
"你选择了操作: 更新项目"
select_project
start_project
break
;;
2
)
echo_content
"green"
"你选择了操作: (启动/重启)"
start_project
break
;;
3
)
echo_content
"green"
"你选择了操作: 卸载"
uninstall_project
exit
;;
4
)
echo_content
"green"
"你选择了操作: 退出"
exit
;;
*
)
echo_content
"red"
"无效的选择"
continue
;;
esac
done
}
# 函数: 初始化脚本 检查环境
init_environment_check
(){
if
[
!
-d
"
$production_run_dir
/.git"
]
;
then
# 运行相关逻辑,找到匹配项后可立即处理
echo_content
"green"
"拉取项目: production_run"
echo_content
"green"
"项目仓库:
$production_run_repo
"
echo_content
"green"
"项目目录:
$production_run_dir
"
pull_project
"
$production_run_repo
"
"
$production_run_dir
"
"production_run"
else
echo_content
"green"
"更新项目: production_run"
echo_content
"green"
"项目仓库:
$production_run_repo
"
echo_content
"green"
"项目目录:
$production_run_dir
"
updata_project
"
$production_run_dir
"
"production_run"
fi
get_project_names
for
project
in
"
${
projects
[@]
}
"
;
do
# 获取项目信息
project_name
=
$(
get_project_info
"
$project
"
0
)
project_repo
=
$(
get_project_info
"
$project
"
1
)
project_dir
=
$(
get_project_info
"
$project
"
2
)
# 检查项目目录中是否存在 .git 目录(即项目是否已拉取)
if
[
!
-d
"
$project_dir
/.git"
]
;
then
# 如果项目未被拉取,执行拉取操作
echo_content
"green"
"拉取项目:
$project_name
"
echo_content
"green"
"项目仓库:
$project_repo
"
echo_content
"green"
"项目目录:
$project_dir
"
# 调用 pull_project 函数进行项目拉取
pull_project
"
$project_repo
"
"
$project_dir
"
"
$project_name
"
fi
done
}
main
(){
if
[
"
$(
id
-u
)
"
-ne
0
]
;
then
echo_content
"red"
"请以 root 权限运行此脚本。"
exit
1
fi
echo_content
"green"
"安装目录:
$install_dir
"
echo_content
"green"
"初始化脚本 检查环境..."
check_git
check_unzip
install_docker
init_environment_check
select_operation
}
main
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论