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