diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index cc8762f..02b0e5e 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -1,60 +1,79 @@ name: CD Pipeline on: - workflow_run: - workflows: ["CI Pipeline"] - types: - - completed - branches: - - dev - - workflow_dispatch: -jobs: + push: + branches: [ "main" ] + paths-ignore: + - '**/*.md' + - '.gitignore' + - '**/.gitignore' + workflow_dispatch: +jobs: build-and-push: name: Build and Push the Docker Container - if: ${{ github.event.workflow_run.conclusion == 'success' }} - runs-on: ubuntu-latest + runs-on: self-hosted + steps: - name: Checkout uses: actions/checkout@v4 + - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Build and push uses: docker/build-push-action@v5 with: context: ./ file: Dockerfile push: true - tags: ${{ secrets.DOCKER_USERNAME }}/spotifyremastered:latest + tags: | + ${{ secrets.DOCKER_USERNAME }}/spotifyremastered:latest + ${{ secrets.DOCKER_USERNAME }}/spotifyremastered:${{ github.sha }} k8s-deployment: name: Deploy the app - runs-on: ubuntu-latest + runs-on: self-hosted needs: [build-and-push] + steps: - - name: Setup Minikube - uses: medyagh/setup-minikube@master - name: Checkout uses: actions/checkout@v4 - - name: Minikube Docker Pull + + - name: Verify Kubernetes Cluster Access run: | - docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} - docker pull ${{ secrets.DOCKER_USERNAME }}/spotifyremastered:latest - minikube image load ${{ secrets.DOCKER_USERNAME }}/spotifyremastered:latest + echo "Checking Kubernetes cluster connection..." + kubectl cluster-info + kubectl get nodes + - name: Deploy to Kubernetes run: | - kubectl apply -f k8s/ - kubectl rollout status deployment/spotify-remastered --timeout=5m - - name: Rollback Deployment (if failed) + kubectl apply -f k8s/namespace.yaml + kubectl apply -f k8s/deployment.yaml + kubectl apply -f k8s/service.yaml + + echo "Forcing rollout restart to pull latest image..." + kubectl rollout restart deployment/spotify-remastered -n spotify-app + + - name: Wait for Rollout to Complete + run: | + echo "Waiting for deployment to be ready..." + kubectl rollout status deployment/spotify-remastered -n spotify-app --timeout=5m + + - name: Verify Deployment + run: | + echo "Deployment successful! Current status:" + kubectl get pods -n spotify-app + kubectl get services -n spotify-app + + - name: Rollback on Failure if: failure() run: | - kubectl rollout undo deployment/spotify-remastered - - name: Check Kubernetes Status - run: kubectl get all - - name: Stop Minikube - run: minikube stop \ No newline at end of file + echo "Deployment failed! Rolling back to previous version..." + kubectl rollout undo deployment/spotify-remastered -n spotify-app + kubectl rollout status deployment/spotify-remastered -n spotify-app --timeout=3m \ No newline at end of file diff --git a/README-devops.md b/README-devops.md index 8e2792d..7317ce5 100644 --- a/README-devops.md +++ b/README-devops.md @@ -24,12 +24,11 @@ Key pipeline steps include: - Builds Docker image. - Runs Trivy for Docker vulnerability scanning. 3. **Continuous Delivery (CD) to Kubernetes (K8s):** - - Triggered after a successful CI run on `dev`. - - **Docker Push:** Pushes the Docker image to Docker Hub. - - **Kubernetes Deployment:** - - Uses Minikube for testing. - - Deploys the built image using Kubernetes manifests from the `/k8s` directory. - - Monitors rollout and enables rollback on deployment failure. + - Triggered on push to `main` or manually via workflow dispatch. + - **Two-stage pipeline:** + - **Build & Push:** Builds and pushes Docker image to Docker Hub with `latest` and commit SHA tags. + - **Deploy:** Applies Kubernetes manifests (namespace, deployment, service) to local Minikube cluster via self-hosted runner. + - Features rolling restart, deployment monitoring, and automatic rollback on failure. ### Future Improvements - Add a relational database (e.g., PostgreSQL) for user profiles, playlists, or playback history.