From 68e4211fbffdca644acc66af6fcef362d5477e3e Mon Sep 17 00:00:00 2001 From: Micheal Wilkinson Date: Fri, 20 Mar 2026 22:00:11 +0000 Subject: [PATCH] ci: publish coverage artefacts and add badge --- .gitea/workflows/push-validation.yml | 88 +++++++++++++++++++++++++++- README.md | 5 ++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/push-validation.yml b/.gitea/workflows/push-validation.yml index 96a7f6a..10717c2 100644 --- a/.gitea/workflows/push-validation.yml +++ b/.gitea/workflows/push-validation.yml @@ -14,6 +14,14 @@ jobs: defaults: run: shell: bash + env: + ARTEFACT_BUCKET_NAME: ${{ vars.ARTEFACT_BUCKET_NAME }} + ARTEFACT_BUCKET_ENDPONT: ${{ vars.ARTEFACT_BUCKET_ENDPONT }} + ARTEFACT_BUCKET_REGION: ${{ vars.ARTEFACT_BUCKET_REGION }} + AWS_ACCESS_KEY_ID: ${{ secrets.ARTEFACT_BUCKET_WRITE_ACCESS_KEY }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.ARTEFACT_BUCKET_WRITE_ACCESS_SECRET }} + AWS_DEFAULT_REGION: ${{ vars.ARTEFACT_BUCKET_REGION }} + AWS_EC2_METADATA_DISABLED: true steps: - name: Checkout uses: actions/checkout@v4 @@ -26,11 +34,89 @@ jobs: cache: true cache-dependency-path: go.sum + - name: Install AWS CLI v2 + uses: ankurk91/install-aws-cli-action@v1 + + - name: Verify AWS CLI + run: aws --version + - name: Run full unit test suite with coverage + id: coverage run: | set -euo pipefail + go test -covermode=atomic -coverprofile=coverage.out ./... - go tool cover -func=coverage.out + go tool cover -html=coverage.out -o coverage.html + + total="$(go tool cover -func=coverage.out | awk '/^total:/ {sub(/%/, "", $3); print $3}')" + printf '{\n "total": "%s"\n}\n' "$total" > coverage-summary.json + printf 'total=%s\n' "$total" >> "$GITHUB_OUTPUT" + + - name: Generate coverage badge + env: + COVERAGE_TOTAL: ${{ steps.coverage.outputs.total }} + run: | + set -euo pipefail + + color="$(awk -v total="$COVERAGE_TOTAL" 'BEGIN { + if (total >= 80) print "brightgreen"; + else if (total >= 70) print "green"; + else if (total >= 60) print "yellowgreen"; + else if (total >= 50) print "yellow"; + else print "red"; + }')" + + cat > coverage-badge.svg < + + + + + + + + + + + + + + coverage + coverage + ${COVERAGE_TOTAL}% + ${COVERAGE_TOTAL}% + + + EOF + + - name: Upload branch coverage artefacts + id: upload + run: | + set -euo pipefail + + aws configure set default.s3.addressing_style path + + repo_name="${GITHUB_REPOSITORY##*/}" + prefix="${repo_name}/branch/${GITHUB_REF_NAME}" + report_url="${ARTEFACT_BUCKET_ENDPONT%/}/${ARTEFACT_BUCKET_NAME}/${prefix}/coverage.html" + badge_url="${ARTEFACT_BUCKET_ENDPONT%/}/${ARTEFACT_BUCKET_NAME}/${prefix}/coverage-badge.svg" + + aws --endpoint-url "${ARTEFACT_BUCKET_ENDPONT}" s3 cp coverage.html "s3://${ARTEFACT_BUCKET_NAME}/${prefix}/coverage.html" --content-type text/html + aws --endpoint-url "${ARTEFACT_BUCKET_ENDPONT}" s3 cp coverage-badge.svg "s3://${ARTEFACT_BUCKET_NAME}/${prefix}/coverage-badge.svg" --content-type image/svg+xml + aws --endpoint-url "${ARTEFACT_BUCKET_ENDPONT}" s3 cp coverage-summary.json "s3://${ARTEFACT_BUCKET_NAME}/${prefix}/coverage-summary.json" --content-type application/json + + printf 'report_url=%s\n' "$report_url" >> "$GITHUB_OUTPUT" + printf 'badge_url=%s\n' "$badge_url" >> "$GITHUB_OUTPUT" + + - name: Add coverage summary + run: | + { + echo '## Coverage' + echo + echo '- Total: `${{ steps.coverage.outputs.total }}%`' + echo '- Report: ${{ steps.upload.outputs.report_url }}' + echo '- Badge: ${{ steps.upload.outputs.badge_url }}' + } >> "$GITHUB_STEP_SUMMARY" - name: Recommend next release tag on main pushes if: ${{ github.ref == 'refs/heads/main' }} diff --git a/README.md b/README.md index b4934b9..d7bb3c1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # vociferate +[![Main Validation](https://git.hrafn.xyz/aether/vociferate/actions/workflows/push-validation.yml?branch=main&event=push)](https://git.hrafn.xyz/aether/vociferate/actions/workflows/push-validation.yml) +[![Prepare Release](https://git.hrafn.xyz/aether/vociferate/actions/workflows/prepare-release.yml?event=workflow_dispatch)](https://git.hrafn.xyz/aether/vociferate/actions/workflows/prepare-release.yml) +[![Do Release](https://git.hrafn.xyz/aether/vociferate/actions/workflows/do-release.yml?event=push)](https://git.hrafn.xyz/aether/vociferate/actions/workflows/do-release.yml) +[![Coverage](https://s3.hrafn.xyz/aether-workflow-report-artefacts/vociferate/branch/main/coverage-badge.svg)](https://s3.hrafn.xyz/aether-workflow-report-artefacts/vociferate/branch/main/coverage.html) + `vociferate` is an `aether` release orchestration tool written in Go for repositories that want changelog-driven versioning, automated release preparation, and repeatable tag publication.