feat: 添加 Gitea Actions 自动部署功能
Some checks failed
Deploy BillAI / Deploy to Production (push) Failing after 0s
Some checks failed
Deploy BillAI / Deploy to Production (push) Failing after 0s
This commit is contained in:
67
.gitea/workflows/deploy.yaml
Normal file
67
.gitea/workflows/deploy.yaml
Normal file
@@ -0,0 +1,67 @@
|
||||
# BillAI 自动部署工作流
|
||||
# 当 master 分支有 push 时自动触发部署
|
||||
|
||||
name: Deploy BillAI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Deploy to Production
|
||||
runs-on: self-hosted
|
||||
steps:
|
||||
- name: Checkout code
|
||||
run: |
|
||||
echo "=== 拉取最新代码 ==="
|
||||
cd ${{ vars.DEPLOY_PATH }}
|
||||
git fetch origin master
|
||||
git reset --hard origin/master
|
||||
echo "当前版本: $(git log -1 --format='%h %s')"
|
||||
|
||||
- name: Build and deploy
|
||||
run: |
|
||||
echo "=== 构建并部署服务 ==="
|
||||
cd ${{ vars.DEPLOY_PATH }}
|
||||
docker compose up -d --build --remove-orphans
|
||||
|
||||
- name: Cleanup
|
||||
run: |
|
||||
echo "=== 清理旧镜像 ==="
|
||||
docker image prune -f
|
||||
|
||||
- name: Health check
|
||||
run: |
|
||||
echo "=== 健康检查 ==="
|
||||
echo "等待服务启动..."
|
||||
sleep 15
|
||||
|
||||
# 通过 Docker 健康检查状态判断(不依赖端口暴露)
|
||||
check_container() {
|
||||
local name=$1
|
||||
local container=$2
|
||||
local status=$(docker inspect --format='{{.State.Health.Status}}' "$container" 2>/dev/null)
|
||||
if [ "$status" = "healthy" ]; then
|
||||
echo "✓ $name 服务正常"
|
||||
return 0
|
||||
else
|
||||
echo "✗ $name 服务异常 (状态: $status)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
FAILED=0
|
||||
check_container "Web" "billai-web" || FAILED=1
|
||||
check_container "Server" "billai-server" || FAILED=1
|
||||
check_container "Analyzer" "billai-analyzer" || FAILED=1
|
||||
check_container "MongoDB" "billai-mongodb" || FAILED=1
|
||||
|
||||
if [ $FAILED -eq 0 ]; then
|
||||
echo "=== 部署成功 ==="
|
||||
else
|
||||
echo "=== 部署失败:部分服务异常 ==="
|
||||
docker compose ps
|
||||
exit 1
|
||||
fi
|
||||
62
deploy.sh
Normal file
62
deploy.sh
Normal file
@@ -0,0 +1,62 @@
|
||||
#!/bin/bash
|
||||
# BillAI 部署脚本
|
||||
# 用于手动部署或 Gitea Actions 自动部署
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${GREEN}=== BillAI 部署开始 ===${NC}"
|
||||
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
|
||||
# 获取脚本所在目录
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
echo -e "\n${YELLOW}[1/4] 拉取最新代码${NC}"
|
||||
git fetch origin master
|
||||
git reset --hard origin/master
|
||||
echo "当前版本: $(git log -1 --format='%h %s')"
|
||||
|
||||
echo -e "\n${YELLOW}[2/4] 构建并部署服务${NC}"
|
||||
docker compose up -d --build --remove-orphans
|
||||
|
||||
echo -e "\n${YELLOW}[3/4] 清理旧镜像${NC}"
|
||||
docker image prune -f
|
||||
|
||||
echo -e "\n${YELLOW}[4/4] 健康检查${NC}"
|
||||
echo "等待服务启动..."
|
||||
sleep 15
|
||||
|
||||
# 检查服务状态(通过 Docker 健康检查状态)
|
||||
check_service() {
|
||||
local name=$1
|
||||
local container=$2
|
||||
local status=$(docker inspect --format='{{.State.Health.Status}}' "$container" 2>/dev/null)
|
||||
if [ "$status" = "healthy" ]; then
|
||||
echo -e " ${GREEN}✓${NC} $name 服务正常"
|
||||
return 0
|
||||
else
|
||||
echo -e " ${RED}✗${NC} $name 服务异常 (状态: $status)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
FAILED=0
|
||||
check_service "Web" "billai-web" || FAILED=1
|
||||
check_service "Server" "billai-server" || FAILED=1
|
||||
check_service "Analyzer" "billai-analyzer" || FAILED=1
|
||||
check_service "MongoDB" "billai-mongodb" || FAILED=1
|
||||
|
||||
if [ $FAILED -eq 0 ]; then
|
||||
echo -e "\n${GREEN}=== 部署成功 ===${NC}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "\n${RED}=== 部署失败:部分服务异常 ===${NC}"
|
||||
docker compose ps
|
||||
exit 1
|
||||
fi
|
||||
38
docker-compose.runner.yaml
Normal file
38
docker-compose.runner.yaml
Normal file
@@ -0,0 +1,38 @@
|
||||
# Gitea Actions Runner - 自动部署
|
||||
#
|
||||
# 使用方法:
|
||||
# 1. 在 Gitea 仓库获取 Runner Token
|
||||
# 访问:https://git.fadinglight.cn/clz/billai/settings/actions/runners
|
||||
# 点击 "Create new Runner" 复制 Token
|
||||
#
|
||||
# 2. 创建 .env 文件或设置环境变量
|
||||
# echo "GITEA_RUNNER_REGISTRATION_TOKEN=你的Token" > runner/.env
|
||||
#
|
||||
# 3. 启动 Runner
|
||||
# docker compose -f docker-compose.runner.yaml up -d
|
||||
#
|
||||
# 4. 在 Gitea 仓库添加变量
|
||||
# 访问:https://git.fadinglight.cn/clz/billai/settings/actions/variables
|
||||
# 添加 DEPLOY_PATH = /你的项目路径
|
||||
|
||||
services:
|
||||
runner:
|
||||
image: gitea/act_runner:latest
|
||||
container_name: billai-runner
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- ./runner/.env
|
||||
environment:
|
||||
GITEA_INSTANCE_URL: "https://git.fadinglight.cn"
|
||||
GITEA_RUNNER_NAME: "billai-runner"
|
||||
GITEA_RUNNER_LABELS: "self-hosted:host,ubuntu-latest:host"
|
||||
CONFIG_FILE: /config.yaml
|
||||
volumes:
|
||||
# Runner 配置文件
|
||||
- ./runner/config.yaml:/config.yaml
|
||||
# Runner 数据持久化
|
||||
- ./runner/data:/data
|
||||
# Docker socket - 用于在宿主机执行 docker 命令
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
# 项目目录 - 用于执行部署脚本
|
||||
- .:/workspace/billai
|
||||
3
runner/.env.example
Normal file
3
runner/.env.example
Normal file
@@ -0,0 +1,3 @@
|
||||
# Gitea Runner 配置
|
||||
# 从 Gitea 仓库获取 Token:Settings -> Actions -> Runners -> Create new Runner
|
||||
GITEA_RUNNER_REGISTRATION_TOKEN=你的Token
|
||||
48
runner/config.yaml
Normal file
48
runner/config.yaml
Normal file
@@ -0,0 +1,48 @@
|
||||
# Gitea Actions Runner 配置
|
||||
# 文档: https://docs.gitea.com/usage/actions/act-runner
|
||||
|
||||
log:
|
||||
# 日志级别: debug, info, warn, error
|
||||
level: info
|
||||
|
||||
runner:
|
||||
# Runner 注册信息存储文件
|
||||
file: .runner
|
||||
# 同时运行的任务数量
|
||||
capacity: 1
|
||||
# 环境变量传递给 job
|
||||
envs: {}
|
||||
# 任务超时时间
|
||||
timeout: 1h
|
||||
# 关机超时时间
|
||||
shutdown_timeout: 3h
|
||||
# 是否获取远程任务时不进行 TLS 验证(不推荐)
|
||||
insecure: false
|
||||
# 任务容器拉取策略: always, if-not-present, never
|
||||
fetch_timeout: 5s
|
||||
fetch_interval: 2s
|
||||
# Runner 标签
|
||||
labels:
|
||||
- "ubuntu-latest:host"
|
||||
- "self-hosted:host"
|
||||
|
||||
container:
|
||||
# 容器网络模式
|
||||
network: "host"
|
||||
# 是否启用特权模式
|
||||
privileged: false
|
||||
# 容器选项
|
||||
options:
|
||||
# 工作目录父路径
|
||||
workdir_parent:
|
||||
# 有效的卷挂载
|
||||
valid_volumes:
|
||||
- /workspace/**
|
||||
# Docker 主机
|
||||
docker_host: ""
|
||||
# 强制拉取镜像
|
||||
force_pull: false
|
||||
|
||||
host:
|
||||
# 主机工作目录
|
||||
workdir_parent:
|
||||
Reference in New Issue
Block a user