1- name : Make and Update GitHub Releases (Cleanup + Rebuild)
1+ name : Make and Update GitHub Releases (Weekly Cleanup + Rebuild)
22
33on :
44 workflow_dispatch : {}
55 schedule :
6- - cron : " 0 0 * * *" # daily 00:00 UTC
6+ # Weekly (Sunday 00:00 UTC)
7+ - cron : " 0 0 * * 0"
78
8- # Prevent overlapping runs (schedule + manual, or long matrices)
99concurrency :
1010 group : releases-cleanup-rebuild
1111 cancel-in-progress : false
@@ -15,15 +15,14 @@ permissions:
1515
1616jobs :
1717 cleanup-github-releases :
18- name : 🧹 Cleanup ALL Old Managed Releases & Tags
18+ name : 🧹 Cleanup Old Managed Releases & Tags (2026*)
1919 runs-on : ubuntu-latest
2020 timeout-minutes : 25
2121
2222 env :
2323 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
2424
25- # These prefixes define what this workflow "owns".
26- # Anything whose tag starts with one of these prefixes will be deleted.
25+ # Workflow "ownership" prefixes (only these will be touched)
2726 MANAGED_TAG_PREFIXES : >-
2827 AD-SSO-APIs-Integration
2928 All-Repository-Files
3534 READMEs-Files-Package
3635 SysAdmin-Tools
3736
37+ # Matches your requested "2026xxyyzzwwkk" style (2026 + extra digits).
38+ # Also covers your current pattern: 2026MMDD (8 digits) + optional "-<sha>"
39+ # Examples matched:
40+ # SysAdmin-Tools-20260206-6b43527
41+ # SysAdmin-Tools-20260206010203-6b43527
42+ MANAGED_2026_VERSION_REGEX : ' ^2026[0-9]{4,10}(-[0-9a-f]{7})?$'
43+
3844 steps :
3945 - name : 🧰 Install Dependencies (gh)
4046 shell : bash
4955 set -euo pipefail
5056 gh auth status
5157
52- - name : 🗑️ Delete ALL matching Releases (all pages )
58+ - name : 🗑️ Delete ALL matching Releases (tag prefix + 2026 version )
5359 shell : bash
5460 run : |
5561 set -euo pipefail
@@ -62,45 +68,39 @@ jobs:
6268 for p in ${MANAGED_TAG_PREFIXES}; do
6369 echo " - $p"
6470 done
71+ echo "Version regex: ${MANAGED_2026_VERSION_REGEX}"
6572
66- # List releases via API (paginate), extract tag_name, delete if prefix matches.
67- # This deletes releases regardless of how many you have (no fixed limit).
68- page=1
6973 deleted=0
7074
71- while :; do
72- # 100 per page (max)
73- json="$(gh api --paginate "repos/${owner}/${repo}/releases?per_page=100&page=${page}" || true)"
74- # If empty array or empty response -> stop
75- if [[ -z "${json}" ]] || [[ "${json}" == "[]" ]]; then
76- break
77- fi
78-
79- # Extract "tag_name" lines safely
80- mapfile -t tags < <(printf '%s' "${json}" | gh api --silent --input - --jq '.[].tag_name' 2>/dev/null || true)
81-
82- # If no tags returned, stop
83- if [[ "${#tags[@]}" -eq 0 ]]; then
84- break
85- fi
75+ # Stream tag_name for ALL releases (paginated)
76+ mapfile -t release_tags < <(
77+ gh api --paginate "repos/${owner}/${repo}/releases?per_page=100" --jq '.[].tag_name'
78+ )
8679
87- for tag in "${tags[@]}"; do
80+ if [[ "${#release_tags[@]}" -eq 0 ]]; then
81+ echo "No releases found."
82+ else
83+ for tag in "${release_tags[@]}"; do
8884 for prefix in ${MANAGED_TAG_PREFIXES}; do
89- if [[ "$tag" == "${prefix}"* ]]; then
90- echo "Deleting release: $tag"
91- gh release delete "$tag" -y || true
92- deleted=$((deleted + 1))
85+ # Expected tag formats:
86+ # <prefix>-<version>
87+ # where <version> begins with 2026...
88+ if [[ "$tag" == "${prefix}-"* ]]; then
89+ ver="${tag#${prefix}-}"
90+ if [[ "$ver" =~ ${MANAGED_2026_VERSION_REGEX} ]]; then
91+ echo "Deleting release: ${tag}"
92+ gh release delete "${tag}" -y || true
93+ deleted=$((deleted + 1))
94+ fi
9395 break
9496 fi
9597 done
9698 done
97-
98- page=$((page + 1))
99- done
99+ fi
100100
101101 echo "Deleted releases: ${deleted}"
102102
103- - name : 🗑️ Delete ALL matching Tags (all pages )
103+ - name : 🗑️ Delete ALL matching Tags (tag prefix + 2026 version )
104104 shell : bash
105105 run : |
106106 set -euo pipefail
@@ -110,16 +110,23 @@ jobs:
110110
111111 deleted=0
112112
113- # List all tags via API (paginate). Delete any tag that matches our prefixes.
114- gh api --paginate "repos/${owner}/${repo}/tags?per_page=100" --jq '.[].name' | while read -r tag; do
115- [[ -z "${tag}" ]] && continue
116- for prefix in ${MANAGED_TAG_PREFIXES}; do
117- if [[ "$tag" == "${prefix}"* ]]; then
118- echo "Deleting tag ref: refs/tags/${tag}"
119- # Delete tag reference
113+ # Use git/matching-refs for reliable pagination over tag refs
114+ for prefix in ${MANAGED_TAG_PREFIXES}; do
115+ echo "Scanning tags for prefix: ${prefix}-"
116+
117+ mapfile -t refs < <(
118+ gh api --paginate "repos/${owner}/${repo}/git/matching-refs/tags/${prefix}-" --jq '.[].ref'
119+ )
120+
121+ for ref in "${refs[@]}"; do
122+ # ref like: refs/tags/<tagname>
123+ tag="${ref#refs/tags/}"
124+ ver="${tag#${prefix}-}"
125+
126+ if [[ "$ver" =~ ${MANAGED_2026_VERSION_REGEX} ]]; then
127+ echo "Deleting tag ref: ${ref}"
120128 gh api -X DELETE "repos/${owner}/${repo}/git/refs/tags/${tag}" >/dev/null 2>&1 || true
121129 deleted=$((deleted + 1))
122- break
123130 fi
124131 done
125132 done
@@ -183,6 +190,7 @@ jobs:
183190 [[ -f README.md ]] && cp README.md temp/ || true
184191 [[ -f LICENSE.txt ]] && cp LICENSE.txt temp/ || true
185192 [[ -f LICENSE ]] && cp LICENSE temp/ || true
193+ [[ -f CHANGELOG.md ]] && cp CHANGELOG.md temp/ || true
186194 }
187195
188196 case "$RELEASE_NAME" in
@@ -219,6 +227,7 @@ jobs:
219227 AD-SSO-APIs-Integration)
220228 [[ -d "SysAdmin-Tools/ActiveDirectory-SSO-Integrations" ]] || { echo "::error::Missing dir: SysAdmin-Tools/ActiveDirectory-SSO-Integrations"; exit 1; }
221229 cp -r SysAdmin-Tools/ActiveDirectory-SSO-Integrations/* temp/
230+ copy_root_meta
222231 ;;
223232
224233 *)
0 commit comments