feat: streamline deployment workflow by simplifying Maven build steps… #64
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: 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: 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 | |
| # Create deployment directory | |
| ssh -o StrictHostKeyChecking=no -i ssh_key.pem opc@${ORACLE_VM_IP} mkdir -p ~/music-analytics/vm-deploy | |
| # Copy Docker Compose file | |
| 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 | |
| # Create deployment script with environment variables | |
| cat << EOF > deploy.sh | |
| #!/bin/bash | |
| cd ~/music-analytics/vm-deploy | |
| # Set environment variables | |
| export DOCKER_REGISTRY=${DOCKER_REGISTRY} | |
| export ORACLE_EXTERNAL_HOSTNAME=music-analytics.abenezeranglo.uk | |
| export EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka/ | |
| # Stop and clean up existing containers | |
| docker-compose down --remove-orphans || true | |
| docker container prune -f || true | |
| docker image prune -f || true | |
| # Pull and start services | |
| docker-compose pull | |
| docker-compose up -d eureka-server | |
| # Wait for Eureka server to be healthy | |
| echo "Waiting for Eureka server to be healthy..." | |
| for i in \$(seq 1 60); do | |
| if docker-compose ps eureka-server | grep -q "healthy"; then | |
| echo "Eureka server is healthy" | |
| break | |
| fi | |
| if [ \$i -eq 60 ]; then | |
| echo "Timeout waiting for Eureka server to be healthy" | |
| docker-compose logs eureka-server | |
| exit 1 | |
| fi | |
| echo "Waiting... (\$i/60)" | |
| sleep 5 | |
| done | |
| # Start other services | |
| docker-compose up -d api-gateway recommendation-service statistics-service user-tracking-service | |
| # Show status of all services | |
| echo "Service status:" | |
| docker-compose ps | |
| # Show logs if any service is unhealthy | |
| if docker-compose ps | grep -q "unhealthy\|Exit"; then | |
| echo "Some services are unhealthy or exited. Showing logs:" | |
| docker-compose logs | |
| exit 1 | |
| fi | |
| echo "Deployment completed successfully" | |
| EOF | |
| # Copy and execute deployment script | |
| scp -o StrictHostKeyChecking=no -i ssh_key.pem deploy.sh opc@${ORACLE_VM_IP}:~/music-analytics/vm-deploy/ | |
| ssh -o StrictHostKeyChecking=no -i ssh_key.pem opc@${ORACLE_VM_IP} "cd ~/music-analytics/vm-deploy && \ | |
| chmod +x deploy.sh && \ | |
| docker login ${DOCKER_REGISTRY} -u ${OCI_USERNAME} -p ${OCI_AUTH_TOKEN} && \ | |
| ./deploy.sh && \ | |
| docker logout ${DOCKER_REGISTRY}" | |
| # Clean up | |
| rm -f ssh_key.pem deploy.sh | |
| - name: Log out from Oracle Container Registry | |
| if: always() | |
| run: docker logout ${{ secrets.OCI_REGISTRY }} |