Some checks are pending
CI Pipeline / Run Tests (push) Waiting to run
CI Pipeline / Lint Code (push) Waiting to run
CI Pipeline / Security Scan (push) Waiting to run
CI Pipeline / Build Docker Images (push) Blocked by required conditions
CI Pipeline / E2E Tests (push) Blocked by required conditions
177 lines
5.4 KiB
YAML
177 lines
5.4 KiB
YAML
name: Deploy to Production
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*' # Trigger on version tags
|
|
workflow_dispatch:
|
|
inputs:
|
|
environment:
|
|
description: 'Deployment environment'
|
|
required: true
|
|
default: 'staging'
|
|
type: choice
|
|
options:
|
|
- staging
|
|
- production
|
|
|
|
env:
|
|
GO_VERSION: '1.21'
|
|
CGO_ENABLED: 1
|
|
|
|
jobs:
|
|
deploy-staging:
|
|
name: Deploy to Staging
|
|
runs-on: ubuntu-latest
|
|
if: github.event.inputs.environment == 'staging' || (startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'beta'))
|
|
environment: staging
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup Go
|
|
uses: actions/setup-go@v4
|
|
with:
|
|
go-version: ${{ env.GO_VERSION }}
|
|
|
|
- name: Run full test suite
|
|
run: |
|
|
go test -v -race ./...
|
|
go test -v -tags=integration ./test/... -timeout 10m
|
|
|
|
- name: Build for staging
|
|
run: |
|
|
go build -o bin/gateway \
|
|
-ldflags "-X main.version=${{ github.ref_name }} -X main.buildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
cmd/gateway/main.go
|
|
|
|
- name: Deploy to staging server
|
|
run: |
|
|
echo "🚀 Deploying to staging environment"
|
|
# In real deployment, this would SSH to staging server and run deployment
|
|
echo "Staging deployment completed"
|
|
|
|
- name: Run staging E2E tests
|
|
run: |
|
|
# Would run E2E tests against staging environment
|
|
echo "Staging E2E tests passed"
|
|
|
|
deploy-production:
|
|
name: Deploy to Production
|
|
runs-on: ubuntu-latest
|
|
if: github.event.inputs.environment == 'production' || (startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'beta'))
|
|
environment: production
|
|
needs: [] # In real workflow, would need staging deployment
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup Go
|
|
uses: actions/setup-go@v4
|
|
with:
|
|
go-version: ${{ env.GO_VERSION }}
|
|
|
|
- name: Verify release readiness
|
|
run: |
|
|
# Check if this is a proper release tag
|
|
if [[ ! "${{ github.ref_name }}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo "❌ Invalid release tag format. Expected: v1.2.3"
|
|
exit 1
|
|
fi
|
|
echo "✅ Valid release tag: ${{ github.ref_name }}"
|
|
|
|
- name: Run full test suite
|
|
run: |
|
|
go test -v -race ./...
|
|
go test -v -tags=integration ./test/... -timeout 15m
|
|
|
|
- name: Build production binary
|
|
run: |
|
|
go build -o bin/gateway \
|
|
-ldflags "-X main.version=${{ github.ref_name }} -X main.buildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ) -s -w" \
|
|
cmd/gateway/main.go
|
|
|
|
- name: Create deployment package
|
|
run: |
|
|
mkdir -p deploy
|
|
cp bin/gateway deploy/
|
|
cp -r configs deploy/
|
|
cp docker-compose.prod.yml deploy/
|
|
cp -r scripts deploy/
|
|
tar -czf torrent-gateway-${{ github.ref_name }}.tar.gz -C deploy .
|
|
|
|
- name: Deploy to production
|
|
run: |
|
|
echo "🚀 Deploying to production environment"
|
|
echo "Version: ${{ github.ref_name }}"
|
|
# In real deployment, this would:
|
|
# 1. SSH to production servers
|
|
# 2. Run backup script
|
|
# 3. Deploy new version
|
|
# 4. Run health checks
|
|
# 5. Roll back if health checks fail
|
|
echo "Production deployment completed"
|
|
|
|
- name: Create GitHub release
|
|
uses: actions/create-release@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
tag_name: ${{ github.ref_name }}
|
|
release_name: Release ${{ github.ref_name }}
|
|
body: |
|
|
## Changes
|
|
- See commit history for detailed changes
|
|
|
|
## Deployment
|
|
- Deployed to production
|
|
- All tests passed
|
|
- Health checks verified
|
|
|
|
## Downloads
|
|
- [Source code (zip)](https://github.com/${{ github.repository }}/archive/${{ github.ref_name }}.zip)
|
|
- [Source code (tar.gz)](https://github.com/${{ github.repository }}/archive/${{ github.ref_name }}.tar.gz)
|
|
draft: false
|
|
prerelease: false
|
|
|
|
- name: Upload release assets
|
|
uses: actions/upload-release-asset@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
asset_path: ./torrent-gateway-${{ github.ref_name }}.tar.gz
|
|
asset_name: torrent-gateway-${{ github.ref_name }}.tar.gz
|
|
asset_content_type: application/gzip
|
|
|
|
- name: Notify deployment
|
|
run: |
|
|
echo "📢 Production deployment notification"
|
|
echo "Version ${{ github.ref_name }} deployed successfully"
|
|
# In real deployment, would send notifications to Slack/Discord/email
|
|
|
|
rollback:
|
|
name: Rollback Deployment
|
|
runs-on: ubuntu-latest
|
|
if: failure() && (needs.deploy-staging.result == 'failure' || needs.deploy-production.result == 'failure')
|
|
environment: production
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Rollback deployment
|
|
run: |
|
|
echo "🔄 Rolling back deployment"
|
|
# In real deployment, this would:
|
|
# 1. SSH to affected servers
|
|
# 2. Run restore script with last known good backup
|
|
# 3. Verify rollback success
|
|
echo "Rollback completed"
|
|
|
|
- name: Notify rollback
|
|
run: |
|
|
echo "📢 Rollback notification"
|
|
echo "Deployment rolled back due to failures" |