Skip to content

Commit 66d99cf

Browse files
Create make-update-github-releases.bak
Signed-off-by: LUIZ HAMILTON ROBERTO DA SILVA <[email protected]>
1 parent 56d4e07 commit 66d99cf

1 file changed

Lines changed: 280 additions & 0 deletions

File tree

Lines changed: 280 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,280 @@
1+
name: Make and Update GitHub Releases (Weekly Cleanup + Rebuild)
2+
3+
on:
4+
workflow_dispatch: {}
5+
schedule:
6+
# Weekly (Monday 00:00 UTC)
7+
- cron: "0 0 * * 1"
8+
9+
concurrency:
10+
group: releases-cleanup-rebuild
11+
cancel-in-progress: false
12+
13+
permissions:
14+
contents: write
15+
16+
jobs:
17+
cleanup-github-releases:
18+
name: 🧹 Cleanup Old Managed Releases & Tags (managed prefixes)
19+
runs-on: ubuntu-latest
20+
timeout-minutes: 25
21+
22+
env:
23+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24+
25+
# Workflow "ownership" prefixes (only these will be touched)
26+
MANAGED_TAG_PREFIXES: >-
27+
AD-SSO-APIs-Integration
28+
All-Repository-Files
29+
BlueTeam-Tools
30+
Core-ScriptLibrary
31+
GPOs-Templates
32+
ITSM-Templates-SVR
33+
ITSM-Templates-WKS
34+
READMEs-Files-Package
35+
SysAdmin-Tools
36+
37+
steps:
38+
- name: 🧰 Install Dependencies (gh)
39+
shell: bash
40+
run: |
41+
set -euo pipefail
42+
sudo apt-get update
43+
sudo apt-get install -y gh
44+
45+
- name: 🔐 Verify GitHub CLI Auth
46+
shell: bash
47+
run: |
48+
set -euo pipefail
49+
gh auth status
50+
51+
- name: 🗑️ Delete ALL matching Releases (tag_name starts with managed prefix)
52+
shell: bash
53+
run: |
54+
set -euo pipefail
55+
56+
repo="${GITHUB_REPOSITORY}"
57+
owner="${repo%/*}"
58+
name="${repo#*/}"
59+
60+
echo "Repository: ${repo}"
61+
echo "Managed prefixes:"
62+
for p in ${MANAGED_TAG_PREFIXES}; do
63+
echo " - $p"
64+
done
65+
66+
deleted=0
67+
68+
# Get ALL releases (paginated) and extract tag_name
69+
mapfile -t release_tags < <(
70+
gh api --paginate "repos/${owner}/${name}/releases?per_page=100" --jq '.[].tag_name'
71+
)
72+
73+
if [[ "${#release_tags[@]}" -eq 0 ]]; then
74+
echo "No releases found."
75+
exit 0
76+
fi
77+
78+
for tag in "${release_tags[@]}"; do
79+
for prefix in ${MANAGED_TAG_PREFIXES}; do
80+
# Delete ANY release whose tag_name begins with "<prefix>-"
81+
if [[ "$tag" == "${prefix}-"* ]]; then
82+
echo "Deleting release: ${tag}"
83+
# IMPORTANT: release delete uses --repo to avoid "not a git repository"
84+
gh release delete "${tag}" --yes --repo "${repo}" || true
85+
deleted=$((deleted + 1))
86+
break
87+
fi
88+
done
89+
done
90+
91+
echo "Deleted releases: ${deleted}"
92+
93+
- name: 🗑️ Delete ALL matching Tags (name starts with managed prefix)
94+
shell: bash
95+
run: |
96+
set -euo pipefail
97+
98+
repo="${GITHUB_REPOSITORY}"
99+
owner="${repo%/*}"
100+
name="${repo#*/}"
101+
102+
deleted=0
103+
104+
# Use git/matching-refs for reliable pagination over tag refs
105+
for prefix in ${MANAGED_TAG_PREFIXES}; do
106+
echo "Scanning tags for prefix: ${prefix}-"
107+
108+
mapfile -t refs < <(
109+
gh api --paginate "repos/${owner}/${name}/git/matching-refs/tags/${prefix}-" --jq '.[].ref'
110+
)
111+
112+
for ref in "${refs[@]}"; do
113+
# ref like: refs/tags/<tagname>
114+
tag="${ref#refs/tags/}"
115+
echo "Deleting tag ref: ${ref}"
116+
117+
# NOTE: gh api has NO --repo flag. Always use full endpoint.
118+
gh api -X DELETE "repos/${owner}/${name}/git/refs/tags/${tag}" >/dev/null 2>&1 || true
119+
deleted=$((deleted + 1))
120+
done
121+
done
122+
123+
echo "Deleted tags: ${deleted}"
124+
125+
update-github-releases:
126+
name: 🚀 Rebuild Managed Releases
127+
needs: cleanup-github-releases
128+
runs-on: ubuntu-latest
129+
timeout-minutes: 40
130+
131+
strategy:
132+
fail-fast: false
133+
matrix:
134+
release_name:
135+
- AD-SSO-APIs-Integration
136+
- All-Repository-Files
137+
- BlueTeam-Tools
138+
- Core-ScriptLibrary
139+
- GPOs-Templates
140+
- ITSM-Templates-SVR
141+
- ITSM-Templates-WKS
142+
- READMEs-Files-Package
143+
- SysAdmin-Tools
144+
145+
steps:
146+
- name: 📦 Checkout Repository
147+
uses: actions/checkout@v4
148+
with:
149+
fetch-depth: 0
150+
submodules: true
151+
152+
- name: 🧰 Install Dependencies (zip)
153+
shell: bash
154+
run: |
155+
set -euo pipefail
156+
sudo apt-get update
157+
sudo apt-get install -y zip
158+
159+
- name: 🏷️ Compute Version Tag
160+
id: tag
161+
shell: bash
162+
run: |
163+
set -euo pipefail
164+
short_sha="${GITHUB_SHA::7}"
165+
date_tag="$(date -u +%Y%m%d)"
166+
echo "version_tag=${{ matrix.release_name }}-${date_tag}-${short_sha}" >> "$GITHUB_OUTPUT"
167+
168+
- name: 📦 Build Release Artifact
169+
shell: bash
170+
env:
171+
RELEASE_NAME: ${{ matrix.release_name }}
172+
run: |
173+
set -euo pipefail
174+
175+
rm -rf artifacts temp || true
176+
mkdir -p artifacts temp
177+
178+
copy_root_meta() {
179+
[[ -f README.md ]] && cp README.md temp/ || true
180+
[[ -f LICENSE.txt ]] && cp LICENSE.txt temp/ || true
181+
[[ -f LICENSE ]] && cp LICENSE temp/ || true
182+
[[ -f CHANGELOG.md ]] && cp CHANGELOG.md temp/ || true
183+
}
184+
185+
case "$RELEASE_NAME" in
186+
BlueTeam-Tools|Core-ScriptLibrary|ITSM-Templates-SVR|ITSM-Templates-WKS|SysAdmin-Tools)
187+
[[ -d "$RELEASE_NAME" ]] || { echo "::error::Missing dir: $RELEASE_NAME"; exit 1; }
188+
cp -r "$RELEASE_NAME" temp/
189+
copy_root_meta
190+
;;
191+
192+
GPOs-Templates)
193+
[[ -d "SysAdmin-Tools/GroupPolicyObjects-Templates" ]] || { echo "::error::Missing dir: SysAdmin-Tools/GroupPolicyObjects-Templates"; exit 1; }
194+
cp -r SysAdmin-Tools/GroupPolicyObjects-Templates/* temp/
195+
[[ -f SysAdmin-Tools/ActiveDirectory-Management/Export-n-Import-GPOsTool.ps1 ]] && \
196+
cp SysAdmin-Tools/ActiveDirectory-Management/Export-n-Import-GPOsTool.ps1 temp/ || true
197+
copy_root_meta
198+
;;
199+
200+
READMEs-Files-Package)
201+
[[ -f README.md ]] && cp README.md temp/main-README.md || true
202+
find . -type f -iname "README.md" ! -path "./README.md" | while read -r file; do
203+
dir="$(dirname "$file")"
204+
name="$(basename "$dir")"
205+
cp "$file" "temp/${name}-README.md"
206+
done
207+
;;
208+
209+
All-Repository-Files)
210+
for dir in BlueTeam-Tools Core-ScriptLibrary ITSM-Templates-SVR ITSM-Templates-WKS SysAdmin-Tools; do
211+
[[ -d "$dir" ]] && cp -r "$dir" temp/ || echo "::warning::Missing dir (skipped): $dir"
212+
done
213+
copy_root_meta
214+
;;
215+
216+
AD-SSO-APIs-Integration)
217+
[[ -d "SysAdmin-Tools/ActiveDirectory-SSO-Integrations" ]] || { echo "::error::Missing dir: SysAdmin-Tools/ActiveDirectory-SSO-Integrations"; exit 1; }
218+
cp -r SysAdmin-Tools/ActiveDirectory-SSO-Integrations/* temp/
219+
copy_root_meta
220+
;;
221+
222+
*)
223+
echo "::error::Unknown release: $RELEASE_NAME"
224+
exit 1
225+
;;
226+
esac
227+
228+
(cd temp && zip -r "../artifacts/${RELEASE_NAME}.zip" .)
229+
sha256sum "artifacts/${RELEASE_NAME}.zip" > "artifacts/${RELEASE_NAME}.sha256.txt"
230+
231+
- name: 📝 Extract Changelog Section
232+
id: changelog
233+
shell: bash
234+
env:
235+
RELEASE_NAME: ${{ matrix.release_name }}
236+
run: |
237+
set -euo pipefail
238+
if [[ ! -f CHANGELOG.md ]]; then
239+
echo "body=No CHANGELOG.md found in repository root." >> "$GITHUB_OUTPUT"
240+
exit 0
241+
fi
242+
243+
section="## ${RELEASE_NAME}"
244+
body="$(awk -v section="$section" '
245+
$0 == section {found=1; next}
246+
/^## / && found {exit}
247+
found {print}
248+
' CHANGELOG.md | sed -e 's/[[:space:]]\+$//' )"
249+
250+
if [[ -z "${body// }" ]]; then
251+
body="No changelog available for ${RELEASE_NAME}."
252+
fi
253+
254+
echo "body<<EOF" >> "$GITHUB_OUTPUT"
255+
echo "$body" >> "$GITHUB_OUTPUT"
256+
echo "EOF" >> "$GITHUB_OUTPUT"
257+
258+
- name: 🚀 Create/Update GitHub Release (upload assets)
259+
uses: softprops/action-gh-release@v2
260+
with:
261+
tag_name: ${{ steps.tag.outputs.version_tag }}
262+
name: ${{ steps.tag.outputs.version_tag }}
263+
body: ${{ steps.changelog.outputs.body }}
264+
draft: false
265+
prerelease: false
266+
files: |
267+
artifacts/${{ matrix.release_name }}.zip
268+
artifacts/${{ matrix.release_name }}.sha256.txt
269+
env:
270+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
271+
272+
- name: 📦 Upload Build Artifacts (Actions)
273+
if: always()
274+
uses: actions/upload-artifact@v4
275+
with:
276+
name: release-${{ matrix.release_name }}
277+
path: |
278+
artifacts/${{ matrix.release_name }}.zip
279+
artifacts/${{ matrix.release_name }}.sha256.txt
280+
retention-days: 30

0 commit comments

Comments
 (0)