diff --git a/.github/workflows/traffic-reporting.yml b/.github/workflows/traffic-reporting.yml new file mode 100644 index 00000000..79512113 --- /dev/null +++ b/.github/workflows/traffic-reporting.yml @@ -0,0 +1,89 @@ +name: Traffic Reporting + +on: + # Run on-demand only + workflow_dispatch: + +jobs: + report-traffic: + runs-on: ubuntu-latest + + permissions: + actions: none + checks: none + contents: read + deployments: none + issues: none + discussions: none + packages: none + pages: none + pull-requests: none + repository-projects: none + security-events: none + statuses: none + + steps: + - name: Fetch GitHub traffic statistics + id: traffic + env: + GH_TOKEN: ${{ secrets.REPORTING_TOKEN }} + REPO: ${{ github.repository }} + run: | + # Fetch page views for the last 14 days + echo "Fetching traffic statistics for ${REPO}..." + + # Get views data + VIEWS_DATA=$(gh api \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/${REPO}/traffic/views) + + echo "Views data retrieved successfully" + echo "$VIEWS_DATA" | jq '.' + + # Save the data to a file for the next step + echo "$VIEWS_DATA" > "$RUNNER_TEMP/traffic_data.json" + + - name: Output traffic data to console + run: | + echo "📊 Traffic data JSON (for debugging):" + echo "========================================" + cat "$RUNNER_TEMP/traffic_data.json" | jq '.' + echo "========================================" + echo "✅ Traffic data output complete!" + + - name: Send traffic data to reporting endpoint + env: + REPORTING_URL: ${{ vars.REPORTING_POST_URL }} + API_KEY: ${{ secrets.REPORTING_API_KEY }} + run: | + echo "📤 Sending traffic data to reporting endpoint..." + + # Validate that REPORTING_URL is set + if [ -z "${REPORTING_URL}" ]; then + echo "❌ Error: REPORTING_URL environment variable is not set. Please configure vars.REPORTING_POST_URL." + exit 1 + fi + + # Validate that REPORTING_URL uses HTTPS + if [[ ! "${REPORTING_URL}" =~ ^https:// ]]; then + echo "❌ Error: REPORTING_URL must start with https:// to ensure secure transmission of sensitive traffic data." + exit 1 + fi + + # Send POST request with API key header, reading file directly + HTTP_STATUS=$(curl -f --max-time 30 --retry 3 -s -o /dev/null -w "%{http_code}" \ + -X POST \ + -H "Content-Type: application/json" \ + -H "X-API-KEY: ${API_KEY}" \ + --data-binary "@${RUNNER_TEMP}/traffic_data.json" \ + "${REPORTING_URL}") + + echo "HTTP Status Code: ${HTTP_STATUS}" + + if [ "${HTTP_STATUS}" -ge 200 ] && [ "${HTTP_STATUS}" -lt 300 ]; then + echo "✅ Traffic data sent successfully!" + else + echo "❌ Error: Failed to send traffic data. Received HTTP status ${HTTP_STATUS}" + exit 1 + fi