name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
lint:
runs-on: ubuntu-latest
name: Code Quality Check
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 black pylint
pip install -r requirements.txt
- name: Run Black (formatting check)
run: black --check server.py test.py
continue-on-error: true
- name: Run Flake8 (linting)
run: flake8 server.py test.py --max-line-length=100 --ignore=E501,W503
continue-on-error: true
- name: Run Pylint
run: pylint server.py --disable=C0111,R0913,R0914
continue-on-error: true
security:
runs-on: ubuntu-latest
name: Security Scan
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install safety bandit
pip install -r requirements.txt
- name: Run Safety (dependency check)
run: safety check -r requirements.txt
continue-on-error: true
- name: Run Bandit (security linter)
run: bandit -r server.py -ll
continue-on-error: true
- name: Check for secrets
run: |
if grep -r "api.key\|password\|secret" --include="*.py" --exclude-dir=".git" .; then
echo "Warning: Potential secrets found in code"
exit 1
fi
continue-on-error: true
test:
runs-on: ubuntu-latest
name: Run Tests
strategy:
matrix:
python-version: ['3.8', '3.9', '3.10', '3.11']
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run basic import test
run: python -c "import sys; sys.path.insert(0, '.'); import server; print('Import successful')"
- name: Run test script
run: python test.py
env:
ZADARA_VPSA_URL: "https://test.example.com"
ZADARA_VPSA_API_KEY: "test-key"
ZADARA_OBJECT_STORAGE_URL: "https://test.example.com"
ZADARA_OBJECT_ACCESS_KEY: "test-access"
ZADARA_OBJECT_SECRET_KEY: "test-secret"
validate-docs:
runs-on: ubuntu-latest
name: Validate Documentation
steps:
- uses: actions/checkout@v3
- name: Check README exists
run: test -f README.md
- name: Check QUICKSTART exists
run: test -f QUICKSTART.md
- name: Check EXAMPLES exists
run: test -f EXAMPLES.md
- name: Check CONTRIBUTING exists
run: test -f CONTRIBUTING.md
- name: Check CHANGELOG exists
run: test -f CHANGELOG.md
- name: Check SECURITY exists
run: test -f SECURITY.md
- name: Check LICENSE exists
run: test -f LICENSE
- name: Validate markdown links
uses: gaurav-nelson/github-action-markdown-link-check@v1
with:
use-quiet-mode: 'yes'
continue-on-error: true
check-version:
runs-on: ubuntu-latest
name: Version Check
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Check if version updated in CHANGELOG
run: |
if git diff HEAD~1 CHANGELOG.md | grep -q "^+##"; then
echo "Version updated in CHANGELOG"
else
echo "Warning: Consider updating CHANGELOG for this release"
fi
continue-on-error: true
create-release-notes:
runs-on: ubuntu-latest
name: Generate Release Notes
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: [lint, security, test, validate-docs]
steps:
- uses: actions/checkout@v3
- name: Extract version from CHANGELOG
id: version
run: |
VERSION=$(grep -m 1 "## \[" CHANGELOG.md | sed 's/## \[\(.*\)\].*/\1/')
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Create Release Notes
run: |
echo "Release notes for version ${{ steps.version.outputs.version }}" > release-notes.md
echo "" >> release-notes.md
sed -n '/## \['"${{ steps.version.outputs.version }}"'\]/,/## \[/p' CHANGELOG.md | sed '$d' >> release-notes.md
continue-on-error: true