Skip to content

Commit 6d5cb01

Browse files
jmckissonvadi2
andauthored
Add Releases page with downloads organized by game and platform (Mudlet#18)
* initial releases work * fix typos * actually differentiate between linux mac and win for extraction * more robust and verbose extract script * simplify release packaging * fix bad comment * simplify more release steps * dont try azure login on forks * debug artifact discovery * Add releases to release page * try to find releases again * fix download links * fix base url assignment * disable changelog, change some verbage in the release doc * remove unneeded scripts * Update .github/workflows/build.yml Co-authored-by: Vadim Peretokin <vperetokin@hey.com> * Update .github/workflows/build.yml Co-authored-by: Vadim Peretokin <vperetokin@hey.com> * Remove some verbose information --------- Co-authored-by: Vadim Peretokin <vperetokin@hey.com>
1 parent 72e62ff commit 6d5cb01

6 files changed

Lines changed: 270 additions & 4 deletions

File tree

.github/workflows/build.yml

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
name: Build MudletBootstrap
22
on:
33
push:
4-
branches: [master]
4+
branches: [master, development]
5+
tags:
6+
- 'v*' # Add tag trigger for releases
57
pull_request:
68
workflow_dispatch:
79

@@ -164,13 +166,13 @@ jobs:
164166

165167
- name: (Windows) Login to Azure
166168
uses: azure/login@v2
167-
if: runner.os == 'Windows' && github.actor != 'dependabot[bot]' && github.event_name != 'pull_request'
169+
if: runner.os == 'Windows' && github.actor != 'dependabot[bot]' && github.event_name != 'pull_request' && github.repository == 'Mudlet/Mudlet'
168170
with:
169171
creds: ${{ secrets.AZURE_CREDENTIALS }}
170172

171173
- name: Get Azure access token for code signing
172174
shell: pwsh
173-
if: runner.os == 'Windows' && github.actor != 'dependabot[bot]' && github.event_name != 'pull_request'
175+
if: runner.os == 'Windows' && github.actor != 'dependabot[bot]' && github.event_name != 'pull_request' && github.repository == 'Mudlet/Mudlet'
174176
run: |
175177
$token = (az account get-access-token --resource https://codesigning.azure.net | ConvertFrom-Json).accessToken
176178
"::add-mask::$token"
@@ -206,3 +208,112 @@ jobs:
206208
name: ${{env.UPLOAD_FILENAME}}
207209
path: ${{env.FOLDER_TO_UPLOAD}}
208210

211+
release:
212+
if: startsWith(github.ref, 'refs/tags/')
213+
needs: compile
214+
runs-on: ubuntu-latest
215+
216+
steps:
217+
- name: Checkout Source (for GameList.txt)
218+
uses: actions/checkout@v5
219+
220+
- name: Download all platform artifacts
221+
uses: actions/download-artifact@v4
222+
with:
223+
path: ./platform-artifacts
224+
225+
- name: Organize launchers by game
226+
run: |
227+
chmod +x $GITHUB_WORKSPACE/CI/organize-launchers.sh
228+
$GITHUB_WORKSPACE/CI/organize-launchers.sh
229+
230+
- name: Generate release body
231+
run: |
232+
echo "=== Generating release body ==="
233+
234+
# Get repository and tag info
235+
REPO="${{ github.repository }}"
236+
TAG="${{ github.ref_name }}"
237+
BASE_URL="https://github.com/$REPO/releases/download/$TAG"
238+
239+
echo "Base URL: $BASE_URL"
240+
241+
# Start building the release body
242+
cat > release-body.md << 'EOF'
243+
## MudletBootstrap Release ${{ github.ref_name }}
244+
245+
Choose your game below and download the appropriate file for your operating system:
246+
247+
EOF
248+
249+
# Add each game as a section
250+
if [ -d "organized-releases" ]; then
251+
for game_dir in organized-releases/*/; do
252+
if [ -d "$game_dir" ]; then
253+
game_name=$(basename "$game_dir")
254+
echo "### $game_name" >> release-body.md
255+
echo "" >> release-body.md
256+
257+
# Check for each platform
258+
windows_file=$(find "$game_dir" -name "*Windows.exe" | head -1)
259+
macos_file=$(find "$game_dir" -name "*macOS.dmg" | head -1)
260+
linux_file=$(find "$game_dir" -name "*Linux.AppImage.tar" | head -1)
261+
262+
if [ -n "$windows_file" ]; then
263+
filename=$(basename "$windows_file")
264+
echo "- **Windows**: [\`$filename\`]($BASE_URL/$filename)" >> release-body.md
265+
fi
266+
267+
if [ -n "$macos_file" ]; then
268+
filename=$(basename "$macos_file")
269+
echo "- **macOS**: [\`$filename\`]($BASE_URL/$filename)" >> release-body.md
270+
fi
271+
272+
if [ -n "$linux_file" ]; then
273+
filename=$(basename "$linux_file")
274+
echo "- **Linux**: [\`$filename\`]($BASE_URL/$filename)" >> release-body.md
275+
fi
276+
277+
echo "" >> release-body.md
278+
fi
279+
done
280+
fi
281+
282+
# Add installation instructions
283+
cat >> release-body.md << 'EOF'
284+
## Installation Instructions
285+
286+
### Windows
287+
1. Download the `.exe` file for your game
288+
2. Run MudletBootstrap - it'll download & install Mudlet for you
289+
3. You can delete MudletBootstrap after - Mudlet is all set up to play your favourite game.
290+
291+
### macOS
292+
1. Download the `.dmg` file for your game
293+
2. Open the DMG file
294+
3. Runt he MudletBootstrap app from within the mounted DMG
295+
296+
### Linux
297+
1. Download the `.AppImage.tar` file for your game
298+
2. Extract it: `tar -xf MudletBootstrap-[game]-Linux.AppImage.tar`
299+
2. Extract and run the AppImage within: `MudletBootstrap-[game].AppImage`
300+
3. You can delete MudletBootstrap after - Mudlet is all set up to play your favourite
301+
EOF
302+
303+
echo "Generated release body:"
304+
cat release-body.md
305+
306+
- name: Create Release with Game Organization
307+
uses: softprops/action-gh-release@v1
308+
with:
309+
files: organized-releases/**/*
310+
tag_name: ${{ github.ref_name }}
311+
name: MudletBootstrap ${{ github.ref_name }}
312+
body_path: release-body.md
313+
draft: false
314+
prerelease: false
315+
generate_release_notes: false
316+
env:
317+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
318+
319+

CI/deploy-win.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ if [[ ! -d "$uploadDirUnix" ]]; then
5858
mkdir -p "$uploadDirUnix"
5959
fi
6060

61+
# Check if this is a tagged release
62+
IS_RELEASE=false
63+
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
64+
IS_RELEASE=true
65+
echo "=== Building for RELEASE ==="
66+
mkdir -p "${GITHUB_WORKSPACE_UNIX_PATH}/extracted-games"
67+
else
68+
echo "=== Building for regular build ==="
69+
fi
70+
6171
# Set up Java for code signing if Azure token is available
6272
if [ -n "${AZURE_ACCESS_TOKEN}" ]; then
6373
echo "=== Setting up Java 21 for signing ==="
@@ -102,10 +112,23 @@ while IFS= read -r line || [[ -n "$line" ]]; do
102112
#rsync -avR "${PACKAGE_DIR}"/./* "$uploadDirUnix"
103113
cp -r "${PACKAGE_DIR}/"* "$uploadDirUnix"
104114

115+
# If this is a release, also copy to extracted-games with standardized naming
116+
if [ "$IS_RELEASE" = true ]; then
117+
echo "Creating release version for $gameName"
118+
mkdir -p "${GITHUB_WORKSPACE_UNIX_PATH}/extracted-games/$gameName"
119+
cp "${PACKAGE_DIR}/MudletBootstrap-${gameName}.exe" \
120+
"${GITHUB_WORKSPACE_UNIX_PATH}/extracted-games/$gameName/MudletBootstrap-$gameName-Windows.exe"
121+
fi
122+
105123
cd "$GITHUB_WORKSPACE" || exit 1
106124

107125
done < "${GITHUB_WORKSPACE}/GameList.txt"
108126

127+
if [ "$IS_RELEASE" = true ]; then
128+
echo "=== Release files created ==="
129+
find "${GITHUB_WORKSPACE_UNIX_PATH}/extracted-games" -type f | sort
130+
fi
131+
109132
# Append these variables to the GITHUB_ENV to make them available in subsequent steps
110133
{
111134
echo "FOLDER_TO_UPLOAD=${uploadDir}\\"

CI/organize-launchers.sh

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/bin/bash
2+
3+
echo "=== Organizing launchers by game ==="
4+
5+
echo "Listing files in ./platform-artifacts"
6+
ls ./platform-artifacts
7+
8+
# Create organized structure
9+
mkdir -p organized-releases
10+
11+
# Look for extracted-games directories in the downloaded artifacts
12+
echo "Searching for extracted-games directories..."
13+
find ./platform-artifacts -name "extracted-games" -type d | while read extracted_dir; do
14+
echo "Found extracted-games directory: $extracted_dir"
15+
if [ -d "$extracted_dir" ]; then
16+
# Copy all game directories from this platform's extracted-games
17+
cp -r "$extracted_dir"/* organized-releases/ 2>/dev/null || true
18+
fi
19+
done
20+
21+
# If no extracted-games directories found, look for game files in the artifact directories directly
22+
if [ ! "$(ls -A organized-releases 2>/dev/null)" ]; then
23+
echo "No extracted-games directories found, looking for game files in artifact directories..."
24+
25+
# Check each platform artifact directory
26+
for platform_dir in ./platform-artifacts/*/; do
27+
if [ -d "$platform_dir" ]; then
28+
platform_name=$(basename "$platform_dir")
29+
echo "Checking platform directory: $platform_name"
30+
31+
# Look for game launcher files
32+
case "$platform_name" in
33+
*MINGW64*|*Windows*)
34+
echo " Looking for Windows executables..."
35+
find "$platform_dir" -name "*.exe" -type f | while read launcher; do
36+
if [ -f "$launcher" ]; then
37+
filename=$(basename "$launcher")
38+
echo " Found Windows launcher: $filename"
39+
# Extract game name (format: MudletBootstrap-GameName.exe)
40+
if [[ "$filename" =~ MudletBootstrap-(.+)\.exe$ ]]; then
41+
gameName="${BASH_REMATCH[1]}"
42+
echo " Game: $gameName"
43+
mkdir -p "organized-releases/$gameName"
44+
cp "$launcher" "organized-releases/$gameName/MudletBootstrap-$gameName-Windows.exe"
45+
fi
46+
fi
47+
done
48+
;;
49+
*macOS*)
50+
echo " Looking for macOS DMG files..."
51+
find "$platform_dir" -name "*.dmg" -type f | while read launcher; do
52+
if [ -f "$launcher" ]; then
53+
filename=$(basename "$launcher")
54+
echo " Found macOS launcher: $filename"
55+
# Extract game name (format: MudletBootstrap-GameName.dmg)
56+
if [[ "$filename" =~ MudletBootstrap-(.+)\.dmg$ ]]; then
57+
gameName="${BASH_REMATCH[1]}"
58+
echo " Game: $gameName"
59+
mkdir -p "organized-releases/$gameName"
60+
cp "$launcher" "organized-releases/$gameName/MudletBootstrap-$gameName-macOS.dmg"
61+
fi
62+
fi
63+
done
64+
;;
65+
*linux*)
66+
echo " Looking for Linux AppImage files..."
67+
find "$platform_dir" -name "*.AppImage.tar" -type f | while read launcher; do
68+
if [ -f "$launcher" ]; then
69+
filename=$(basename "$launcher")
70+
echo " Found Linux launcher: $filename"
71+
# Extract game name (format: MudletBootstrap-linux-x64-GameName.AppImage.tar)
72+
if [[ "$filename" =~ MudletBootstrap-linux-x64-(.+)\.AppImage\.tar$ ]]; then
73+
gameName="${BASH_REMATCH[1]}"
74+
echo " Game: $gameName"
75+
mkdir -p "organized-releases/$gameName"
76+
cp "$launcher" "organized-releases/$gameName/MudletBootstrap-$gameName-Linux.AppImage.tar"
77+
fi
78+
fi
79+
done
80+
;;
81+
esac
82+
fi
83+
done
84+
fi
85+
86+
echo "Final organized structure:"
87+
find organized-releases -type f | sort

CI/package-linux.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ fi
2525

2626
mkdir "${GITHUB_WORKSPACE}/upload/"
2727

28+
# Check if this is a tagged release
29+
IS_RELEASE=false
30+
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
31+
IS_RELEASE=true
32+
echo "=== Building for RELEASE ==="
33+
mkdir -p "${GITHUB_WORKSPACE}/extracted-games"
34+
else
35+
echo "=== Building for regular build ==="
36+
fi
37+
2838
echo "Working in directory:"
2939
pwd
3040

@@ -67,6 +77,14 @@ while IFS= read -r line || [[ -n "$line" ]]; do
6777

6878
mv "MudletBootstrap-linux-x64.AppImage.tar" "${GITHUB_WORKSPACE}/upload/MudletBootstrap-linux-x64-${gameName}.AppImage.tar"
6979

80+
# If this is a release, also copy to extracted-games with standardized naming
81+
if [ "$IS_RELEASE" = true ]; then
82+
echo "Creating release version for $gameName"
83+
mkdir -p "${GITHUB_WORKSPACE}/extracted-games/$gameName"
84+
cp "${GITHUB_WORKSPACE}/upload/MudletBootstrap-linux-x64-${gameName}.AppImage.tar" \
85+
"${GITHUB_WORKSPACE}/extracted-games/$gameName/MudletBootstrap-$gameName-Linux.AppImage.tar"
86+
fi
87+
7088
rm -rf app/
7189
done < "${GITHUB_WORKSPACE}/GameList.txt"
7290

@@ -75,6 +93,11 @@ echo "=== ... later, via Github ==="
7593

7694
ls ${GITHUB_WORKSPACE}/upload
7795

96+
if [ "$IS_RELEASE" = true ]; then
97+
echo "=== Release files created ==="
98+
find "${GITHUB_WORKSPACE}/extracted-games" -type f | sort
99+
fi
100+
78101
{
79102
echo "FOLDER_TO_UPLOAD=${GITHUB_WORKSPACE}/upload"
80103
echo "UPLOAD_FILENAME=MudletBootstrap-linux-x64"

CI/package-mac.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ npm install -g appdmg
9494

9595
mkdir -p "${GITHUB_WORKSPACE}/upload/"
9696

97+
# Check if this is a tagged release
98+
IS_RELEASE=false
99+
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
100+
IS_RELEASE=true
101+
echo "=== Building for RELEASE ==="
102+
mkdir -p "${GITHUB_WORKSPACE}/extracted-games"
103+
else
104+
echo "=== Building for regular build ==="
105+
fi
106+
97107
while IFS= read -r line || [[ -n "$line" ]]; do
98108
gameName=$(echo "$line" | tr -cd '[:alnum:]_-')
99109
appBaseName="MudletBootstrap"
@@ -166,8 +176,21 @@ while IFS= read -r line || [[ -n "$line" ]]; do
166176

167177
mv "${HOME}/Desktop/${appBaseName}.dmg" "${GITHUB_WORKSPACE}/upload/${appBaseName}-${gameName}.dmg"
168178

179+
# If this is a release, also copy to extracted-games with standardized naming
180+
if [ "$IS_RELEASE" = true ]; then
181+
echo "Creating release version for $gameName"
182+
mkdir -p "${GITHUB_WORKSPACE}/extracted-games/$gameName"
183+
cp "${GITHUB_WORKSPACE}/upload/${appBaseName}-${gameName}.dmg" \
184+
"${GITHUB_WORKSPACE}/extracted-games/$gameName/MudletBootstrap-$gameName-macOS.dmg"
185+
fi
186+
169187
done < "${GITHUB_WORKSPACE}/GameList.txt"
170188

189+
if [ "$IS_RELEASE" = true ]; then
190+
echo "=== Release files created ==="
191+
find "${GITHUB_WORKSPACE}/extracted-games" -type f | sort
192+
fi
193+
171194
{
172195
echo "FOLDER_TO_UPLOAD=${GITHUB_WORKSPACE}/upload"
173196
echo "UPLOAD_FILENAME=${appBaseName}-macOS"

CI/package-win.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ while IFS= read -r line || [[ -n "$line" ]]; do
118118

119119
ZIP_FILE_NAME="MudletBootstrap"
120120

121-
122121
# To determine which system libraries have to be copied in it requires
123122
# continually trying to run the executable on the target type system
124123
# and adding in the libraries to the same directory and repeating that

0 commit comments

Comments
 (0)