git workflow. #24
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Eureka Server CI/CD | |
| on: | |
| push: | |
| branches: [master] | |
| paths: | |
| - "eureka-server/**" | |
| - ".github/workflows/eureka-server-ci-cd.yml" | |
| workflow_dispatch: | |
| jobs: | |
| build-and-deploy: | |
| runs-on: self-hosted | |
| steps: | |
| - uses: actions/checkout@v3 | |
| - name: Set up JDK | |
| uses: actions/setup-java@v3 | |
| with: | |
| java-version: "21" | |
| distribution: "temurin" | |
| - name: Cache Maven packages | |
| uses: actions/cache@v3 | |
| with: | |
| path: ~/.m2 | |
| key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} | |
| restore-keys: ${{ runner.os }}-m2 | |
| - name: Grant execute permission for mvnw | |
| run: | | |
| cd eureka-server | |
| chmod +x mvnw | |
| - name: Build | |
| run: | | |
| cd eureka-server | |
| ./mvnw clean package -DskipTests | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v2 | |
| with: | |
| platforms: arm64 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Login to DockerHub | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Build and Push Docker image | |
| uses: docker/build-push-action@v4 | |
| with: | |
| context: ./eureka-server | |
| platforms: linux/arm64 | |
| push: true | |
| tags: ${{ secrets.DOCKERHUB_USERNAME }}/eureka-server:latest-arm64 | |
| - name: Deploy to VPS | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.VPS_HOST }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| echo "=== Infrastructure Setup Started ===" | |
| # Create network if not exists | |
| docker network create craftpilot-network || true | |
| # Check and start Redis if not running | |
| if ! docker ps | grep -q redis; then | |
| echo "Starting Redis..." | |
| docker run -d \ | |
| --name redis \ | |
| --network craftpilot-network \ | |
| -p 6379:6379 \ | |
| -e REDIS_PASSWORD=13579ada \ | |
| redis:latest redis-server --requirepass 13579ada | |
| # Wait for Redis to be ready | |
| echo "Waiting for Redis to be ready..." | |
| for i in {1..30}; do | |
| if docker exec redis redis-cli -a 13579ada ping | grep -q "PONG"; then | |
| echo "Redis is ready" | |
| break | |
| fi | |
| echo "Waiting for Redis... attempt $i/30" | |
| sleep 2 | |
| done | |
| else | |
| echo "Redis is already running" | |
| fi | |
| # Check and start Zookeeper if not running | |
| if ! docker ps | grep -q zookeeper; then | |
| echo "Starting Zookeeper..." | |
| docker run -d \ | |
| --name zookeeper \ | |
| --network craftpilot-network \ | |
| -e ZOOKEEPER_CLIENT_PORT=2181 \ | |
| -e ZOOKEEPER_TICK_TIME=2000 \ | |
| confluentinc/cp-zookeeper:latest | |
| # Wait for Zookeeper | |
| echo "Waiting for Zookeeper to be ready..." | |
| sleep 10 | |
| else | |
| echo "Zookeeper is already running" | |
| fi | |
| # Check and start Kafka if not running | |
| if ! docker ps | grep -q kafka; then | |
| echo "Starting Kafka..." | |
| docker run -d \ | |
| --name kafka \ | |
| --network craftpilot-network \ | |
| -p 9092:9092 \ | |
| -e KAFKA_BROKER_ID=1 \ | |
| -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ | |
| -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \ | |
| -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \ | |
| -e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 \ | |
| -e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 \ | |
| confluentinc/cp-kafka:latest | |
| # Wait for Kafka | |
| echo "Waiting for Kafka to be ready..." | |
| sleep 20 | |
| else | |
| echo "Kafka is already running" | |
| fi | |
| echo "=== Infrastructure Setup Completed ===" | |
| # Deploy Eureka Server | |
| echo "=== Deploying Eureka Server ===" | |
| docker pull ${{ secrets.DOCKERHUB_USERNAME }}/eureka-server:latest-arm64 | |
| docker stop eureka-server || true | |
| docker rm eureka-server || true | |
| docker run -d \ | |
| --name eureka-server \ | |
| --hostname eureka-server \ | |
| --network craftpilot-network \ | |
| --restart unless-stopped \ | |
| -p 8761:8761 \ | |
| -e SPRING_PROFILES_ACTIVE=prod \ | |
| -e EUREKA_USERNAME=craftpilot \ | |
| -e EUREKA_PASSWORD=13579ada \ | |
| -e SERVER_PORT=8761 \ | |
| -e EUREKA_INSTANCE_HOSTNAME=eureka-server \ | |
| -e EUREKA_CLIENT_REGISTER_WITH_EUREKA=false \ | |
| -e EUREKA_CLIENT_FETCH_REGISTRY=false \ | |
| -e MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE=health,info \ | |
| -e MANAGEMENT_ENDPOINT_HEALTH_SHOW_DETAILS=always \ | |
| ${{ secrets.DOCKERHUB_USERNAME }}/eureka-server:latest-arm64 | |
| # Enhanced health check for Eureka Server | |
| echo "=== Performing Health Checks ===" | |
| for i in {1..30}; do | |
| echo "Health check attempt $i/30" | |
| if curl -sf http://localhost:8761/actuator/health | grep -q "UP"; then | |
| echo "✓ Eureka Server is healthy" | |
| echo "=== Deployment Completed Successfully ===" | |
| exit 0 | |
| fi | |
| if [ $i -eq 15 ]; then | |
| echo "Mid-point container logs:" | |
| docker logs eureka-server --tail 50 | |
| fi | |
| echo "Waiting for next check..." | |
| sleep 10 | |
| done | |
| echo "=== Deployment Failed - Debug Information ===" | |
| docker logs eureka-server | |
| exit 1 |