1- name : Publish Release (About Time )
1+ name : Publish Pre/ Release (Module-Agnostic 2.0 )
22
33on :
44 workflow_dispatch :
55 inputs :
66 version :
7- description : " Module version (e.g. 13.0.5 )"
7+ description : " Module version (e.g. 13.0.0.0 )"
88 required : true
99 type : string
10- prerelease :
11- description : " Mark as pre-release?"
12- required : false
13- default : false
14- type : boolean
10+ release_type :
11+ description : " Mark release as"
12+ required : true
13+ type : choice
14+ options :
15+ - pre-release
16+ - release (latest)
1517 draft :
1618 description : " Create as draft?"
1719 required : false
1820 default : false
1921 type : boolean
20- make_latest :
21- description : " Make this the 'latest' release? (true | false | legacy)"
22- required : false
23- default : " true"
22+ release_notes_mode :
23+ description : " Release notes"
24+ required : true
2425 type : choice
25- options : [ "true", "false", "legacy" ]
26+ options :
27+ - auto
28+ - releaseNotes.md (fallback to auto)
2629
2730permissions :
2831 contents : write
5053 sudo apt-get update
5154 sudo apt-get install -y jq zip
5255
56+ - name : Compute package names & URLs
57+ id : pkg
58+ shell : bash
59+ run : |
60+ set -euo pipefail
61+ REPO_FULL="${GITHUB_REPOSITORY}" # owner/repo
62+ REPO_NAME="${REPO_FULL##*/}" # repo
63+ VERSION="${{ inputs.version }}"
64+ TAG="v${VERSION}"
65+ ZIPNAME="${REPO_NAME}.zip"
66+
67+ echo "repo_name=${REPO_NAME}" >> "$GITHUB_OUTPUT"
68+ echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
69+ echo "zip_name=${ZIPNAME}" >> "$GITHUB_OUTPUT"
70+ echo "manifest_url=https://github.com/${REPO_FULL}/releases/download/${TAG}/module.json" >> "$GITHUB_OUTPUT"
71+ echo "download_url=https://github.com/${REPO_FULL}/releases/download/${TAG}/${ZIPNAME}" >> "$GITHUB_OUTPUT"
72+
73+ - name : Compute release flags
74+ id : flags
75+ shell : bash
76+ run : |
77+ set -euo pipefail
78+ case "${{ inputs.release_type }}" in
79+ "pre-release")
80+ echo "prerelease=true" >> "$GITHUB_OUTPUT"
81+ echo "make_latest=false" >> "$GITHUB_OUTPUT"
82+ ;;
83+ "release (latest)")
84+ echo "prerelease=false" >> "$GITHUB_OUTPUT"
85+ echo "make_latest=true" >> "$GITHUB_OUTPUT"
86+ ;;
87+ *)
88+ echo "Unknown release_type: ${{ inputs.release_type }}" >&2
89+ exit 1
90+ ;;
91+ esac
92+
93+ case "${{ inputs.release_notes_mode }}" in
94+ "auto"|"releaseNotes.md (fallback to auto)")
95+ echo "release_notes_mode=${{ inputs.release_notes_mode }}" >> "$GITHUB_OUTPUT"
96+ ;;
97+ *)
98+ echo "Unknown release_notes_mode: ${{ inputs.release_notes_mode }}" >&2
99+ exit 1
100+ ;;
101+ esac
102+
53103 - name : Validate module.json presence
54104 run : |
55105 test -f module.json || (echo "module.json not found at repo root." && exit 1)
@@ -58,11 +108,10 @@ jobs:
58108 shell : bash
59109 run : |
60110 set -euo pipefail
61- REPO="${GITHUB_REPOSITORY}"
62111 VERSION="${{ inputs.version }}"
63112
64- MANIFEST_URL="https://github.com/${REPO}/releases/latest/download/module.json "
65- DOWNLOAD_URL="https://github.com/${REPO}/releases/latest/download/about-time-next.zip "
113+ MANIFEST_URL="${{ steps.pkg.outputs.manifest_url }} "
114+ DOWNLOAD_URL="${{ steps.pkg.outputs.download_url }} "
66115
67116 cp module.json module.json.bak
68117
98147 shell : bash
99148 run : |
100149 set -euo pipefail
101- ZIPNAME="about-time-next.zip "
150+ ZIPNAME="${{ steps.pkg.outputs.zip_name }} "
102151 rm -f "$ZIPNAME"
103152 # Create a clean ZIP with module files at the root.
104153 zip -r "$ZIPNAME" . \
@@ -113,20 +162,139 @@ jobs:
113162
114163 - name : Verify release assets exist
115164 run : |
116- test -f about-time-next.zip || (echo "about-time-next.zip missing"; exit 1)
165+ test -f "${{ steps.pkg.outputs.zip_name }}" || (echo "ZIP missing: ${{ steps.pkg.outputs.zip_name }} "; exit 1)
117166 test -f module.json || (echo "module.json missing"; exit 1)
118167
119- - name : Create/Update GitHub Release & Upload Assets
168+ - name : Build release notes from releaseNotes.md (fallback to auto)
169+ id : file_notes
170+ if : ${{ steps.flags.outputs.release_notes_mode == 'releaseNotes.md (fallback to auto)' }}
171+ shell : bash
172+ run : |
173+ set -euo pipefail
174+
175+ NOTES_FILE=".github/devFolder/posts/releaseNotes.md"
176+ if [ ! -f "$NOTES_FILE" ]; then
177+ echo "found=false" >> "$GITHUB_OUTPUT"
178+ echo "Release notes file not found: $NOTES_FILE. Will fall back to auto." >&2
179+ exit 0
180+ fi
181+
182+ # Extract the newest/top entry: from start of file until the first '---' separator line.
183+ awk '
184+ /^[[:space:]]*---[[:space:]]*$/ { exit }
185+ { print }
186+ ' "$NOTES_FILE" > release_body_file.md
187+
188+ if [ ! -s release_body_file.md ]; then
189+ echo "found=false" >> "$GITHUB_OUTPUT"
190+ echo "Release notes file exists but the extracted top entry was empty. Will fall back to auto." >&2
191+ exit 0
192+ fi
193+
194+ {
195+ echo
196+ echo "### Pinned URLs"
197+ echo
198+ echo "\`Manifest\`: ${{ steps.pkg.outputs.manifest_url }}"
199+ echo "\`Download\`: ${{ steps.pkg.outputs.download_url }}"
200+ } >> release_body_file.md
201+
202+ echo "found=true" >> "$GITHUB_OUTPUT"
203+
204+ - name : Generate auto release notes (and append tagged URLs)
205+ id : auto_notes
206+ if : ${{ steps.flags.outputs.release_notes_mode == 'auto' || (steps.flags.outputs.release_notes_mode == 'releaseNotes.md (fallback to auto)' && steps.file_notes.outputs.found != 'true') }}
207+ uses : actions/github-script@v7
208+ env :
209+ TAG : ${{ steps.pkg.outputs.tag }}
210+ MANIFEST_URL : ${{ steps.pkg.outputs.manifest_url }}
211+ DOWNLOAD_URL : ${{ steps.pkg.outputs.download_url }}
212+ with :
213+ script : |
214+ const tag = process.env.TAG;
215+ const manifestUrl = process.env.MANIFEST_URL;
216+ const downloadUrl = process.env.DOWNLOAD_URL;
217+
218+ // Uses GitHub's release notes generator so you still get the normal
219+ // auto-generated content, but we can append the pinned URLs.
220+ const resp = await github.rest.repos.generateReleaseNotes({
221+ owner: context.repo.owner,
222+ repo: context.repo.repo,
223+ tag_name: tag,
224+ target_commitish: context.sha,
225+ });
226+
227+ const generated = resp?.data?.body ?? '';
228+ const appended = `${generated}\n\n### Pinned URLs\n\n\`Manifest\`: ${manifestUrl}\n\`Download\`: ${downloadUrl}\n`;
229+
230+ const fs = require('fs');
231+ fs.writeFileSync('release_body_auto.md', appended, 'utf8');
232+
233+ - name : Create/Update GitHub Release (Auto notes) & Upload Assets
234+ if : ${{ steps.flags.outputs.release_notes_mode == 'auto' || (steps.flags.outputs.release_notes_mode == 'releaseNotes.md (fallback to auto)' && steps.file_notes.outputs.found != 'true') }}
120235 uses : softprops/action-gh-release@v2
121236 with :
122- tag_name : v ${{ inputs.version }}
123- name : v ${{ inputs.version }}
237+ tag_name : ${{ steps.pkg.outputs.tag }}
238+ name : ${{ steps.pkg.outputs.tag }}
124239 draft : ${{ inputs.draft }}
125- prerelease : ${{ inputs.prerelease }}
126- make_latest : ${{ inputs.make_latest }}
127- generate_release_notes : true
240+ prerelease : ${{ steps.flags.outputs.prerelease }}
241+ make_latest : ${{ steps.flags.outputs.make_latest }}
242+ generate_release_notes : false
243+ body_path : release_body_auto.md
128244 files : |
129- about-time-next.zip
245+ ${{ steps.pkg.outputs.zip_name }}
130246 module.json
131247 env :
132248 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
249+
250+ - name : Create/Update GitHub Release (releaseNotes.md) & Upload Assets
251+ if : ${{ steps.flags.outputs.release_notes_mode == 'releaseNotes.md (fallback to auto)' && steps.file_notes.outputs.found == 'true' }}
252+ uses : softprops/action-gh-release@v2
253+ with :
254+ tag_name : ${{ steps.pkg.outputs.tag }}
255+ name : ${{ steps.pkg.outputs.tag }}
256+ draft : ${{ inputs.draft }}
257+ prerelease : ${{ steps.flags.outputs.prerelease }}
258+ make_latest : ${{ steps.flags.outputs.make_latest }}
259+ generate_release_notes : false
260+ body_path : release_body_file.md
261+ files : |
262+ ${{ steps.pkg.outputs.zip_name }}
263+ module.json
264+ env :
265+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
266+
267+ - name : Write workflow summary
268+ shell : bash
269+ run : |
270+ set -euo pipefail
271+
272+ VERSION="${{ inputs.version }}"
273+ MANIFEST_URL="${{ steps.pkg.outputs.manifest_url }}"
274+ DOWNLOAD_URL="${{ steps.pkg.outputs.download_url }}"
275+ RELEASE_URL="https://github.com/${GITHUB_REPOSITORY}/releases/tag/${{ steps.pkg.outputs.tag }}"
276+
277+ {
278+ echo "## Release Summary"
279+ echo
280+ echo "- Repository: ${{ steps.pkg.outputs.repo_name }}"
281+ echo "- Version: ${VERSION}"
282+ echo "- Release Type: ${{ inputs.release_type }}"
283+ echo "- Draft?: ${{ inputs.draft }}"
284+ echo "- Manifest URL: ${MANIFEST_URL}"
285+ echo "- Download URL: ${DOWNLOAD_URL}"
286+ echo "- Release Page: ${RELEASE_URL}"
287+ echo "- Release Note Type: ${{ steps.flags.outputs.release_notes_mode }}"
288+ echo
289+ echo "### Release Note"
290+
291+ if [ "${{ steps.flags.outputs.release_notes_mode }}" = "releaseNotes.md (fallback to auto)" ] && [ "${{ steps.file_notes.outputs.found || '' }}" = "true" ]; then
292+ echo
293+ echo '```md'
294+ cat release_body_file.md
295+ echo '```'
296+ else
297+ echo
298+ echo "(Auto-generated by GitHub Releases; see the release page body.)"
299+ fi
300+ } >> "$GITHUB_STEP_SUMMARY"
0 commit comments