-
Notifications
You must be signed in to change notification settings - Fork 25
106 lines (90 loc) · 5.02 KB
/
deployment-report.yml
File metadata and controls
106 lines (90 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
name: Deployment Frequency Report
on:
schedule:
# Every Monday at 08:00 UTC
- cron: "0 8 * * 1"
workflow_dispatch:
inputs:
days:
description: "Number of days to look back"
required: false
default: "30"
type: string
permissions:
contents: read
actions: read
jobs:
report:
name: Generate Deployment Report
runs-on: ubuntu-latest
env:
DAYS: ${{ inputs.days || '30' }}
steps:
- name: Calculate date range
id: dates
run: |
END_DATE=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
START_DATE=$(date -u -d "${{ env.DAYS }} days ago" '+%Y-%m-%dT%H:%M:%SZ')
echo "start=$START_DATE" >> $GITHUB_OUTPUT
echo "end=$END_DATE" >> $GITHUB_OUTPUT
echo "start_display=$(date -u -d "${{ env.DAYS }} days ago" '+%Y-%m-%d')" >> $GITHUB_OUTPUT
echo "end_display=$(date -u '+%Y-%m-%d')" >> $GITHUB_OUTPUT
- name: Collect workflow run data
id: collect
env:
GH_TOKEN: ${{ github.token }}
run: |
# -------------------------------------------------------
# Query GitHub API for workflow runs of each CD workflow
# -------------------------------------------------------
declare -A WORKFLOWS=(
["react-editor"]="react-editor.yml"
["react-subscriber"]="react-subscriber.yml"
["folder-collection"]="folder-collection-cicd.yml"
["api-services"]="api-services-cicd.yml"
)
REPORT_FILE=$(mktemp)
echo "report_file=$REPORT_FILE" >> $GITHUB_OUTPUT
for svc in "${!WORKFLOWS[@]}"; do
wf_file="${WORKFLOWS[$svc]}"
# Fetch completed runs within the date window (push + workflow_dispatch only — these are deploys)
RUNS_JSON=$(gh api \
"repos/${{ github.repository }}/actions/workflows/${wf_file}/runs?status=completed&created=>=${{ steps.dates.outputs.start }}&per_page=100" \
--jq '.workflow_runs')
# --- Dev deployments (branch: dev) ---
DEV_TOTAL=$(echo "$RUNS_JSON" | jq '[.[] | select(.event == "push" or .event == "workflow_dispatch") | select(.head_branch == "dev")] | length')
DEV_SUCCESS=$(echo "$RUNS_JSON" | jq '[.[] | select(.event == "push" or .event == "workflow_dispatch") | select(.head_branch == "dev") | select(.conclusion == "success")] | length')
DEV_FAILURE=$(echo "$RUNS_JSON" | jq '[.[] | select(.event == "push" or .event == "workflow_dispatch") | select(.head_branch == "dev") | select(.conclusion == "failure")] | length')
# --- Test deployments (branch: master) ---
TEST_TOTAL=$(echo "$RUNS_JSON" | jq '[.[] | select(.event == "push" or .event == "workflow_dispatch") | select(.head_branch == "master")] | length')
TEST_SUCCESS=$(echo "$RUNS_JSON" | jq '[.[] | select(.event == "push" or .event == "workflow_dispatch") | select(.head_branch == "master") | select(.conclusion == "success")] | length')
TEST_FAILURE=$(echo "$RUNS_JSON" | jq '[.[] | select(.event == "push" or .event == "workflow_dispatch") | select(.head_branch == "master") | select(.conclusion == "failure")] | length')
# Calculate success rates
if [ "$DEV_TOTAL" -gt 0 ]; then
DEV_RATE=$(awk "BEGIN {printf \"%.1f\", ($DEV_SUCCESS/$DEV_TOTAL)*100}")%
else
DEV_RATE="N/A"
fi
if [ "$TEST_TOTAL" -gt 0 ]; then
TEST_RATE=$(awk "BEGIN {printf \"%.1f\", ($TEST_SUCCESS/$TEST_TOTAL)*100}")%
else
TEST_RATE="N/A"
fi
echo "${svc}|dev|${DEV_TOTAL}|${DEV_SUCCESS}|${DEV_FAILURE}|${DEV_RATE}" >> "$REPORT_FILE"
echo "${svc}|test|${TEST_TOTAL}|${TEST_SUCCESS}|${TEST_FAILURE}|${TEST_RATE}" >> "$REPORT_FILE"
done
- name: Render report
run: |
REPORT_FILE="${{ steps.collect.outputs.report_file }}"
echo "## 📊 Deployment Frequency & Success Rate Report" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Period**: ${{ steps.dates.outputs.start_display }} — ${{ steps.dates.outputs.end_display }} (${{ env.DAYS }} days)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Service | Environment | Total Deploys | ✅ Success | ❌ Failure | Success Rate |" >> $GITHUB_STEP_SUMMARY
echo "|---------|-------------|:------------:|:----------:|:----------:|:------------:|" >> $GITHUB_STEP_SUMMARY
while IFS='|' read -r service env total success failure rate; do
echo "| ${service} | ${env} | ${total} | ${success} | ${failure} | ${rate} |" >> $GITHUB_STEP_SUMMARY
done < "$REPORT_FILE"
echo "" >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "*Generated by [Workflow #${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) at $(date -u '+%Y-%m-%d %H:%M:%S') UTC*" >> $GITHUB_STEP_SUMMARY