Files
zt-closet-manage-backend/.gitea/workflows/deploy.yaml
T
2026-09-12 10:40:06 +08:00

124 lines
4.1 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: 构建并部署
on:
push:
tags: ['v*']
workflow_dispatch:
concurrency:
group: deploy
cancel-in-progress: false
env:
REGISTRY: git.lzcwy.cn
IMAGE: git.lzcwy.cn/zhengchiliu/zt-closet-manage-backend
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 拉取代码
uses: actions/checkout@v4
- name: 确认 docker 可用
run: |
docker version --format 'Server: {{.Server.Version}}'
- name: 计算镜像标签
id: meta
run: |
case "$GITEA_REF" in
refs/tags/*) TAG="${GITEA_REF#refs/tags/}" ;;
*) TAG="sha-$(echo "$GITEA_SHA" | cut -c1-7)" ;;
esac
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "镜像标签: $TAG"
- name: 登录 Gitea 镜像仓库
env:
REGISTRY_USER: ${{ secrets.ZT_CLOSET_MANAGE_REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.ZT_CLOSET_MANAGE_REGISTRY_TOKEN }}
run: |
echo "$REGISTRY_TOKEN" | docker login "$REGISTRY" -u "$REGISTRY_USER" --password-stdin
- name: 构建并推送
run: |
# 生产机若是 ARM(如甲骨文 ARM 机),去掉下一行注释并改成 linux/arm64
# PLATFORM="--platform linux/arm64"
docker build \
--build-arg GOPROXY=https://goproxy.cn,direct \
-f scripts/dockerfile/Dockerfile \
-t "$IMAGE:${{ steps.meta.outputs.tag }}" \
-t "$IMAGE:latest" \
.
docker push "$IMAGE:${{ steps.meta.outputs.tag }}"
docker push "$IMAGE:latest"
- name: SSH 部署到生产机
env:
SSH_KEY: ${{ secrets.ZT_CLOSET_MANAGE_PROD_SSH_KEY }}
SSH_HOST: ${{ vars.ZT_CLOSET_MANAGE_PROD_SSH_HOST }}
SSH_USER: ${{ vars.ZT_CLOSET_MANAGE_PROD_SSH_USER }}
run: |
mkdir -p ~/.ssh && chmod 700 ~/.ssh
printf '%s\n' "$SSH_KEY" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
SSHOPT="-i ~/.ssh/deploy_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
ssh $SSHOPT "$SSH_USER@$SSH_HOST" 'bash -s' <<'REMOTE'
set -e
APP=zt-closet-manage-backend
IMAGE=git.lzcwy.cn/zhengchiliu/zt-closet-manage-backend
DIR=/opt/zt-closet-manage
mkdir -p "$DIR/configs" "$DIR/storage/logs"
# 容器内进程是 uid 10001,日志目录要给它写权限
chown -R 10001:10001 "$DIR/storage"
# 记住旧镜像,用于失败回滚
OLD_IMAGE=$(docker inspect -f '{{.Image}}' $APP 2>/dev/null || echo "")
docker pull $IMAGE:latest
docker rm -f $APP 2>/dev/null || true
docker run -d \
--name $APP \
--network host \
--restart unless-stopped \
-v $DIR/configs:/app/configs:ro \
-v $DIR/storage/logs:/app/storage/logs \
-e TZ=Asia/Shanghai \
--log-opt max-size=50m \
--log-opt max-file=5 \
$IMAGE:latest
sleep 5
# 健康检查端口须与生产 configs/config.yaml 的 Server.HttpPort 一致(当前 8081)
if (command -v curl >/dev/null && curl -fsS http://127.0.0.1:8081/ping) \
|| (command -v wget >/dev/null && wget -qO- http://127.0.0.1:8081/ping); then
echo " 健康检查通过"
docker image prune -f
else
echo " 健康检查失败,回滚"
docker logs --tail 50 $APP
docker rm -f $APP
if [ -n "$OLD_IMAGE" ]; then
docker run -d \
--name $APP \
--network host \
--restart unless-stopped \
-v $DIR/configs:/app/configs:ro \
-v $DIR/storage/logs:/app/storage/logs \
-e TZ=Asia/Shanghai \
--log-opt max-size=50m \
--log-opt max-file=5 \
"$OLD_IMAGE"
fi
exit 1
fi
REMOTE
- name: 部署结果
if: always()
run: echo "镜像 ${{ env.IMAGE }}:${{ steps.meta.outputs.tag }} 部署流程结束"