Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 46 additions & 27 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -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
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
11 changes: 5 additions & 6 deletions README-devops.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Loading