#!/bin/bash # Local CI/CD Testing Script # Simulates the CI/CD pipeline but builds Docker image locally # Use this for local development and testing without Gitea set -e echo "🚀 Local CI/CD Testing" echo "======================" echo "" # 1. Setup echo "1. Setting up environment..." if ! command -v go >/dev/null 2>&1; then echo "❌ Go not found. Please install Go 1.26.1+" exit 1 fi if ! command -v docker >/dev/null 2>&1; then echo "âš ī¸ Docker not found. Docker build steps will be skipped" HAS_DOCKER=false else HAS_DOCKER=true fi echo "✅ Environment ready" echo "" # 2. Install dependencies echo "2. Installing dependencies..." go mod tidy echo "✅ Dependencies installed" echo "" # 3. Install swag and generate docs echo "3. Generating Swagger documentation..." if [ ! -f pkg/server/docs/swagger.json ]; then echo "📝 Generating Swagger docs..." go install github.com/swaggo/swag/cmd/swag@latest cd pkg/server && go generate cd ../.. echo "✅ Swagger documentation generated" else echo "✅ Swagger documentation already exists" fi echo "" # 4. Build and test echo "4. Building and testing..." go build ./... echo "✅ Code compiled successfully" go test ./... -cover -v echo "✅ Tests passed" echo "" # 5. Build binaries echo "5. Building binaries..." ./scripts/build.sh echo "✅ Binaries built" ls -la bin/ echo "" # 6. Version bump simulation echo "6. Version bump simulation..." LAST_COMMIT=$(git log -1 --pretty=%B | head -1) echo "Last commit: $LAST_COMMIT" if echo "$LAST_COMMIT" | grep -q "^feat:"; then echo "đŸŽ¯ Feature commit detected - would bump MINOR version" echo "Run: ./scripts/version-bump.sh minor" elif echo "$LAST_COMMIT" | grep -q "^fix:"; then echo "🐛 Fix commit detected - would bump PATCH version" echo "Run: ./scripts/version-bump.sh patch" elif echo "$LAST_COMMIT" | grep -q "BREAKING CHANGE"; then echo "đŸ’Ĩ Breaking change detected - would bump MAJOR version" echo "Run: ./scripts/version-bump.sh major" else echo "â­ī¸ No automatic version bump needed" fi # Show current version source VERSION CURRENT_VERSION="$MAJOR.$MINOR.$PATCH${PRERELEASE:+-$PRERELEASE}" echo "📊 Current version: $CURRENT_VERSION" echo "" # 7. Local Docker build instructions if [ "$HAS_DOCKER" = true ]; then echo "đŸŗ LOCAL DOCKER BUILD INSTRUCTIONS" echo "================================" echo "" echo "1. Build Docker image locally:" echo " docker build -t dance-lessons-coach:$CURRENT_VERSION ." echo "" echo "2. Tag the image:" echo " docker tag dance-lessons-coach:$CURRENT_VERSION dance-lessons-coach:latest" echo "" echo "3. Test the local image (check port availability first):" echo " docker run -d -p 8080:8080 dance-lessons-coach:$CURRENT_VERSION" echo " # Or use alternative port if 8080 is in use:" echo " docker run -d -p 8081:8080 dance-lessons-coach:$CURRENT_VERSION" echo "" echo "4. Branch-specific container naming (recommended):" echo " BRANCH=\"(git rev-parse --abbrev-ref HEAD | tr '/' '-')" echo " docker run -d -p 8080:8080 --name dance-lessons-coach-\"$BRANCH\" dance-lessons-coach:$CURRENT_VERSION" echo "" echo "5. Test API endpoints:" echo " curl http://localhost:8080/api/health" echo " curl http://localhost:8080/api/v1/greet/YourName" echo "" echo "5. Clean up:" echo " docker stop && docker rm " echo "" echo "💡 Tip: Use 'docker images' to see your built images" echo "💡 Use 'docker ps' to see running containers" echo "" # Ask if user wants to build Docker image now read -p "🚀 Do you want to build the Docker image now? (y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Yy]$ ]]; then echo "đŸŗ Building Docker image..." docker build -t dance-lessons-coach:$CURRENT_VERSION . docker tag dance-lessons-coach:$CURRENT_VERSION dance-lessons-coach:latest echo "✅ Docker image built: dance-lessons-coach:$CURRENT_VERSION" echo "" # Check if port 8080 is available echo "🔍 Checking port availability..." if lsof -i :8080 > /dev/null 2>&1; then echo "âš ī¸ Port 8080 is already in use" read -p "🚀 Do you want to use a different port? (y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Yy]$ ]]; then read -p "Enter port number (e.g., 8081): " CUSTOM_PORT echo "" PORT=$CUSTOM_PORT else echo "â„šī¸ Using port 8080 anyway (may fail if service is running)" PORT=8080 fi else echo "✅ Port 8080 is available" PORT=8080 fi read -p "🚀 Do you want to run the container now on port $PORT? (y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Yy]$ ]]; then # Get current branch name for container naming BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD | tr '/' '-') CONTAINER_NAME="dance-lessons-coach-$BRANCH_NAME" echo "đŸŗ Preparing container '$CONTAINER_NAME' on port $PORT..." # Remove existing container if it exists if docker ps -a --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then echo "âš ī¸ Container '$CONTAINER_NAME' already exists - removing it..." docker stop "$CONTAINER_NAME" > /dev/null 2>&1 || true docker rm "$CONTAINER_NAME" > /dev/null 2>&1 || true echo "✅ Old container removed" fi # Also remove the generic test container if it exists if docker ps -a --format '{{.Names}}' | grep -q "^dance-lessons-coach-test$"; then echo "âš ī¸ Generic test container exists - removing it..." docker stop dance-lessons-coach-test > /dev/null 2>&1 || true docker rm dance-lessons-coach-test > /dev/null 2>&1 || true echo "✅ Old generic container removed" fi echo "đŸŗ Starting container '$CONTAINER_NAME' on port $PORT..." docker run -d -p $PORT:8080 --name "$CONTAINER_NAME" dance-lessons-coach:$CURRENT_VERSION echo "✅ Container '$CONTAINER_NAME' started on port $PORT" echo "" # Wait for container to be ready echo "🕒 Waiting for container to be ready..." MAX_ATTEMPTS=10 ATTEMPT=1 READY=false while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do if curl -s http://localhost:$PORT/api/health | grep -q "healthy"; then READY=true break fi sleep 1 ATTEMPT=$((ATTEMPT + 1)) echo "🕒 Attempt $ATTEMPT/$MAX_ATTEMPTS..." done if [ "$READY" = true ]; then echo "✅ Container is ready!" else echo "❌ Container failed to start properly" echo "📋 Container logs:" docker logs dance-lessons-coach-test echo "" echo "💡 Check container status with: docker ps -a" echo "💡 View full logs with: docker logs dance-lessons-coach-test" continue # Skip endpoint testing fi echo "📋 Testing endpoints..." if curl -s http://localhost:$PORT/api/health | grep -q "healthy"; then echo "✅ Health check passed" else echo "❌ Health check failed" fi if curl -s http://localhost:$PORT/api/v1/greet/ | grep -q "Hello"; then echo "✅ Greet endpoint working" else echo "❌ Greet endpoint failed" fi echo "" echo "📖 Swagger UI available at: http://localhost:$PORT/swagger/" echo "💡 Press Ctrl+C to stop the container when done" echo " Or run: docker stop $CONTAINER_NAME && docker rm $CONTAINER_NAME" fi fi else echo "â„šī¸ Docker not available - skipping Docker build instructions" fi echo "" echo "✅ LOCAL CI/CD TEST COMPLETE" echo "===========================" echo "" echo "📋 What was tested:" echo " ✅ Go dependencies installation" echo " ✅ Swagger documentation generation" echo " ✅ Code compilation" echo " ✅ Unit tests with coverage" echo " ✅ Binary build" echo " ✅ Version bump simulation" if [ "$HAS_DOCKER" = true ]; then echo " ✅ Docker build (if chosen)" fi echo "" echo "đŸŽ¯ When ready for production:" echo " Push to main branch to trigger full CI/CD pipeline" echo " Docker image will be built and pushed to Gitea Container Registry" echo "" echo "💡 Local testing complete! Your changes are ready for CI/CD."