Backend & Frontend CI #24
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
| # week07/.github/workflows/backend_ci.yml | |
| name: Backend CI - Test, Build and Push Images to ACR | |
| # Trigger the workflow on pushes to the 'main' branch | |
| # You can also add 'pull_request:' to run on PRs | |
| on: | |
| # Manual trigger | |
| workflow_dispatch: | |
| # Automatically on pushes to main branch | |
| push: | |
| branches: | |
| - main | |
| paths: # Only trigger if changes are in backend directories | |
| - 'backend/**' | |
| - '.github/workflows/backend_ci.yml' # Trigger if this workflow file changes | |
| # Define global environment variables that can be used across jobs | |
| env: | |
| # ACR Login Server (e.g., myregistry.azurecr.io) | |
| # This needs to be set as a GitHub Repository Secret | |
| ACR_LOGIN_SERVER: ${{ secrets.ACR_LOGIN_SERVER }} | |
| # Dynamically generate image tags based on Git SHA and GitHub Run ID | |
| # This provides unique, traceable tags for each image build | |
| IMAGE_TAG: ${{ github.sha }}-${{ github.run_id }} | |
| jobs: | |
| # Job 1: Run tests and linting for all backend services | |
| test_and_lint_backends: | |
| runs-on: ubuntu-latest # Use a GitHub-hosted runner | |
| services: | |
| # Product DB container | |
| product_db: | |
| image: postgres:15 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| POSTGRES_DB: products | |
| # Make pg_isready available so the service is healthy before tests run | |
| options: >- | |
| --health-cmd "pg_isready -U postgres" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| ports: | |
| - 5432:5432 | |
| # Order DB | |
| order_db: | |
| image: postgres:15 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| POSTGRES_DB: orders | |
| ports: | |
| - 5433:5432 | |
| options: >- | |
| --health-cmd "pg_isready -U postgres" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| # 1. Checkout the repository code to the runner | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 # Action to check out your repository code | |
| # 2. Set up Python environment | |
| - name: Set up Python 3.10 | |
| uses: actions/setup-python@v5 # Action to set up Python environment | |
| with: | |
| python-version: '3.10' | |
| # 3. Install dependencies and run code quality checks | |
| - name: Install dependencies | |
| run: | # Use a multi-line script to install pip dependencies | |
| pip install --upgrade pip | |
| # Loop through each backend service folder | |
| for req in backend/*/requirements.txt; do | |
| echo "Installing $req" | |
| pip install -r "$req" | |
| done | |
| # Install CI tools | |
| pip install pytest httpx | |
| # 5. Run tests for product service | |
| - name: Run product_service tests | |
| working-directory: backend/product_service | |
| env: | |
| POSTGRES_HOST: localhost | |
| POSTGRES_PORT: 5432 | |
| POSTGRES_DB: products | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| run: | | |
| pytest tests --maxfail=1 --disable-warnings -q | |
| # 6. Run tests for order service | |
| - name: Run order_service tests | |
| working-directory: backend/order_service | |
| env: | |
| POSTGRES_HOST: localhost | |
| POSTGRES_PORT: 5433 | |
| POSTGRES_DB: orders | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| run: | | |
| pytest tests --maxfail=1 --disable-warnings -q | |
| # Job 2: Build and Push Docker Images (runs only if tests pass) | |
| build_and_push_images: | |
| runs-on: ubuntu-latest | |
| needs: test_and_lint_backends | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| # Azure login using a Service Principal secret | |
| - name: Azure Login | |
| uses: azure/login@v1 | |
| with: | |
| creds: ${{ secrets.AZURE_CREDENTIALS }} # Needs to be set as a GitHub Secret (Service Principal JSON) | |
| # Login to Azure Container Registry (ACR) | |
| - name: Login to Azure Container Registry | |
| run: az acr login --name ${{ env.ACR_LOGIN_SERVER }} | |
| # Build and Push Docker image for Product Service | |
| - name: Build and Push Product Service Image | |
| run: | | |
| docker build -t ${{ env.ACR_LOGIN_SERVER }}/product_service:latest ./backend/product_service/ | |
| docker push ${{ env.ACR_LOGIN_SERVER }}/product_service:latest | |
| # Build and Push Docker image for Order Service | |
| - name: Build and Push Order Service Image | |
| run: | | |
| docker build -t ${{ env.ACR_LOGIN_SERVER }}/order_service:latest ./backend/order_service/ | |
| docker push ${{ env.ACR_LOGIN_SERVER }}/order_service:latest | |
| # Logout from Azure for security (runs even if image push fails) | |
| - name: Logout from Azure | |
| run: az logout | |
| if: always() |