记一次基于 PowerShell 的 Git 自动化部署 Java 多服务实践
前言
有这么一个自动化部署的需求,凑巧 git 还直接建立在测试服务器上,部署后可以直接在测试服务器上演示
步骤
建立 Git 仓库
与一般的 Git 部署一样,区别是需要添加 --bare
开关,这样可以建立一个裸库(只有 .git 文件夹内容无工作区)而不是一个完整的库。
mkdir test.git
cd test.git
git init --bare
此时可以将本地代码推送到该库中,推送完成后还需要建立一个部署专用的工作区,这里放在 deploy
文件夹中。
mkdir deploy
cd deploy
# clone 可以使用 file:/// 地址也可以使用绝对或相对路径
git clone ../source/test
cd test
git fetch
git checkout master
编写自动部署脚本
要在 Git 仓库中建立一个自动化部署脚本,这里用 PowerShell 脚本,因为其面向对象简单好用
# 获取父文件夹名
$directoryName = (Get-ChildItem)[0].Parent.Name;
# 获取时间
$time = [datetime]::Now.ToString("yyyyMMddHHmmss");
# 输出地址
$logFilePath = "../log/$directoryName-$time.log"
# 操作用户名
$userName = whoami
"正在使用$userName账户部署$directoryName" > $logFilePath
# git 更新
git fetch --all *>> $logFilePath
git checkout origin/master *>> $logFilePath
git reset --hard *>> $logFilePath
# maven 编译
bash mvnw clean *>> $logFilePath
bash mvnw compile *>> $logFilePath
bash mvnw package *>> $logFilePath
# 执行 jar 包,这里使用 Screen 运行
$jars=dir -r *.jar
$jars=$jars | where {$_.Parent.Name -match "target"}
$jars | foreach {
screen -S "$($_.BaseName)-master" -X stuff "^C";
screen -XS "$($_.BaseName)-master" quit;
screen -wipe;
screen -dmS "$($_.BaseName)-master";
screen -S "$($_.BaseName)-master" -X stuff "java -Dfile.encoding=utf8 -jar $($_.FullName)`n"
}
# 编译前端
cd ui
$logFilePath = "../" + $logFilePath
npm install *>> $logFilePath
npm run build:prod *>> $logFilePath
# 部署前端
rm -rf /wwwroot
mv dist /wwwroot
chmod -R 755 /wwwroot
chown -R nginx:nginx /wwwroot
service nginx restart *>> $logFilePath
"部署完成" *>> $logFilePath
添加 Git Hook 自动化脚本
在上一步新建的库中可以看到 hooks
文件夹,hooks 文件夹就是放置 Git 各种事件触发后执行的命令的地方,新建一个 post-receive
文件,并赋予权限 777,并写入下面的代码:
#!/usr/bin/bash
# 判断是否为远程仓库
IS_BARE=$(git rev-parse --is-bare-repository)
if [ -z "$IS_BARE" ]; then
echo >&2 "fatal: post-receive: IS_NOT_BARE $IS_BARE"
exit 1
fi
echo "正在进行自动部署"
unset GIT_DIR
# 部署路径
DeployPath="/root/deploy/test"
cd $DeployPath
# 执行部署脚本
pwsh ./Start-Deploy.ps1
echo "部署已完成"
至此再次提交新代码时可以自动化部署到前端了