前提
在linux上利用git clone出来的工程进行版本代码同步。如下图:
这是一个被git管控起来的工程。
发版步骤
当后端代码更新之后,按照如下步骤进行操作,可以将最新代码逻辑部署到服务器
1. git pull
拉最新代码
2. 切换到 dart_frog_server,并且执行 npx prisma generate
它的作用是,构建符合当前平台特有的的数据库查询引擎类:
3. 执行 dart_frog build生成可执行文件
4. 修改上一步build中的dockerfile文件
将最后的这么几行修改一下,
这是原文:
# Build minimal serving image from AOT-compiled `/server` and required system
# libraries and configuration files stored in `/runtime/` from the build stage.
FROM scratch
COPY --from=build /runtime/ /
COPY --from=build /app/bin/server /app/bin/
# Start server.
CMD ["/app/bin/server"]
这是修改之后:
# # Build minimal serving image from AOT-compiled `/server` and required system
# # libraries and configuration files stored in `/runtime/` from the build stage.
# FROM scratch
# COPY --from=build /runtime/ /
# COPY --from=build /app/bin/server /app/bin/
# Start server.
CMD ["bin/server"]
这是prisma官方的bug
5. 创建/更新 docker镜像
记得先切换到 build目录下:
执行 docker build . -t dart-frog-app
6. 启动docker服务
docker run -i -t -p 8080:8080 dart-frog-app
如果8080端口被占用的话,使用其他端口。
或者找出谁在占用,将它stop。
docker ps , docker stop [进程id]
进一步优化
像是这一整套流程,应该是可以使用 sh脚本来编写逻辑,然后直接执行脚本。后面再研究。
我希望它的整体流程是:
- 通过git clone或者pull 指定github上的仓库的指定分支
- 执行 npx prisma generate 同步数据库引擎类
- 执行 dart_frog build 生成build目录
- 修改 build目录中的 dockerfile文件
- 生成新的docker镜像 docker build . -t dart-frog-app
- 按照名称停止docker服务
- 启动刚刚创建的 docker服务
写了个基本的git拉取远程仓库的脚本,但是执行时发现存在如下问题:
-bash: ./backend.sh: /bin/bash^M: bad interpreter: No such file or director
查了一下,发现我是从win上将脚本拷贝到linux上,两个系统的换行符貌似不太一样。所以拷贝过去之后必须用如下命令转化一下。
sed -i 's/\r$//' xxx.sh
目前脚本原文如下:
#!/bin/bash
my_echo() {
echo " "
echo " "
echo " "
echo "[MY_LOG] $1"
}
REPO_DIR="/dartBackend/sh_Test/gitRoot"
BRANCH="master"
GIT_URL="git@github.com:13217300237/dart_frog_server.git"
# Extracting repository name from Git URL
REPO_NAME=$(basename -s .git $GIT_URL)
if [ -d "$REPO_DIR/$REPO_NAME" ]; then
my_echo " ----> 本地工程已存在,直接拉取..."
cd "$REPO_DIR/$REPO_NAME"
git pull origin $BRANCH
else
my_echo " ----> 首次克隆工程"
git clone -b $BRANCH $GIT_URL "$REPO_DIR/$REPO_NAME"
cd "$REPO_DIR/$REPO_NAME"
fi
my_echo " ----> 执行 npx prisma generate"
# 生成引擎类
npx prisma generate
# 先删除该目录
my_echo " ----> 删除 build 目录"
rm -r ./build
# 生成可执行目录
my_echo " ----> 生成 新的 build 目录"
dart_frog build
# 将docker文件进行修改
# 文件路径
FILE_PATH="./build/Dockerfile"
my_echo " ----> 更正 $FILE_PATH 的内容"
# 使用 sed 命令修改指定行的内容
sed -i '25,27d; s/CMD \[\"\/app\/bin\/server\"\]/CMD \[\"bin\/server\"\]/' "$FILE_PATH"
# 生成新的docker镜像
IMAGE_NAME="dart-frog-app"
CONTAINER_NAME="huasihuaiyi_server"
my_echo " ----> 停止并删除现有docker容器"
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME
my_echo " ----> 生成新的docker镜像"
cd ./build
docker build . -t $IMAGE_NAME
my_echo " ----> 启动新的docker容器"
docker run --name $CONTAINER_NAME -p 8080:8080 $IMAGE_NAME
my_echo "部署成功....."
目前在自测中。等有了更好的版本再更新上来。