Files
jiu/scripts/deploy.sh
T
2026-05-25 00:49:22 +08:00

63 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
set -e
cd "$(dirname "$0")/.."
EC2_HOST="${EC2_HOST:-$(grep EC2_HOST ~/.env 2>/dev/null | cut -d= -f2)}"
EC2_USER="${EC2_USER:-$(grep EC2_USER ~/.env 2>/dev/null | cut -d= -f2)}"
EC2_KEY="${EC2_KEY:-~/.ssh/wangjia.pem}"
FORGEJO_URL="https://git.51yanmei.com"
FORGEJO_TOKEN="${FORGEJO_TOKEN:-$(grep FORGEJO_TOKEN ~/.env 2>/dev/null | cut -d= -f2)}"
echo "==> 1/5 Go 测试"
cd backend && go test ./... && cd ..
echo "==> 2/5 编译 Go 后端 (linux/amd64)"
cd backend
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o jiu-server .
cd ..
echo "==> 3/5 编译 Flutter Web"
cd client
flutter build web --release \
--dart-define=BASE_URL=https://jiu.51yanmei.com \
--dart-define=PUBLIC_URL=https://jiu.51yanmei.com
cd ..
echo "==> 4/5 上传到 Forgejo Releases"
tar -czf /tmp/web.tar.gz -C client/build web
VERSION="v$(date +%Y%m%d.%H%M)"
RESP=$(curl -s -X POST "${FORGEJO_URL}/api/v1/repos/wangjia/jiu/releases" \
-H "Authorization: token ${FORGEJO_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"tag_name\":\"${VERSION}\",\"name\":\"Release ${VERSION}\",\"draft\":false,\"prerelease\":false}")
RELEASE_ID=$(echo "${RESP}" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
curl -sf -X POST "${FORGEJO_URL}/api/v1/repos/wangjia/jiu/releases/${RELEASE_ID}/assets" \
-H "Authorization: token ${FORGEJO_TOKEN}" -F "attachment=@backend/jiu-server"
curl -sf -X POST "${FORGEJO_URL}/api/v1/repos/wangjia/jiu/releases/${RELEASE_ID}/assets" \
-H "Authorization: token ${FORGEJO_TOKEN}" -F "attachment=@/tmp/web.tar.gz"
echo "Release ${VERSION} 已创建"
echo "==> 5/5 部署到 EC2"
scp -O -i ${EC2_KEY} backend/jiu-server ${EC2_USER}@${EC2_HOST}:/tmp/jiu-server
rsync -avz --delete -e "ssh -i ${EC2_KEY}" \
client/build/web/ ${EC2_USER}@${EC2_HOST}:/tmp/jiu-web-new/
ssh -i ${EC2_KEY} ${EC2_USER}@${EC2_HOST} << 'ENDSSH'
sudo systemctl stop jiu
cp /tmp/jiu-server /opt/jiu/backend/jiu-server
chmod +x /opt/jiu/backend/jiu-server
sudo systemctl start jiu
for i in $(seq 1 30); do
curl -sf http://localhost:8080/health && break
sleep 2
done
rm -rf /opt/jiu/web-old
mv /opt/jiu/web /opt/jiu/web-old 2>/dev/null || true
mv /tmp/jiu-web-new /opt/jiu/web
sudo nginx -s reload
ENDSSH
echo ""
echo "✓ 部署完成!版本: ${VERSION}"
echo " 回滚地址: ${FORGEJO_URL}/wangjia/jiu/releases/tag/${VERSION}"