Modern QA2026CI/CD Pipeline Scripts — tiles
Log inJoin
76 / 80 · 12 Programming for QA · Bash Scripting for QA← prev⊞ allnext →☰ Read as one page

9.6CI/CD Pipeline Scripts

GitHub Actions Helper Script

#!/bin/bash
set -euo pipefail

# Parse command line arguments
SUITE="${1:-smoke}"
ENVIRONMENT="${2:-staging}"

echo "Running $SUITE tests against $ENVIRONMENT"

# Set environment-specific variables
case "$ENVIRONMENT" in
    staging)
        export API_BASE_URL="https://api.staging.example.com"
        export DB_HOST="staging-db.internal"
        ;;
    production)
        export API_BASE_URL="https://api.example.com"
        export DB_HOST="prod-db.internal"
        ;;
    *)
        echo "Unknown environment: $ENVIRONMENT"
        exit 1
        ;;
esac

# Run the appropriate test suite
case "$SUITE" in
    smoke)
        pytest tests/ -m smoke --junitxml=results.xml
        ;;
    full)
        pytest tests/ --junitxml=results.xml -n 4
        ;;
    api)
        pytest tests/api/ --junitxml=results.xml
        ;;
    *)
        echo "Unknown suite: $SUITE"
        exit 1
        ;;
esac

Docker-Based Test Runner

#!/bin/bash
set -euo pipefail

echo "=== Building test image ==="
docker build -t test-runner -f Dockerfile.test .

echo "=== Starting dependencies ==="
docker compose -f docker-compose.test.yml up -d db redis

echo "=== Waiting for database ==="
for i in {1..30}; do
    if docker compose -f docker-compose.test.yml exec -T db pg_isready; then
        break
    fi
    sleep 1
done

echo "=== Running tests ==="
docker run --rm \
    --network test-network \
    -e API_BASE_URL=http://app:3000 \
    -e DB_HOST=db \
    -v "$(pwd)/test-results:/app/test-results" \
    test-runner pytest tests/ --junitxml=/app/test-results/results.xml

TEST_EXIT=$?

echo "=== Cleaning up ==="
docker compose -f docker-compose.test.yml down

exit $TEST_EXIT