Files
one-pipe-system/.gitea/workflows/deploy.yaml
break cb1561a317
Some checks failed
构建并部署前端到测试环境 / build-and-deploy (push) Failing after 14s
fix: 修复前端部署资源保护
2026-09-20 14:42:14 +08:00

140 lines
4.9 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:
branches:
- iteration/august
- dev
- test
# 如果不再需要 main 分支触发构建,可以把下面这行删掉;
# 如果只是想保留构建(不部署),可以留着,反正部署条件已经只认 iteration/august
- main
concurrency:
group: one-pipe-system-${{ github.ref }}
cancel-in-progress: true
env:
REGISTRY: registry.boss160.cn
IMAGE_NAME: registry.boss160.cn/junhong/cmp-admin-web
DEPLOY_DIR: /opt/junhong_cmp_web
NODE_OPTIONS: --max-old-space-size=1536
MIN_AVAILABLE_MEMORY_MB: 2800
MIN_AVAILABLE_DISK_GB: 12
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 检出代码
run: |
export PATH="$HOME/.nix-profile/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
export GIT_SSL_NO_VERIFY=1
git clone https://git.boss160.cn/luo/one-pipe-system.git .
git checkout ${{ github.sha }}
- name: 设置镜像标签
id: tag
run: |
if [ "${{ github.ref }}" = "refs/heads/iteration/august" ]; then
echo "tag=latest" >> $GITHUB_OUTPUT
elif [ "${{ github.ref }}" = "refs/heads/dev" ]; then
echo "tag=dev" >> $GITHUB_OUTPUT
elif [ "${{ github.ref }}" = "refs/heads/test" ]; then
echo "tag=test" >> $GITHUB_OUTPUT
else
echo "tag=unknown" >> $GITHUB_OUTPUT
fi
- name: 登录 Docker Registry
run: |
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login "${{ env.REGISTRY }}" --username "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
- name: 构建前端镜像
run: |
command -v flock >/dev/null || {
echo "服务器缺少 flock,无法保证构建互斥"
exit 1
}
exec 9>/tmp/one-pipe-system-build.lock
if ! flock -n 9; then
echo "已有 one-pipe-system 构建正在运行,本次任务拒绝并发构建"
exit 1
fi
AVAILABLE_MEMORY_MB=$(awk '/MemAvailable:/ { printf "%d", $2 / 1024 }' /proc/meminfo)
DOCKER_ROOT_DIR=$(docker info --format '{{.DockerRootDir}}')
AVAILABLE_DISK_GB=$(df -Pk "$DOCKER_ROOT_DIR" | awk 'NR == 2 { printf "%d", $4 / 1024 / 1024 }')
echo "构建前可用内存: ${AVAILABLE_MEMORY_MB} MiB"
echo "Docker 所在磁盘可用空间: ${AVAILABLE_DISK_GB} GiB"
if [ "$AVAILABLE_MEMORY_MB" -lt "${{ env.MIN_AVAILABLE_MEMORY_MB }}" ]; then
echo "可用内存不足,拒绝启动前端构建,避免测试服务器失去响应"
exit 1
fi
if [ "$AVAILABLE_DISK_GB" -lt "${{ env.MIN_AVAILABLE_DISK_GB }}" ]; then
echo "Docker 所在磁盘空间不足,拒绝启动前端构建"
exit 1
fi
docker build --build-arg NODE_OPTIONS="${{ env.NODE_OPTIONS }}" -t ${{ env.IMAGE_NAME }}:${{ github.sha }} .
docker tag ${{ env.IMAGE_NAME }}:${{ github.sha }} ${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.tag }}
- name: 推送镜像到 Registry
run: |
docker push ${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.tag }}
docker push ${{ env.IMAGE_NAME }}:${{ github.sha }}
- name: 部署到本地(仅 iteration/august 分支)
if: github.ref == 'refs/heads/iteration/august'
run: |
# 确保部署目录存在
mkdir -p ${{ env.DEPLOY_DIR }}
echo "当前工作目录: $(pwd)"
echo "当前目录内容:"
ls -la
# 更新 docker-compose.prod.yml
echo "更新部署配置文件..."
cp -v docker-compose.prod.yml ${{ env.DEPLOY_DIR }}/
cd ${{ env.DEPLOY_DIR }}
echo "拉取最新镜像..."
IMAGE_TAG=${{ github.sha }} docker compose -f docker-compose.prod.yml pull
echo "重启服务..."
IMAGE_TAG=${{ github.sha }} docker compose -f docker-compose.prod.yml up -d
echo "等待服务健康检查通过..."
for i in $(seq 1 30); do
WEB_HEALTH=$(docker inspect junhong-cmp-web --format='{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' 2>/dev/null || true)
if [ "$WEB_HEALTH" = "healthy" ]; then
break
fi
if [ "$i" -eq 30 ]; then
echo "前端服务在等待窗口内未恢复健康"
docker compose -f docker-compose.prod.yml logs web --tail=100
exit 1
fi
sleep 2
done
echo "部署完成!"
IMAGE_TAG=${{ github.sha }} docker compose -f docker-compose.prod.yml ps
- name: 构建结果通知
if: always()
run: |
if [ "${{ job.status }}" = "success" ]; then
echo "构建成功: ${{ steps.tag.outputs.tag }}"
echo "镜像标签: ${{ github.sha }}"
else
echo "构建失败"
fi