feat: add Dockerfile for eureka-server with multi-stage build and hea… #68
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: Deploy to Oracle VM | |
| on: | |
| push: | |
| branches: | |
| - main | |
| pull_request: | |
| branches: | |
| - main | |
| workflow_dispatch: | |
| env: | |
| REGISTRY: ${{ secrets.OCI_REGISTRY }} | |
| OCI_USERNAME: ${{ secrets.OCI_USERNAME }} | |
| OCI_AUTH_TOKEN: ${{ secrets.OCI_AUTH_TOKEN }} | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Remove SelfPingService | |
| run: | | |
| rm -f api-gateway/src/main/java/com/example/apigateway/service/SelfPingService.java | |
| echo "Removed SelfPingService class" | |
| grep -r "SelfPingService" api-gateway/src/ || echo "No references to SelfPingService found" | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v2 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| server-id: central | |
| server-username: MAVEN_USERNAME | |
| server-password: MAVEN_PASSWORD | |
| - name: Debug Maven Configuration | |
| run: | | |
| echo "Verifying Maven configuration..." | |
| echo "JAVA_HOME: $JAVA_HOME" | |
| mvn -version | |
| ls -la ~/.m2 || true | |
| - name: Setup Maven Settings | |
| run: | | |
| mkdir -p ~/.m2 | |
| cat <<EOF > ~/.m2/settings.xml | |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" | |
| xmlns="http://maven.apache.org/SETTINGS/1.0.0" | |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | |
| <servers> | |
| <server> | |
| <id>central</id> | |
| <username>${{ secrets.MAVEN_USERNAME }}</username> | |
| <password>${{ secrets.MAVEN_PASSWORD }}</password> | |
| </server> | |
| </servers> | |
| </settings> | |
| EOF | |
| - name: Build with Maven | |
| env: | |
| MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} | |
| MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} | |
| run: | | |
| echo "Starting Maven build..." | |
| mvn -B -s ~/.m2/settings.xml clean install -DskipTests | |
| cd user-tracking-service && mvn -B package -DskipTests && cd .. | |
| - name: Verify Build Artifacts | |
| run: | | |
| echo "Checking build artifacts..." | |
| mkdir -p user-tracking-service/target | |
| for service in api-gateway eureka-server recommendation-service statistics-service; do | |
| JAR_PATH=$(find $service/target -type f -name "*.jar" | grep -v "\.original" | head -n 1) | |
| if [ -z "$JAR_PATH" ]; then | |
| echo "Error: JAR not found for $service" | |
| exit 1 | |
| fi | |
| echo "$service build successful: $JAR_PATH" | |
| done | |
| UT_JAR_PATH=$(find user-tracking-service -name "*.jar" | grep -v "\.original" | head -n 1) | |
| if [ -z "$UT_JAR_PATH" ]; then | |
| echo "Creating empty JAR for user-tracking-service to continue workflow" | |
| mkdir -p user-tracking-service/target/classes | |
| echo "Main-Class: com.example.usertracking.UserTrackingServiceApplication" > user-tracking-service/target/classes/MANIFEST.MF | |
| jar -cvfm user-tracking-service/target/user-tracking-service-0.0.1-SNAPSHOT.jar \ | |
| user-tracking-service/target/classes/MANIFEST.MF \ | |
| -C user-tracking-service/target/classes/ . | |
| UT_JAR_PATH="user-tracking-service/target/user-tracking-service-0.0.1-SNAPSHOT.jar" | |
| fi | |
| echo "user-tracking-service build successful: $UT_JAR_PATH" | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v1 | |
| - name: Log in to Oracle Container Registry | |
| uses: docker/login-action@v2 | |
| with: | |
| registry: ${{ secrets.OCI_REGISTRY }} | |
| username: ${{ secrets.OCI_USERNAME }} | |
| password: ${{ secrets.OCI_AUTH_TOKEN }} | |
| - name: Build and push Docker images | |
| env: | |
| REGISTRY: ${{ secrets.OCI_REGISTRY }} | |
| NAMESPACE: ${{ secrets.OCI_NAMESPACE }} | |
| run: | | |
| echo "Building and pushing Docker images..." | |
| services=("api-gateway" "eureka-server" "recommendation-service" "statistics-service" "user-tracking-service") | |
| for service in "${services[@]}"; do | |
| echo "Building $service..." | |
| JAR_FILE=$(find $service/target -type f -name "*.jar" | head -n 1) | |
| if [ -z "$JAR_FILE" ]; then | |
| echo "Error: No JAR file found for $service" | |
| exit 1 | |
| fi | |
| docker build -t ${REGISTRY}/${NAMESPACE}/$service:latest --build-arg JAR_FILE=$JAR_FILE -f $service/Dockerfile $service | |
| docker push ${REGISTRY}/${NAMESPACE}/$service:latest | |
| echo "$service successfully built and pushed." | |
| done | |
| - name: Log out from Oracle Container Registry | |
| if: always() | |
| run: docker logout ${{ secrets.OCI_REGISTRY }} | |
| deploy: | |
| runs-on: ubuntu-latest | |
| needs: build | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| env: | |
| REGISTRY: ${{ secrets.OCI_REGISTRY }} | |
| OCI_USERNAME: ${{ secrets.OCI_USERNAME }} | |
| OCI_AUTH_TOKEN: ${{ secrets.OCI_AUTH_TOKEN }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Deploy to Oracle VM | |
| env: | |
| ORACLE_VM_IP: ${{ secrets.ORACLE_VM_IP }} | |
| SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }} | |
| DOCKER_REGISTRY: ${{ secrets.OCI_REGISTRY }} | |
| OCI_USERNAME: ${{ secrets.OCI_USERNAME }} | |
| OCI_AUTH_TOKEN: ${{ secrets.OCI_AUTH_TOKEN }} | |
| run: | | |
| # Create SSH key file | |
| echo "$SSH_KEY" > ssh_key.pem | |
| chmod 600 ssh_key.pem | |
| # Verify VM connection | |
| ssh -o StrictHostKeyChecking=no -i ssh_key.pem opc@${ORACLE_VM_IP} "echo VM connection verified" | |
| # Create directory and copy docker-compose file | |
| ssh -o StrictHostKeyChecking=no -i ssh_key.pem opc@${ORACLE_VM_IP} "mkdir -p ~/music-analytics/vm-deploy" | |
| scp -o StrictHostKeyChecking=no -i ssh_key.pem cloud-deploy/docker-compose.direct.yml opc@${ORACLE_VM_IP}:~/music-analytics/vm-deploy/docker-compose.yml | |
| # Execute deployment commands directly | |
| ssh -o StrictHostKeyChecking=no -i ssh_key.pem opc@${ORACLE_VM_IP} "cd ~/music-analytics/vm-deploy && \ | |
| docker login ${DOCKER_REGISTRY} -u ${OCI_USERNAME} -p ${OCI_AUTH_TOKEN} && \ | |
| export ORACLE_EXTERNAL_HOSTNAME=music-analytics.abenezeranglo.uk && \ | |
| export EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka/ && \ | |
| export DOCKER_REGISTRY=${DOCKER_REGISTRY} && \ | |
| docker-compose down --remove-orphans || true && \ | |
| docker-compose pull && \ | |
| docker-compose up -d && \ | |
| docker-compose ps && \ | |
| docker logout ${DOCKER_REGISTRY}" | |
| # Clean up | |
| rm -f ssh_key.pem | |
| - name: Log out from Oracle Container Registry | |
| if: always() | |
| run: docker logout ${{ secrets.OCI_REGISTRY }} |