From 099a1c9d5f13ba3a4fdad848dd20fedecb4f84bb Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sat, 7 Jun 2025 16:55:03 +0200 Subject: [PATCH] different CI approach --- .gitea/workflows/ci.yml | 129 ++++++++++++++++++++++++++-------------- README.md | 6 +- 2 files changed, 88 insertions(+), 47 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index ac9bd3e..6a160f7 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -3,6 +3,9 @@ name: Python CI on: push: branches: [ main, master, develop ] + paths-ignore: + - 'coverage*.svg' + - 'README.md' pull_request: branches: [ main, master, develop ] @@ -29,12 +32,16 @@ jobs: # Install common test packages pip install pytest pytest-cov flake8 coverage-badge interrogate - - name: Lint with flake8 + - name: Download initial failed badges run: | - # Stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # Exit-zero treats all errors as warnings - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + echo "Downloading initial failed badges..." + + # Download failed badges as defaults + curl -o coverage.svg "https://img.shields.io/badge/coverage-failed-red.svg" + curl -o coverage-docs.svg "https://img.shields.io/badge/docs-failed-red.svg" + + echo "Initial failed badges created:" + ls -la coverage*.svg - name: Run tests with pytest id: pytest @@ -50,40 +57,32 @@ jobs: # Generate documentation coverage report interrogate -v --ignore-init-method --ignore-init-module --ignore-magic --ignore-private --ignore-property-decorators --ignore-semiprivate --fail-under=80 pyWebLayout/ - - name: Generate coverage badges + - name: Lint with flake8 run: | - COMMIT_HASH=$(git rev-parse --short HEAD) - echo "Generating badges for commit: ${COMMIT_HASH}" + # Stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # Exit-zero treats all errors as warnings + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - # Generate test coverage badge or error badge - if [ "${{ steps.pytest.outcome }}" == "success" ] && [ -f coverage.json ]; then - echo "Generating successful test coverage badge..." - coverage-badge -o coverage-${COMMIT_HASH}.svg - echo "Test coverage badge created: coverage-${COMMIT_HASH}.svg" + - name: Update test coverage badge on success + if: steps.pytest.outcome == 'success' && always() + run: | + echo "Tests passed! Generating successful coverage badge..." + + if [ -f coverage.json ]; then + coverage-badge -o coverage.svg + echo "✅ Test coverage badge updated with actual results" else - echo "Generating error badge for test coverage (pytest outcome: ${{ steps.pytest.outcome }})" - curl -o coverage-${COMMIT_HASH}.svg "https://img.shields.io/badge/coverage-error-red.svg" - echo "Error test coverage badge created: coverage-${COMMIT_HASH}.svg" + echo "⚠️ No coverage.json found, keeping failed badge" fi - # Generate docs coverage badge or error badge - if [ "${{ steps.docs.outcome }}" == "success" ]; then - echo "Generating successful docs coverage badge..." - interrogate --generate-badge coverage-docs-${COMMIT_HASH}.svg pyWebLayout/ - echo "Docs coverage badge created: coverage-docs-${COMMIT_HASH}.svg" - else - echo "Generating error badge for docs coverage (docs outcome: ${{ steps.docs.outcome }})" - curl -o coverage-docs-${COMMIT_HASH}.svg "https://img.shields.io/badge/docs-error-red.svg" - echo "Error docs coverage badge created: coverage-docs-${COMMIT_HASH}.svg" - fi + - name: Update docs coverage badge on success + if: steps.docs.outcome == 'success' && always() + run: | + echo "Docs check passed! Generating successful docs badge..." - # List all SVG files created - echo "SVG files in directory:" - ls -la *.svg || echo "No SVG files found" - echo "Current working directory:" - pwd - echo "All files in current directory:" - ls -la + interrogate --generate-badge coverage-docs.svg pyWebLayout/ + echo "✅ Docs coverage badge updated with actual results" - name: Generate coverage reports if: steps.pytest.outcome == 'success' @@ -105,28 +104,70 @@ jobs: print('No coverage data found') " - - name: Debug artifacts before upload + - name: Final badge status + if: always() run: | - echo "Files matching coverage patterns:" - ls -la coverage-*.svg || echo "No coverage-*.svg files found" - ls -la coverage-docs-*.svg || echo "No coverage-docs-*.svg files found" - ls -la coverage.json || echo "No coverage.json found" - ls -la coverage-summary.txt || echo "No coverage-summary.txt found" - ls -la htmlcov/ || echo "No htmlcov directory found" - echo "All files in current directory:" - ls -la + echo "=== FINAL BADGE STATUS ===" + echo "Test outcome: ${{ steps.pytest.outcome }}" + echo "Docs outcome: ${{ steps.docs.outcome }}" + + if [ -f coverage.svg ]; then + echo "✅ Test coverage badge: $(ls -lh coverage.svg)" + else + echo "❌ Test coverage badge: MISSING" + fi + + if [ -f coverage-docs.svg ]; then + echo "✅ Docs coverage badge: $(ls -lh coverage-docs.svg)" + else + echo "❌ Docs coverage badge: MISSING" + fi + + echo "All SVG files:" + ls -la *.svg 2>/dev/null || echo "No SVG files found" - name: Upload coverage artifacts uses: actions/upload-artifact@v3 with: name: coverage-reports path: | - coverage-*.svg - coverage-docs-*.svg + coverage.svg + coverage-docs.svg htmlcov/ coverage.json coverage-summary.txt + - name: Safety check - prevent infinite loops + if: github.ref == 'refs/heads/master' + run: | + # Check if this is a CI-generated commit + LAST_COMMIT_MSG=$(git log -1 --pretty=%B) + if [[ "$LAST_COMMIT_MSG" == *"[skip ci]"* ]] || [[ "$LAST_COMMIT_MSG" == *"Update coverage badges"* ]]; then + echo "Last commit was CI-generated, skipping badge update to prevent loops" + echo "SKIP_BADGE_COMMIT=true" >> $GITHUB_ENV + else + echo "Safe to update badges" + echo "SKIP_BADGE_COMMIT=false" >> $GITHUB_ENV + fi + + - name: Commit badges to repository + if: github.ref == 'refs/heads/master' && env.SKIP_BADGE_COMMIT != 'true' + run: | + git config --local user.email "action@gitea.local" + git config --local user.name "Gitea Action" + + # Force add the SVG files (ignore .gitignore) + git add -f coverage.svg coverage-docs.svg + + if git diff --staged --quiet; then + echo "No badge changes to commit" + else + echo "Committing updated badges..." + git commit -m "Update coverage badges [skip ci]" + # Use personal access token for push + git push https://${{ secrets.PUSH_TOKEN }}@gitea.tourolle.paris/dtourolle/pyWebLayout.git HEAD:master + fi + - name: Test package installation run: | # Test that the package can be imported diff --git a/README.md b/README.md index 185fca3..221f145 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ ## Project Status + | Badge | Description | |-------|-------------| -| ![Test Coverage](https://gitea.tourolle.paris/dtourolle/pyWebLayout/actions/runs/latest/artifacts/coverage-reports/coverage-9baabc2.svg) | **Test Coverage** - Percentage of code covered by unit tests | -| ![Documentation Coverage](https://gitea.tourolle.paris/dtourolle/pyWebLayout/actions/runs/latest/artifacts/coverage-reports/coverage-docs-9baabc2.svg) | **Documentation Coverage** - Percentage of code with docstrings | -| ![Build Status](./build-status.svg) | **Build Status** - Current CI/CD pipeline status | +| ![Test Coverage](./coverage.svg) | **Test Coverage** - Percentage of code covered by unit tests | +| ![Documentation Coverage](./coverage-docs.svg) | **Documentation Coverage** - Percentage of code with docstrings | | ![License](https://img.shields.io/badge/license-MIT-blue.svg) | **License** - Project licensing information | A Python library for HTML-like layout and rendering. > 📋 **Note**: Badges show results from the commit referenced in the URLs. Red "error" badges indicate build failures for that specific step.