diff --git a/.github/workflows/update_patterns.yml b/.github/workflows/update_patterns.yml index 3f4f811..2497094 100644 --- a/.github/workflows/update_patterns.yml +++ b/.github/workflows/update_patterns.yml @@ -91,61 +91,99 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: ๐Ÿš€ Create GitHub Release (if previous steps succeeded) - id: create_release - if: success() # Only create release if previous steps were successful - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: ๐Ÿ“ Generate release notes + if: success() + run: | + set -euo pipefail + + BUILD_DATE=$(date -u +'%Y-%m-%d') + + # Latest CRS tag (falls back to v4.0 if API is unreachable) + CRS_REF=$(curl -sfL https://api.github.com/repos/coreruleset/coreruleset/releases/latest \ + | jq -r '.tag_name // "v4.0"' 2>/dev/null || echo "v4.0") + + # OWASP source coverage + TOTAL_RULES=$(jq length owasp_rules.json) + CATEGORIES=$(jq -r '.[].category' owasp_rules.json | sort -u | wc -l | tr -d ' ') + + # Bot pattern counts per backend + NGINX_BOTS=$(grep -c '^\s*"~' waf_patterns/nginx/bots.conf || echo 0) + APACHE_BOTS=$(grep -c '^SecRule REQUEST_HEADERS' waf_patterns/apache/bots.conf || echo 0) + TRAEFIK_BOTS=$(grep -cE '^\s*"' waf_patterns/traefik/bots.toml || echo 0) + HAPROXY_BOTS=$(grep -c '^acl' waf_patterns/haproxy/bots.acl || echo 0) + + # Archive sizes (human-readable) + NGINX_SIZE=$(du -h dist/nginx_waf.zip | cut -f1) + APACHE_SIZE=$(du -h dist/apache_waf.zip | cut -f1) + TRAEFIK_SIZE=$(du -h dist/traefik_waf.zip | cut -f1) + HAPROXY_SIZE=$(du -h dist/haproxy_waf.zip | cut -f1) + + # SHA-256 checksums + NGINX_SHA=$(sha256sum dist/nginx_waf.zip | cut -d' ' -f1) + APACHE_SHA=$(sha256sum dist/apache_waf.zip | cut -d' ' -f1) + TRAEFIK_SHA=$(sha256sum dist/traefik_waf.zip | cut -d' ' -f1) + HAPROXY_SHA=$(sha256sum dist/haproxy_waf.zip | cut -d' ' -f1) + + cat > release_notes.md <