name: Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest env: GOPROXY: https://goproxy.cn,direct GONOSUMCHECK: "*" steps: - uses: actions/checkout@v4 - name: Cache Go SDK + modules uses: actions/cache@v3 with: path: | /usr/local/go ~/go/pkg/mod ~/.cache/go-build key: go-${{ hashFiles('backend/go.mod') }} restore-keys: go- - name: Install Go run: | if [ ! -f /usr/local/go/bin/go ]; then GO_VERSION=$(grep '^go ' backend/go.mod | awk '{print $2}') curl -fsSL https://golang.google.cn/dl/go${GO_VERSION}.linux-amd64.tar.gz -o /tmp/go.tar.gz sudo tar -C /usr/local -xzf /tmp/go.tar.gz fi echo "/usr/local/go/bin" >> $GITHUB_PATH - name: Go tests working-directory: backend run: go test ./... - name: Cache Flutter SDK + pub uses: actions/cache@v3 with: path: | /opt/flutter ~/.pub-cache key: flutter-3.41.6-${{ hashFiles('client/pubspec.lock') }} restore-keys: flutter-3.41.6- - name: Install Flutter run: | if [ ! -f /opt/flutter/bin/flutter ]; then curl -fsSL https://storage.flutter-io.cn/flutter_infra_release/releases/stable/linux/flutter_linux_3.41.6-stable.tar.xz -o /tmp/flutter.tar.xz sudo tar -C /opt -xf /tmp/flutter.tar.xz fi echo "/opt/flutter/bin" >> $GITHUB_PATH env: PUB_HOSTED_URL: https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn - name: Flutter tests working-directory: client run: flutter test env: PUB_HOSTED_URL: https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn - 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 env: PUB_HOSTED_URL: https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn - name: Package artifacts run: | tar -czf web.tar.gz -C client/build web echo "VERSION=v$(date +%Y%m%d.%H%M)" >> $GITHUB_ENV - name: Create Forgejo Release env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} FORGEJO_URL: ${{ secrets.FORGEJO_URL }} run: | RELEASE_ID=$(curl -sf -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}\",\"draft\":false,\"prerelease\":false}" \ | 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: ${FORGEJO_URL}/${{ gitea.repository }}/releases/tag/${VERSION}" - name: Setup SSH run: | mkdir -p ~/.ssh echo "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/ec2.pem chmod 600 ~/.ssh/ec2.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 -i ~/.ssh/ec2.pem backend/jiu-server ${EC2_USER}@${EC2_HOST}:/tmp/jiu-server rsync -avz --delete -e "ssh -i ~/.ssh/ec2.pem" \ client/build/web/ ${EC2_USER}@${EC2_HOST}:/tmp/jiu-web-new/ ssh -i ~/.ssh/ec2.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.pem