ci: retry transient Windows installer packaging
Windows CI / verify (push) Successful in 3m48s

Extend the bounded Electron download retry to the installer build, then bump the release contracts to 1.0.13.
This commit is contained in:
Sucukdeluxe
2026-08-12 21:55:07 +02:00
parent 1a1c37720e
commit 17b982016f
10 changed files with 29 additions and 13 deletions
+6 -1
View File
@@ -58,7 +58,12 @@ jobs:
run: npm run test:packaged-launch run: npm run test:packaged-launch
timeout-minutes: 10 timeout-minutes: 10
- name: Build installer - name: Build installer
run: npm run dist:ci run: |
npm run dist:ci
if ($LASTEXITCODE -ne 0) {
npm run dist:ci
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}
timeout-minutes: 10 timeout-minutes: 10
- name: Installer smoke - name: Installer smoke
run: npm run test:installer run: npm run test:installer
+6 -1
View File
@@ -58,7 +58,12 @@ jobs:
run: npm run test:packaged-launch run: npm run test:packaged-launch
timeout-minutes: 10 timeout-minutes: 10
- name: Build installer - name: Build installer
run: npm run dist:ci run: |
npm run dist:ci
if ($LASTEXITCODE -ne 0) {
npm run dist:ci
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}
timeout-minutes: 10 timeout-minutes: 10
- name: Installer smoke - name: Installer smoke
run: npm run test:installer run: npm run test:installer
+4
View File
@@ -1,5 +1,9 @@
# Changelog # Changelog
## 1.0.13 - 2026-08-12
- Apply the Windows CI retry to both directory and installer packaging.
## 1.0.12 - 2026-08-12 ## 1.0.12 - 2026-08-12
- Retry transient Electron download failures once while packaging on Windows CI. - Retry transient Electron download failures once while packaging on Windows CI.
+1 -1
View File
@@ -61,7 +61,7 @@ The application works in public mode without a Twitch login. Connecting a Twitch
## Installation ## Installation
1. Open the [latest GitHub release](https://github.com/Sucukdeluxe/Twitch-VOD-Manager/releases/latest). 1. Open the [latest GitHub release](https://github.com/Sucukdeluxe/Twitch-VOD-Manager/releases/latest).
2. Download `Twitch-VOD-Manager-Setup-1.0.12.exe`. 2. Download `Twitch-VOD-Manager-Setup-1.0.13.exe`.
3. Run the installer and choose the installation directory. 3. Run the installer and choose the installation directory.
4. Start Twitch VOD Manager and add a streamer. 4. Start Twitch VOD Manager and add a streamer.
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "twitch-vod-manager", "name": "twitch-vod-manager",
"version": "1.0.12", "version": "1.0.13",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "twitch-vod-manager", "name": "twitch-vod-manager",
"version": "1.0.12", "version": "1.0.13",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"axios": "^1.16.1", "axios": "^1.16.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "twitch-vod-manager", "name": "twitch-vod-manager",
"version": "1.0.12", "version": "1.0.13",
"description": "Twitch VOD Manager - Download Twitch VODs easily", "description": "Twitch VOD Manager - Download Twitch VODs easily",
"main": "dist/main.js", "main": "dist/main.js",
"author": "Sucukdeluxe", "author": "Sucukdeluxe",
+1 -1
View File
@@ -93,7 +93,7 @@ if (process.platform === 'win32') {
sourcePath: electronSourceExecutable, sourcePath: electronSourceExecutable,
destinationPath: resolve(rootDirectory, 'node_modules', 'electron', 'dist', 'Twitch VOD Manager.exe'), destinationPath: resolve(rootDirectory, 'node_modules', 'electron', 'dist', 'Twitch VOD Manager.exe'),
iconPath: resolve(rootDirectory, 'build', 'icon.ico'), iconPath: resolve(rootDirectory, 'build', 'icon.ico'),
version: '1.0.12', version: '1.0.13',
}); });
} }
+3 -1
View File
@@ -52,7 +52,9 @@ for (const relativePath of ['.github/workflows/windows-ci.yml', '.gitea/workflow
for (const command of requiredCommands) { for (const command of requiredCommands) {
check(source.includes(command), `${relativePath} is missing ${command}`); check(source.includes(command), `${relativePath} is missing ${command}`);
} }
check(source.includes('if ($LASTEXITCODE -ne 0)') && source.match(/npm run pack/g)?.length >= 2, `${relativePath} does not retry transient package failures`); for (const command of ['npm run pack', 'npm run dist:ci']) {
check(source.match(new RegExp(command.replace(/[:]/g, '\\:'), 'g'))?.length >= 2, `${relativePath} does not retry transient ${command} failures`);
}
const runSteps = source.split(/\r?\n/).filter((line) => /^\s+run:\s+/.test(line)); const runSteps = source.split(/\r?\n/).filter((line) => /^\s+run:\s+/.test(line));
const timeoutSteps = source.split(/\r?\n/).filter((line) => /^\s+timeout-minutes:\s*10\s*$/.test(line)); const timeoutSteps = source.split(/\r?\n/).filter((line) => /^\s+timeout-minutes:\s*10\s*$/.test(line));
check(timeoutSteps.length >= runSteps.length, `${relativePath} does not cap every command at ten minutes`); check(timeoutSteps.length >= runSteps.length, `${relativePath} does not cap every command at ten minutes`);
+4 -4
View File
@@ -15,9 +15,9 @@ function check(condition, message) {
if (!condition) failures.push(message); if (!condition) failures.push(message);
} }
check(packageJson.version === '1.0.12', `package version is ${packageJson.version}`); check(packageJson.version === '1.0.13', `package version is ${packageJson.version}`);
check(packageLock.version === '1.0.12', `lockfile version is ${packageLock.version}`); check(packageLock.version === '1.0.13', `lockfile version is ${packageLock.version}`);
check(packageLock.packages?.['']?.version === '1.0.12', `lockfile root package version is ${packageLock.packages?.['']?.version}`); check(packageLock.packages?.['']?.version === '1.0.13', `lockfile root package version is ${packageLock.packages?.['']?.version}`);
check(packageJson.build?.appId === 'io.github.sucukdeluxe.twitch-vod-manager', `appId is ${packageJson.build?.appId}`); check(packageJson.build?.appId === 'io.github.sucukdeluxe.twitch-vod-manager', `appId is ${packageJson.build?.appId}`);
check(packageJson.build?.publish?.provider === 'generic', `publish provider is ${packageJson.build?.publish?.provider}`); check(packageJson.build?.publish?.provider === 'generic', `publish provider is ${packageJson.build?.publish?.provider}`);
check(packageJson.build?.publish?.url === 'https://github.com/Sucukdeluxe/Twitch-VOD-Manager/releases/latest/download/', `publish URL is ${packageJson.build?.publish?.url}`); check(packageJson.build?.publish?.url === 'https://github.com/Sucukdeluxe/Twitch-VOD-Manager/releases/latest/download/', `publish URL is ${packageJson.build?.publish?.url}`);
@@ -65,7 +65,7 @@ check(mainSource.includes('GITHUB_RELEASES_DOWNLOAD_BASE_URL'), 'GitHub releases
check(mainSource.includes('https://api.github.com/repos/Sucukdeluxe/Twitch-VOD-Manager/releases/latest'), 'GitHub latest release API URL is missing'); check(mainSource.includes('https://api.github.com/repos/Sucukdeluxe/Twitch-VOD-Manager/releases/latest'), 'GitHub latest release API URL is missing');
check(mainSource.includes('https://github.com/Sucukdeluxe/Twitch-VOD-Manager/releases/download'), 'GitHub release download URL is missing'); check(mainSource.includes('https://github.com/Sucukdeluxe/Twitch-VOD-Manager/releases/download'), 'GitHub release download URL is missing');
check(!/storyboards\/\d{8,12}(?:-|\/)/.test(mainSource), 'numeric Twitch VOD example remains in the public source'); check(!/storyboards\/\d{8,12}(?:-|\/)/.test(mainSource), 'numeric Twitch VOD example remains in the public source');
check(indexSource.includes('Version: v1.0.12'), 'initial version label is not 1.0.12'); check(indexSource.includes('Version: v1.0.13'), 'initial version label is not 1.0.13');
check(!indexSource.includes('Version: v4.1.13'), 'legacy version label is still present'); check(!indexSource.includes('Version: v4.1.13'), 'legacy version label is still present');
check(fs.existsSync(manifestPath), 'public release manifest is missing'); check(fs.existsSync(manifestPath), 'public release manifest is missing');
+1 -1
View File
@@ -940,7 +940,7 @@
<div class="settings-card" data-settings-pane="updates" hidden> <div class="settings-card" data-settings-pane="updates" hidden>
<h3 id="updateTitle">Updates</h3> <h3 id="updateTitle">Updates</h3>
<p id="versionInfo" class="card-intro">Version: v1.0.12</p> <p id="versionInfo" class="card-intro">Version: v1.0.13</p>
<button type="button" class="btn-secondary" id="checkUpdateBtn" onclick="checkUpdate()">Nach Updates suchen</button> <button type="button" class="btn-secondary" id="checkUpdateBtn" onclick="checkUpdate()">Nach Updates suchen</button>
</div> </div>