-
Notifications
You must be signed in to change notification settings - Fork 73
262 lines (227 loc) · 9.7 KB
/
main.yml
File metadata and controls
262 lines (227 loc) · 9.7 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
name: CI
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
# This workflow contains a single job called "build"
build:
permissions:
contents: write
runs-on: windows-2022
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Step to check if the commit message contains #GITBUILD
- name: Check Commit Message
shell: powershell
run: |
# Get the commit message
$strVal ='${{ github.event. head_commit.message }}'
# Convert commit message to a single line if multiline
$singleLineStrVal = $strVal -replace "`r`n", " " -replace "`n", " "
if ($singleLineStrVal -match '#GITBUILD') {
Write-Host 'Build commit detected. Proceeding with build...'
echo "build_trigger=true" >> $env:GITHUB_ENV
} else {
Write-Host 'No build commit. Skipping build steps...'
echo "build_trigger=false" >> $env:GITHUB_ENV
}
# Step to ensure the repository is checked out
- uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true
# Inform if build steps are skipped
- name: Inform Skipped Build Steps
if: env.build_trigger != 'true'
shell: powershell
run: |
Write-Host "Skipping build steps because the commit message does not contain #GITBUILD."
# Install 7Zip PowerShell module
- name: Install 7Zip PowerShell Module
if: env.build_trigger == 'true'
shell: powershell
run: Install-Module 7Zip4PowerShell -Force -Verbose
# Restore NuGet packages
- name: Restore NuGet packages
if: env.build_trigger == 'true'
run: nuget restore UnityLauncherPro.sln
# Build the binary
- name: Build Binary
if: env.build_trigger == 'true'
shell: cmd
run: call .\Build.cmd
# Build the artifact
- name: Build Artifact
if: env.build_trigger == 'true'
shell: cmd
run: call .\ArtifactBuild.cmd
# Check that output exists
- name: Validate UnityLauncherPro.exe exists
if: env.build_trigger == 'true'
shell: cmd
run: |
if not exist "UnityLauncherPro\bin\Release\UnityLauncherPro.exe" (
echo ERROR: UnityLauncherPro.exe not found.
exit /b 1
)
echo Found UnityLauncherPro.exe
# 1) Compute a wrapped major.minor.build from the run number
- name: Compute installer version
if: env.build_trigger == 'true'
shell: bash
run: |
TOTAL=${{ github.run_number }}
BUILD=$(( TOTAL % 65536 ))
MINOR_TOTAL=$(( TOTAL / 65536 ))
MINOR=$(( MINOR_TOTAL % 256 ))
MAJOR=$(( MINOR_TOTAL / 256 ))
echo "INSTALLER_MAJOR=$MAJOR" >> $GITHUB_ENV
echo "INSTALLER_MINOR=$MINOR" >> $GITHUB_ENV
echo "INSTALLER_BUILD=$BUILD" >> $GITHUB_ENV
echo "INSTALLER_VER=$MAJOR.$MINOR.$BUILD" >> $GITHUB_ENV
echo "Computed installer version → $MAJOR.$MINOR.$BUILD (run #${{ github.run_number }})"
# 2) Patch your .vdproj in place (inject ProductVersion and a new GUID)
- name: Patch .vdproj ProductVersion & ProductCode
if: env.build_trigger == 'true'
shell: pwsh
run: |
$proj = 'UnityLauncherProInstaller\UnityLauncherProInstaller.vdproj'
$ver = "${{ env.INSTALLER_VER }}" # e.g. 0.0.118
$guid = [Guid]::NewGuid().ToString("B").ToUpper() # e.g. {E821A3F5-1F84-4A4B-BE9D-115D93E9E6F0}
# Read & rewrite line-by-line
$fixed = Get-Content $proj | ForEach-Object {
if ($_ -match '^(\s*)"ProductVersion"') {
# preserve indentation, then inject exactly one pair of braces
"$($Matches[1])""ProductVersion"" = ""8:$ver"""
}
elseif ($_ -match '^(\s*)"ProductCode"') {
"$($Matches[1])""ProductCode"" = ""8:$guid"""
}
else {
$_
}
}
# Overwrite the project
Set-Content -Path $proj -Value $fixed
Write-Host "→ ProductVersion patched to 8:$ver"
Write-Host "→ ProductCode patched to 8:$guid"
# 3) **DEBUG**: print out the patched .vdproj so you can inspect it
- name: Show patched .vdproj
if: env.build_trigger == 'true'
shell: pwsh
run: |
$proj = 'UnityLauncherProInstaller\UnityLauncherProInstaller.vdproj'
Write-Host "=== BEGIN .vdproj CONTENT ==="
Get-Content $proj
Write-Host "=== END .vdproj CONTENT ==="
# locate VS 2022
- name: Locate Visual Studio 2022
id: vswhere
shell: pwsh
run: |
$installPath = vswhere -latest -products * -requires Microsoft.Component.MSBuild `
-property installationPath
if (-not $installPath) { throw 'VS 2022 not found' }
"installPath=$installPath" >> $env:GITHUB_OUTPUT
# download vs installer builder (v2.0.1)
- name: Download Installer-Projects VSIX
shell: pwsh
run: |
$vsixUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/VisualStudioClient/vsextensions/MicrosoftVisualStudio2022InstallerProjects/2.0.1/vspackage"
Invoke-WebRequest $vsixUrl -OutFile installerprojects.vsix
# install vs installer builder
- name: Install Installer-Projects extension
shell: pwsh
run: |
$vsixInstaller = Join-Path "${{ steps.vswhere.outputs.installPath }}" 'Common7\IDE\VSIXInstaller.exe'
Write-Host "Running: $vsixInstaller installerprojects.vsix /quiet"
& $vsixInstaller installerprojects.vsix /quiet
# Build MSI installer project using Visual Studio 2022 workaround
- name: Build Installer MSI
if: env.build_trigger == 'true'
shell: cmd
run: |
setlocal EnableDelayedExpansion
echo === Running BuildInstaller.bat ===
call .\BuildInstaller.bat || echo WARNING: BuildInstaller.bat exited with %ERRORLEVEL%, continuing...
set "ec=!ERRORLEVEL!"
if not "!ec!"=="0" echo WARNING: BuildInstaller.bat exited with !ec!, continuing...
echo === Verifying MSI ===
if exist "UnityLauncherProInstaller\Release\UnityLauncherPro-Installer.msi" (
echo Success: MSI found at UnityLauncherProInstaller\Release\UnityLauncherPro-Installer.msi
exit /b 0
) else (
echo ERROR: MSI not found in UnityLauncherProInstaller\Release
exit /b 1
)
# Get the current date and time
- name: Get current date and time (Helsinki)
if: env.build_trigger == 'true'
shell: pwsh
run: |
$nowUtc = Get-Date -AsUTC
$tz = [TimeZoneInfo]::FindSystemTimeZoneById('FLE Standard Time') # Europe/Helsinki
$now = [TimeZoneInfo]::ConvertTimeFromUtc($nowUtc, $tz)
"current_datetime=$($now.ToString('dd/MM/yyyy HH:mm'))" >> $env:GITHUB_ENV
"build_timestamp=$($now.ToString('HH:mm:ss - dd/MM/yyyy'))" >> $env:GITHUB_ENV
- name: Echo timestamp (debug)
if: env.build_trigger == 'true'
shell: pwsh
run: echo "build_timestamp=${env:build_timestamp}"
# Get commits since last build
- name: Get commits since last numeric CI tag
id: get_commits
if: env.build_trigger == 'true'
shell: bash
run: |
set -euo pipefail
# Defensive: fetch tags
git fetch --tags --force
# Collect numeric-only tags (e.g., 145, 143...) and sort ascending numerically
mapfile -t NUM_TAGS < <(git tag --list '[0-9]*' | sort -n)
PREV_TAG=""
# Walk from newest to oldest and pick the newest tag that is an ancestor of HEAD
for (( idx=${#NUM_TAGS[@]}-1 ; idx>=0 ; idx-- )); do
t="${NUM_TAGS[$idx]}"
if git merge-base --is-ancestor "$t" HEAD; then
PREV_TAG="$t"
break
fi
done
if [ -z "$PREV_TAG" ]; then
echo "No previous numeric CI tag reachable from HEAD → listing all commits"
RANGE="--all"
else
echo "Previous CI tag: $PREV_TAG"
RANGE="$PREV_TAG..HEAD"
fi
# Nicely formatted bullets; add --date=short if you want dates
COMMITS=$(git log $RANGE --no-merges --pretty='* %h %s (by %an)')
if [ -z "$COMMITS" ]; then
COMMITS="* No code changes since last CI tag."
fi
{
echo 'commits<<EOF'
printf '%s\n' "$COMMITS"
echo 'EOF'
} >> "$GITHUB_OUTPUT"
- name: Create GitHub Release + Upload Assets
if: env.build_trigger == 'true'
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.run_number }}
name: ${{ env.current_datetime }} (${{ github.run_number }})
body: |
Automated Release by GitHub Action CI.
**Build time:** ${{ env.build_timestamp }}
NOTE: Installer is experimental (and it loses settings from previous version)
### Commits in this release
${{ steps.get_commits.outputs.commits }}
draft: false
prerelease: false
files: |
./UnityLauncherPro.zip
./UnityLauncherProInstaller/Release/UnityLauncherPro-Installer.msi