name: Deploy on: push: branches: [main] jobs: deploy: runs-on: mac env: GOPROXY: https://goproxy.cn,direct PUB_HOSTED_URL: https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn steps: - uses: actions/checkout@v4 - name: Go tests working-directory: backend run: go test ./... - name: Flutter tests working-directory: client run: flutter test - name: Build backend (linux/amd64) working-directory: backend run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o jiu-server . - name: Build Flutter Web working-directory: client run: flutter build web --release --dart-define=BASE_URL=https://jiu.51yanmei.com --dart-define=PUBLIC_URL=https://jiu.51yanmei.com - name: Package & Create Forgejo Release env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} FORGEJO_URL: ${{ secrets.FORGEJO_URL }} run: | tar -czf web.tar.gz -C client/build web VERSION="v$(date +%Y%m%d.%H%M)" COMMIT="${{ gitea.sha }}" COMMIT_MSG=$(git log -1 --pretty="%s" HEAD) RECENT_LOGS=$(git log -5 --pretty="- %s (%h)" HEAD) BODY="## 构建信息 - **版本**: ${VERSION} - **Commit**: ${COMMIT} - **时间**: $(date '+%Y-%m-%d %H:%M:%S %Z') ## 最近提交 ${RECENT_LOGS}" RESP=$(curl -s -X POST "${FORGEJO_URL}/api/v1/repos/${{ gitea.repository }}/releases" \ -H "Authorization: token ${FORGEJO_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"${VERSION}\",\"name\":\"Release ${VERSION}\",\"body\":$(echo "$BODY" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))'),\"draft\":false,\"prerelease\":false}") echo "API response: ${RESP}" RELEASE_ID=$(echo "${RESP}" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") curl -sf -X POST "${FORGEJO_URL}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets" \ -H "Authorization: token ${FORGEJO_TOKEN}" -F "attachment=@backend/jiu-server" curl -sf -X POST "${FORGEJO_URL}/api/v1/repos/${{ gitea.repository }}/releases/${RELEASE_ID}/assets" \ -H "Authorization: token ${FORGEJO_TOKEN}" -F "attachment=@web.tar.gz" echo "Release ${VERSION} created" - name: Setup SSH run: | mkdir -p ~/.ssh printf '%s' "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/ec2_deploy.pem chmod 600 ~/.ssh/ec2_deploy.pem ssh-keyscan -H ${{ secrets.EC2_HOST }} >> ~/.ssh/known_hosts - name: Deploy to EC2 env: EC2_HOST: ${{ secrets.EC2_HOST }} EC2_USER: ${{ secrets.EC2_USER }} run: | scp -O -i ~/.ssh/ec2_deploy.pem backend/jiu-server ${EC2_USER}@${EC2_HOST}:/tmp/jiu-server rsync -avz --delete -e "ssh -i ~/.ssh/ec2_deploy.pem" \ client/build/web/ ${EC2_USER}@${EC2_HOST}:/tmp/jiu-web-new/ ssh -i ~/.ssh/ec2_deploy.pem ${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 - name: Cleanup SSH key if: always() run: rm -f ~/.ssh/ec2_deploy.pem