diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 872280d..f6a2964 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -163,14 +163,14 @@ jobs: - # Deploy release to production + # Test release deployment locally deploy-release: - name: Deploy Release + name: Test Release Deployment runs-on: ubuntu-latest needs: [create-release, build-release, security-scan] environment: - name: production - url: https://ping-river-monitor.b4l.co.th + name: testing + url: http://localhost:8080 steps: - name: Checkout code @@ -178,114 +178,100 @@ jobs: with: token: ${{ secrets.GITEA_TOKEN }} - - name: Deploy to production + - name: Deploy to production (Local Test) run: | - echo "๐Ÿš€ Deploying ${{ needs.create-release.outputs.version }} to production..." + echo "๐Ÿš€ Testing ${{ needs.create-release.outputs.version }} deployment locally..." - # Example deployment commands (customize for your infrastructure) - # kubectl set image deployment/ping-river-monitor app=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.create-release.outputs.version }} - # docker-compose pull && docker-compose up -d - # Or webhook call to your deployment system + # Pull the built image + docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.create-release.outputs.version }} - echo "โœ… Deployment initiated" + # Stop any existing containers + docker stop ping-river-monitor-test || true + docker rm ping-river-monitor-test || true + + # Start the container for testing + docker run -d \ + --name ping-river-monitor-test \ + -p 8080:8000 \ + -e LOG_LEVEL=INFO \ + -e DB_TYPE=sqlite \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.create-release.outputs.version }} + + echo "โœ… Container started for testing" - name: Health check after deployment run: | - echo "โณ Waiting for deployment to stabilize..." - sleep 60 + echo "โณ Waiting for application to start..." + sleep 30 - echo "๐Ÿ” Running health checks..." - curl -f https://ping-river-monitor.b4l.co.th/health - curl -f https://ping-river-monitor.b4l.co.th/stations + echo "๐Ÿ” Running health checks against local container..." - echo "โœ… Health checks passed!" + # Wait for the application to be ready + for i in {1..12}; do + if curl -f http://localhost:8080/health; then + echo "โœ… Health endpoint responding" + break + else + echo "โณ Waiting for health endpoint... (attempt $i/12)" + sleep 10 + fi + done - - name: Update deployment status + # Test API endpoints + echo "๐Ÿงช Testing API endpoints..." + curl -f http://localhost:8080/health || exit 1 + curl -f http://localhost:8080/docs || exit 1 + curl -f http://localhost:8080/stations || exit 1 + curl -f http://localhost:8080/metrics || exit 1 + + echo "โœ… All health checks passed!" + + - name: Container logs and cleanup + if: always() run: | - echo "๐Ÿ“Š Deployment Summary:" + echo "๐Ÿ“‹ Container logs:" + docker logs ping-river-monitor-test || true + + echo "๐Ÿงน Cleaning up test container..." + docker stop ping-river-monitor-test || true + docker rm ping-river-monitor-test || true + + echo "๐Ÿ“Š Deployment Test Summary:" echo "Version: ${{ needs.create-release.outputs.version }}" echo "Image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.create-release.outputs.version }}" - echo "URL: https://ping-river-monitor.b4l.co.th" - echo "Grafana: https://grafana.ping-river-monitor.b4l.co.th" - echo "API Docs: https://ping-river-monitor.b4l.co.th/docs" + echo "Status: Container tested successfully" + echo "Ready for production deployment" + - # Post-release validation - validate-release: - name: Validate Release - runs-on: ubuntu-latest - needs: deploy-release - - steps: - - name: Comprehensive API test - run: | - echo "๐Ÿงช Running comprehensive API tests..." - - # Test all major endpoints - curl -f https://ping-river-monitor.b4l.co.th/health - curl -f https://ping-river-monitor.b4l.co.th/metrics - curl -f https://ping-river-monitor.b4l.co.th/stations - curl -f https://ping-river-monitor.b4l.co.th/measurements/latest?limit=5 - curl -f https://ping-river-monitor.b4l.co.th/scraping/status - - echo "โœ… All API endpoints responding correctly" - - - name: Performance validation - run: | - echo "โšก Running performance validation..." - - # Install Apache Bench - sudo apt-get update && sudo apt-get install -y apache2-utils - - # Test response times - ab -n 10 -c 2 https://ping-river-monitor.b4l.co.th/health - ab -n 10 -c 2 https://ping-river-monitor.b4l.co.th/stations - - echo "โœ… Performance validation completed" - - - name: Data validation - run: | - echo "๐Ÿ“Š Validating data collection..." - - # Check if recent data is available - response=$(curl -s https://ping-river-monitor.b4l.co.th/measurements/latest?limit=1) - echo "Latest measurement: $response" - - # Validate data structure (basic check) - if echo "$response" | grep -q "water_level"; then - echo "โœ… Data structure validation passed" - else - echo "โŒ Data structure validation failed" - exit 1 - fi # Notify stakeholders notify: name: Notify Release runs-on: ubuntu-latest - needs: [create-release, validate-release] + needs: [create-release, deploy-release] if: always() steps: - name: Notify success - if: needs.validate-release.result == 'success' + if: needs.deploy-release.result == 'success' run: | - echo "๐ŸŽ‰ Release ${{ needs.create-release.outputs.version }} deployed successfully!" - echo "๐ŸŒ Production URL: https://ping-river-monitor.b4l.co.th" - echo "๐Ÿ“Š Grafana: https://grafana.ping-river-monitor.b4l.co.th" - echo "๐Ÿ“š API Docs: https://ping-river-monitor.b4l.co.th/docs" + echo "๐ŸŽ‰ Release ${{ needs.create-release.outputs.version }} tested successfully!" + echo "๐Ÿงช Local Test: Passed all health checks" + echo "๏ฟฝ GDocker Image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.create-release.outputs.version }}" + echo "โœ… Ready for production deployment" # Add notification to Slack, Discord, email, etc. # curl -X POST -H 'Content-type: application/json' \ - # --data '{"text":"๐ŸŽ‰ Northern Thailand Ping River Monitor ${{ needs.create-release.outputs.version }} deployed successfully!"}' \ + # --data '{"text":"๐ŸŽ‰ Northern Thailand Ping River Monitor ${{ needs.create-release.outputs.version }} tested and ready for deployment!"}' \ # ${{ secrets.SLACK_WEBHOOK_URL }} - name: Notify failure - if: needs.validate-release.result == 'failure' + if: needs.deploy-release.result == 'failure' run: | - echo "โŒ Release ${{ needs.create-release.outputs.version }} deployment failed!" - echo "Please check the logs and take corrective action." + echo "โŒ Release ${{ needs.create-release.outputs.version }} testing failed!" + echo "Please check the logs and fix issues before production deployment." # Add failure notification # curl -X POST -H 'Content-type: application/json' \ - # --data '{"text":"โŒ Northern Thailand Ping River Monitor ${{ needs.create-release.outputs.version }} deployment failed!"}' \ + # --data '{"text":"โŒ Northern Thailand Ping River Monitor ${{ needs.create-release.outputs.version }} testing failed!"}' \ # ${{ secrets.SLACK_WEBHOOK_URL }} \ No newline at end of file