Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
I
install_sh
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Administrator
install_sh
Commits
3cbe2787
提交
3cbe2787
authored
10月 24, 2024
作者:
Administrator
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加新文件
上级
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
381 行增加
和
0 行删除
+381
-0
production_install.sh
production_install.sh
+381
-0
没有找到文件。
production_install.sh
0 → 100644
浏览文件 @
3cbe2787
#!/bin/bash
runprojects
=
"http://git.wkwork.xyz/tiktok/production-run.git"
projects
=(
# 项目名 项目仓库 项目保存目录
"server http://git.wkwork.xyz/tiktok/production-server.git /home/production-server"
"client http://git.wkwork.xyz/tiktok/production-client.git /home/production-client"
)
cd
/home
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
}
# 函数:解析项目信息
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
[@]
}
"
}
# 函数:检查并安装 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
}
# 函数:检查并安装 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
}
# 函数: 初始化脚本 检查环境
init_environment_check
(){
echo_content
"green"
"初始化脚本 检查环境..."
check_git
install_docker
project_name
=
$runprojects
pull_project
()
}
init_environment_check
# 函数:选择要操作的项目
select_project
()
{
local
project_names
=(
$(
get_project_names
)
)
# 判断项目数量
if
[
${#
project_names
[@]
}
-eq
1
]
;
then
selected_project
=
"
${
project_names
[0]
}
"
project_name
=
$(
get_project_info
"
${
projects
[0]
}
"
0
)
project_repo
=
$(
get_project_info
"
${
projects
[0]
}
"
1
)
project_dir
=
$(
get_project_info
"
${
projects
[0]
}
"
2
)
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_name
=
$(
get_project_info
"
${
projects
[0]
}
"
0
)
project_repo
=
$(
get_project_info
"
$project
"
1
)
project_dir
=
$(
get_project_info
"
$project
"
2
)
break
fi
done
break
else
echo_content
"red"
"无效的选择,请重新选择。"
fi
done
fi
}
# 函数:切换分支
set_branches
(){
# 获取当前分支
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'
)
#打印当前分支名称
echo_content
"yellow"
"当前分支为: '
$current_branch
'"
branch_count
=
$(
echo
"
$branches
"
|
wc
-l
)
if
[
"
$branch_count
"
-gt
1
]
;
then
echo_content
"yellow"
"如需更换分支请选择 (如果选择当前分支请按直接回车):"
PS3
=
"请输入分支对应的数字:"
# 显示分支列表并允许选择
select
branch
in
$branches
;
do
if
[
-z
"
$branch
"
]
;
then
# 如果按回车不选择,继续使用当前分支
echo_content
"yellow"
"继续使用当前分支:
$current_branch
"
branch
=
"
$current_branch
"
break
else
echo_content
"green"
"你选择了分支:
$branch
"
# 切换到选定分支
if
git show-ref
--verify
--quiet
"refs/heads/
$branch
"
;
then
git checkout
"
$branch
"
# 切换到本地分支
else
git checkout
-b
"
$branch
"
"origin/
$branch
"
# 从远程分支创建并切换
fi
break
fi
done
fi
}
# 函数:拉取项目代码
pull_project
()
{
echo_content
"green"
"
$project_name
项目本地未安装,开始拉取..."
# 检查凭据是否存在
if
[
-f
"
$CREDENTIALS_FILE
"
]
;
then
source
"
$CREDENTIALS_FILE
"
else
echo
"请输入 Git 用户名:"
read
-r
git_username
echo
"请输入 Git 密码:"
read
-s
git_password
# 询问是否保存凭据
read
-p
"是否保存凭据到
$CREDENTIALS_FILE
以便下次使用?(y/n): "
save_credentials
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
# 克隆私有仓库
echo_content
"green"
"克隆仓库..."
git clone
"https://
$git_username
:
$git_password
@
$project_repo
"
"
$project_dir
"
if
[
$?
-ne
0
]
;
then
echo_content
"red"
"克隆仓库失败,请检查仓库地址和凭据。"
exit
1
fi
# 进入项目目录
cd
"
$project_dir
"
||
exit
1
set_branches
}
update_project
()
{
cd
"
$project_dir
"
||
exit
1
set_branches
git pull origin
"
$current_branch
"
# 从当前分支拉取最新代码
if
[
$?
-eq
0
]
;
then
echo_content
"green"
"项目更新完成。"
else
echo_content
"red"
"更新失败。"
exit
1
fi
}
# 函数:检查项目是否已经存在
check_project
()
{
if
[
-d
"
$project_dir
"
]
;
then
update_project
else
pull_project
# 执行项目的初次拉取
fi
}
# 函数:启动或重启项目
start_project
()
{
cd
"
$project_dir
"
||
exit
1
echo_content
"green"
"是否要启动/重启项目?(y/n):"
read
-r
restart
if
[
"
$restart
"
=
"y"
]
;
then
if
[
-f
"./start.sh"
]
;
then
./start.sh
echo_content
"green"
"项目已启动/重启。"
else
echo_content
"red"
"未找到启动脚本。"
fi
fi
docker-compose up
-d
}
# 函数:卸载项目
uninstall_project
()
{
if
[
-d
"
$project_dir
"
]
;
then
echo_content
"yellow"
"你确定要卸载项目 '
$selected_project
' 吗?此操作将删除项目目录 '
$project_dir
' (y/n):"
read
-r
confirm_uninstall
if
[
"
$confirm_uninstall
"
=
"y"
]
;
then
echo_content
"green"
"正在卸载项目 '
$selected_project
'..."
rm
-rf
"
$project_dir
"
# 删除项目目录
if
[
$?
-eq
0
]
;
then
echo_content
"green"
"项目 '
$selected_project
' 已成功卸载。"
else
echo_content
"red"
"卸载失败。"
fi
else
echo_content
"yellow"
"卸载操作已取消。"
fi
else
echo_content
"red"
"项目目录不存在,无法卸载。"
fi
}
# 函数:检查项目是否已经存在
is_project_installed
()
{
local
project_dir
=
"
$1
"
if
[
-d
"
$project_dir
"
]
;
then
return
0
# 项目已安装
else
return
1
# 项目未安装
fi
}
# 函数:选择要执行的操作
select_operation
()
{
echo_content
"yellow"
"请选择要执行的操作:"
if
is_project_installed
"
$project_dir
"
;
then
# 如果项目已安装,显示“更新代码”和“重启项目”
PS3
=
"请输入操作对应的数字:"
select
operation
in
"更新代码"
"启动/重启"
"卸载"
;
do
case
$REPLY
in
1
)
echo_content
"green"
"你选择了操作: 更新代码"
break
;;
2
)
echo_content
"green"
"你选择了操作: 启动/重启"
break
;;
3
)
echo_content
"green"
"你选择了操作: 卸载项目"
break
;;
*
)
echo_content
"red"
"无效的选择,请输入 1 2 。"
;;
esac
done
else
# 如果项目未安装,直接执行安装操作
echo_content
"yellow"
"
$project_name
项目未安装,开始安装..."
operation
=
"安装"
perform_operation
select_operation
fi
}
# 函数:根据用户选择执行操作
perform_operation
()
{
if
[
"
$operation
"
==
"安装"
]
||
[
"
$operation
"
==
"更新代码"
]
;
then
check_project
# 执行安装或更新
start_project
elif
[
"
$operation
"
==
"启动/重启"
]
;
then
start_project
# 启动或重启项目
elif
[
"
$operation
"
==
"卸载"
]
;
then
uninstall_project
# 卸载
else
echo_content
"red"
"无效的操作。"
fi
}
# 入口函数:多项目部署
main
()
{
select_project
select_operation
perform_operation
echo_content
"red"
"脚本执行完毕结束"
}
# 调用入口函数
main
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论