Revise README for deployment modes and CI updates #16
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: Build and Deploy | |
| on: | |
| push: | |
| branches: [ main ] | |
| jobs: | |
| build-and-push: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Log in to secrets | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Build and Push client | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: ./client | |
| push: true | |
| tags: | | |
| ${{ secrets.DOCKERHUB_USERNAME }}/client:${{ github.run_number }} | |
| ${{ secrets.DOCKERHUB_USERNAME }}/client:latest | |
| - name: Build and Push server | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: ./server | |
| push: true | |
| tags: | | |
| ${{ secrets.DOCKERHUB_USERNAME }}/server:${{ github.run_number }} | |
| ${{ secrets.DOCKERHUB_USERNAME }}/server:latest | |
| deploy: | |
| runs-on: ubuntu-latest | |
| needs: build-and-push | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Create k8s cluster with kind | |
| uses: helm/kind-action@v1.10.0 | |
| with: | |
| cluster_name: todo-cluster | |
| - name: Update image tags | |
| run: | | |
| sed -i "s|image: ${{ secrets.DOCKERHUB_USERNAME }}/server:.*|image: ${{ secrets.DOCKERHUB_USERNAME }}/server:${{ github.run_number }}|" k8s/backend/deployment.yaml | |
| sed -i "s|image: ${{ secrets.DOCKERHUB_USERNAME }}/client:.*|image: ${{ secrets.DOCKERHUB_USERNAME }}/client:${{ github.run_number }}|" k8s/frontend/deployment.yaml | |
| - name: Deploy to kind | |
| run: | | |
| kubectl apply --validate=false -f k8s/postgres/secret.yaml | |
| kubectl apply --validate=false -f k8s/postgres/deployment.yaml | |
| kubectl apply --validate=false -f k8s/backend/deployment.yaml | |
| kubectl apply --validate=false -f k8s/frontend/deployment.yaml | |
| - name: Wait for pods | |
| run: | | |
| kubectl wait --for=condition=ready pod -l app=postgres --timeout=120s | |
| # Wait for postgres to actually accept connections | |
| kubectl exec $(kubectl get pod -l app=postgres -o jsonpath="{.items[0].metadata.name}") -- sh -c "until pg_isready -h 127.0.0.1 -U postgres; do echo 'waiting for postgres...'; sleep 2; done" | |
| # Now create the table | |
| kubectl exec $(kubectl get pod -l app=postgres -o jsonpath="{.items[0].metadata.name}") -- psql -h 127.0.0.1 -U postgres -d todo_db -c "CREATE TABLE IF NOT EXISTS todo (todo_id SERIAL PRIMARY KEY, description VARCHAR(255));" | |
| kubectl wait --for=condition=ready pod -l app=backend --timeout=120s | |
| kubectl wait --for=condition=ready pod -l app=frontend --timeout=120s | |
| - name: Verify deployment | |
| run: | | |
| kubectl get pods | |
| kubectl get services | |
| # Test the API works | |
| kubectl port-forward service/frontend 8080:80 & | |
| sleep 5 | |
| curl http://localhost:8080/api/todos |