feat: ResilienceConfig sınıfı silindi; dayanıklılık yapılandırması ba… #270
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: User Service CI/CD | |
| on: | |
| push: | |
| branches: [master] | |
| paths: | |
| - "user-service/**" | |
| - "redis-client-lib/**" | |
| - ".github/workflows/user-service-ci-cd.yml" | |
| pull_request: | |
| branches: [master] | |
| paths: | |
| - "user-service/**" | |
| - "redis-client-lib/**" | |
| workflow_dispatch: | |
| inputs: | |
| environment: | |
| description: "Environment to deploy to" | |
| required: true | |
| default: "prod" | |
| type: choice | |
| options: | |
| - prod | |
| - debug | |
| jobs: | |
| build-and-deploy: | |
| runs-on: self-hosted | |
| defaults: | |
| run: | |
| working-directory: ./user-service | |
| steps: | |
| - uses: actions/checkout@v3 | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v2 | |
| with: | |
| platforms: arm64 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| with: | |
| platforms: linux/arm64 | |
| - name: Login to DockerHub | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| logout: true | |
| - name: Copy user-service files for context | |
| run: | | |
| mkdir -p /tmp/build-context | |
| cp -r ../redis-client-lib /tmp/build-context/ | |
| cp -r . /tmp/build-context/user-service | |
| working-directory: ./user-service | |
| - name: Build and Push Docker image | |
| uses: docker/build-push-action@v4 | |
| with: | |
| context: /tmp/build-context | |
| file: /tmp/build-context/user-service/Dockerfile | |
| platforms: linux/arm64 | |
| push: true | |
| tags: | | |
| ${{ secrets.DOCKERHUB_USERNAME }}/user-service:latest-arm64 | |
| ${{ secrets.DOCKERHUB_USERNAME }}/user-service:${{ github.sha }}-arm64 | |
| cache-from: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/user-service:buildcache-arm64 | |
| cache-to: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/user-service:buildcache-arm64,mode=max | |
| - name: Deploy to VPS | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.VPS_HOST }} | |
| username: ${{ secrets.SSH_USERNAME }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| command_timeout: "20m" | |
| debug: true | |
| script: | | |
| set -e # Exit on any error | |
| echo "=== Testing SSH Connection ===" | |
| whoami | |
| pwd | |
| echo "=== System Architecture ===" | |
| uname -m | |
| echo "=== Testing Directory Access ===" | |
| mkdir -p /opt/craftpilot | |
| echo "=== Docker Network Availability ===" | |
| docker network create craftpilot-network || true | |
| echo "=== MongoDB Container Check ===" | |
| MONGODB_CONTAINER="craftpilot-mongodb" | |
| if ! docker ps | grep -q "$MONGODB_CONTAINER"; then | |
| echo "WARNING: Default MongoDB container not found ($MONGODB_CONTAINER)" | |
| # Fallback to detect any MongoDB container | |
| MONGODB_CONTAINER=$(docker ps --format '{{.Names}}' | grep -E 'mongo|mongodb' | head -n 1) | |
| if [ -z "$MONGODB_CONTAINER" ]; then | |
| echo "ERROR: No MongoDB container found! Using default name, but connection may fail." | |
| MONGODB_CONTAINER="craftpilot-mongodb" # Fallback to default | |
| else | |
| echo "Found alternative MongoDB container: $MONGODB_CONTAINER" | |
| fi | |
| fi | |
| echo "Using MongoDB container: $MONGODB_CONTAINER" | |
| echo "=== MongoDB Connection Test ===" | |
| if docker run --rm --network craftpilot-network mongo:6.0 mongosh --quiet --eval "db.runCommand({ping:1}).ok" admin --host $MONGODB_CONTAINER --port 27017 -u ${{ secrets.MONGO_ROOT_USERNAME }} -p ${{ secrets.MONGO_ROOT_PASSWORD }} --authenticationDatabase admin | grep -q "1"; then | |
| echo "✅ MongoDB connection test successful!" | |
| else | |
| echo "⚠️ MongoDB connection test failed! Deployment will continue but may have issues." | |
| fi | |
| echo "=== MongoDB URI Construction ===" | |
| # Parse the URI if provided, otherwise construct from components | |
| if [ -n "${{ secrets.MONGODB_URI }}" ]; then | |
| # Parse the URI and replace the hostname with our container name | |
| URI_PREFIX=$(echo "${{ secrets.MONGODB_URI }}" | grep -oP 'mongodb://[^@]+@') | |
| URI_SUFFIX=$(echo "${{ secrets.MONGODB_URI }}" | grep -oP '(?<=@)[^/]+/.*') | |
| URI_HOST=$(echo "$URI_SUFFIX" | grep -oP '^[^:/]+') | |
| URI_REMAINDER=$(echo "$URI_SUFFIX" | grep -oP '(?<='"$URI_HOST"')[:/].*') | |
| MONGODB_URI="${URI_PREFIX}${MONGODB_CONTAINER}${URI_REMAINDER}" | |
| echo "Modified MongoDB URI with correct container name: $(echo $MONGODB_URI | sed 's/:[^:]*@/:*****@/g')" | |
| else | |
| # Build URI from components | |
| MONGODB_URI="mongodb://${{ secrets.MONGO_ROOT_USERNAME }}:${{ secrets.MONGO_ROOT_PASSWORD }}@${MONGODB_CONTAINER}:27017/craftpilot_user_db?authSource=admin&retryWrites=true&w=majority&serverSelectionTimeoutMS=60000" | |
| echo "Built MongoDB URI from credential components: $(echo $MONGODB_URI | sed 's/:[^:]*@/:*****@/g')" | |
| fi | |
| echo "=== Stopping Old Container ===" | |
| docker rm -f user-service || true | |
| echo "=== Deploying User Service ===" | |
| if [[ "${{ github.event.inputs.environment }}" == "debug" ]]; then | |
| docker run -d \ | |
| --name user-service \ | |
| --network craftpilot-network \ | |
| --restart unless-stopped \ | |
| -p 8060:8060 \ | |
| -p 5007:5007 \ | |
| -e SPRING_PROFILES_ACTIVE=prod \ | |
| -e SERVER_PORT=8060 \ | |
| -e SPRING_DATA_MONGODB_URI="$MONGODB_URI" \ | |
| -e SPRING_DATA_MONGODB_DATABASE="craftpilot_user_db" \ | |
| -e SPRING_DATA_MONGODB_CONNECT_TIMEOUT=60000 \ | |
| -e SPRING_DATA_MONGODB_SOCKET_TIMEOUT=60000 \ | |
| -e SPRING_DATA_MONGODB_MAX_WAIT_TIME=120000 \ | |
| -e EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://craftpilot:13579ada@eureka-server:8761/eureka/ \ | |
| -e EUREKA_INSTANCE_HOSTNAME=user-service \ | |
| -e EUREKA_INSTANCE_PREFER_IP_ADDRESS=false \ | |
| -e KAFKA_BOOTSTRAP_SERVERS=kafka:9092 \ | |
| -e REDIS_HOST=redis \ | |
| -e REDIS_PORT=6379 \ | |
| -e REDIS_PASSWORD=13579ada \ | |
| -e MANAGEMENT_HEALTH_VALIDATE_GROUP_MEMBERSHIP=false \ | |
| -e MANAGEMENT_ENDPOINT_HEALTH_PROBES_ENABLED=true \ | |
| -e MANAGEMENT_HEALTH_LIVENESSSTATE_ENABLED=true \ | |
| -e MANAGEMENT_HEALTH_READINESSSTATE_ENABLED=true \ | |
| -e MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE="health,info,metrics,loggers,env" \ | |
| -e MANAGEMENT_ENDPOINT_HEALTH_SHOW_DETAILS=always \ | |
| -e MANAGEMENT_HEALTH_MONGODB_ENABLED=true \ | |
| -e SPRING_APPLICATION_NAME=user-service \ | |
| -e LOGGING_LEVEL_COM_CRAFTPILOT=DEBUG \ | |
| -e LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_NETFLIX_EUREKA=DEBUG \ | |
| -e LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_DATA_REDIS=DEBUG \ | |
| -e LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_DATA_MONGODB=DEBUG \ | |
| -e LOGGING_LEVEL_COM_CRAFTPILOT_USERSERVICE_CONFIG=TRACE \ | |
| -e "JAVA_TOOL_OPTIONS=-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5007" \ | |
| --health-cmd="curl -f http://localhost:8060/actuator/health || exit 1" \ | |
| --health-interval=10s \ | |
| --health-retries=10 \ | |
| --health-timeout=5s \ | |
| --health-start-period=60s \ | |
| ${{ secrets.DOCKERHUB_USERNAME }}/user-service:latest-arm64 | |
| else | |
| docker run -d \ | |
| --name user-service \ | |
| --network craftpilot-network \ | |
| --restart unless-stopped \ | |
| -p 8060:8060 \ | |
| -e SPRING_PROFILES_ACTIVE=prod \ | |
| -e SERVER_PORT=8060 \ | |
| -e SPRING_DATA_MONGODB_URI="$MONGODB_URI" \ | |
| -e SPRING_DATA_MONGODB_DATABASE="craftpilot_user_db" \ | |
| -e EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://craftpilot:13579ada@eureka-server:8761/eureka/ \ | |
| -e EUREKA_INSTANCE_HOSTNAME=user-service \ | |
| -e EUREKA_INSTANCE_PREFER_IP_ADDRESS=false \ | |
| -e KAFKA_BOOTSTRAP_SERVERS=kafka:9092 \ | |
| -e REDIS_HOST=redis \ | |
| -e REDIS_PORT=6379 \ | |
| -e REDIS_PASSWORD=13579ada \ | |
| -e MANAGEMENT_HEALTH_VALIDATE_GROUP_MEMBERSHIP=false \ | |
| -e MANAGEMENT_ENDPOINT_HEALTH_PROBES_ENABLED=true \ | |
| -e MANAGEMENT_HEALTH_LIVENESSSTATE_ENABLED=true \ | |
| -e MANAGEMENT_HEALTH_READINESSSTATE_ENABLED=true \ | |
| -e MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE="health,info,metrics" \ | |
| -e MANAGEMENT_ENDPOINT_HEALTH_SHOW_DETAILS=always \ | |
| -e MANAGEMENT_HEALTH_MONGODB_ENABLED=true \ | |
| -e SPRING_APPLICATION_NAME=user-service \ | |
| --health-cmd="curl -f http://localhost:8060/actuator/health || exit 1" \ | |
| --health-interval=10s \ | |
| --health-retries=10 \ | |
| --health-timeout=5s \ | |
| --health-start-period=40s \ | |
| ${{ secrets.DOCKERHUB_USERNAME }}/user-service:latest-arm64 | |
| fi | |
| echo "=== Waiting for Service to Start ===" | |
| max_attempts=20 | |
| counter=0 | |
| while [ $counter -lt $max_attempts ]; do | |
| echo "Health check attempt $((counter + 1))/$max_attempts" | |
| # Container status check | |
| if ! docker ps --filter "name=user-service" --format '{{.Status}}' | grep -q "Up"; then | |
| echo "Container is not running anymore. Checking logs..." | |
| docker logs user-service --tail 100 | |
| exit 1 | |
| fi | |
| # Health check | |
| HEALTH_CHECK=$(curl -s http://localhost:8060/actuator/health || echo "Failed to connect") | |
| if echo "$HEALTH_CHECK" | grep -q '"status":"UP"'; then | |
| if echo "$HEALTH_CHECK" | grep -q '"mongo":{.*"status":"UP"'; then | |
| echo "✅ Service is healthy with MongoDB connection: $HEALTH_CHECK" | |
| echo "=== Deployment completed successfully ===" | |
| exit 0 | |
| else | |
| echo "Service is UP but MongoDB component status needs verification." | |
| fi | |
| else | |
| echo "Health check response: $HEALTH_CHECK" | |
| fi | |
| echo "Waiting for service to start... ($((counter + 1))/$max_attempts)" | |
| sleep 15 | |
| counter=$((counter + 1)) | |
| done | |
| echo "=== Service Failed to Start - Debug Information ===" | |
| echo "Docker Container Status:" | |
| docker ps -a | grep user-service | |
| echo "Container Logs (last 100 lines):" | |
| docker logs user-service --tail 100 | |
| echo "MongoDB Connection Test:" | |
| docker exec user-service nc -zv $MONGODB_CONTAINER 27017 || echo "Cannot connect to MongoDB" | |
| echo "Error Messages and Exceptions:" | |
| docker logs user-service 2>&1 | grep -i "error\|exception\|failed" | tail -20 | |
| echo "Health Check Response:" | |
| curl -v http://localhost:8060/actuator/health || true | |
| exit 1 |