ci: retry transient Windows packaging downloads
Windows CI / verify (push) Successful in 3m45s

Retry the directory package once when Electron download transport is interrupted, keeping the Windows CI step bounded. Bump the release contracts to 1.0.12.
This commit is contained in:
Sucukdeluxe
2026-08-12 21:48:04 +02:00
parent 275d252f25
commit 1a1c37720e
10 changed files with 28 additions and 13 deletions
+6 -1
View File
@@ -47,7 +47,12 @@ jobs:
run: npm run build run: npm run build
timeout-minutes: 10 timeout-minutes: 10
- name: Package directory - name: Package directory
run: npm run pack run: |
npm run pack
if ($LASTEXITCODE -ne 0) {
npm run pack
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}
timeout-minutes: 10 timeout-minutes: 10
- name: Packaged launch smoke - name: Packaged launch smoke
run: npm run test:packaged-launch run: npm run test:packaged-launch
+6 -1
View File
@@ -47,7 +47,12 @@ jobs:
run: npm run build run: npm run build
timeout-minutes: 10 timeout-minutes: 10
- name: Package directory - name: Package directory
run: npm run pack run: |
npm run pack
if ($LASTEXITCODE -ne 0) {
npm run pack
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}
timeout-minutes: 10 timeout-minutes: 10
- name: Packaged launch smoke - name: Packaged launch smoke
run: npm run test:packaged-launch run: npm run test:packaged-launch
+4
View File
@@ -1,5 +1,9 @@
# Changelog # Changelog
## 1.0.12 - 2026-08-12
- Retry transient Electron download failures once while packaging on Windows CI.
## 1.0.11 - 2026-08-12 ## 1.0.11 - 2026-08-12
- Stabilize the Windows CI secure-storage test without invoking Electron's binary bootstrap outside Electron. - Stabilize the Windows CI secure-storage test without invoking Electron's binary bootstrap outside Electron.
+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.11.exe`. 2. Download `Twitch-VOD-Manager-Setup-1.0.12.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.11", "version": "1.0.12",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "twitch-vod-manager", "name": "twitch-vod-manager",
"version": "1.0.11", "version": "1.0.12",
"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.11", "version": "1.0.12",
"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.11', version: '1.0.12',
}); });
} }
+2 -1
View File
@@ -50,8 +50,9 @@ for (const relativePath of ['.github/workflows/windows-ci.yml', '.gitea/workflow
check(/runs-on:\s*windows-latest/.test(source), `${relativePath} does not use a Windows runner`); check(/runs-on:\s*windows-latest/.test(source), `${relativePath} does not use a Windows runner`);
check(/node-version:\s*['"]?24\.11\.1['"]?/.test(source), `${relativePath} does not pin Node 24.11.1`); check(/node-version:\s*['"]?24\.11\.1['"]?/.test(source), `${relativePath} does not pin Node 24.11.1`);
for (const command of requiredCommands) { for (const command of requiredCommands) {
check(source.includes(`run: ${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`);
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.11', `package version is ${packageJson.version}`); check(packageJson.version === '1.0.12', `package version is ${packageJson.version}`);
check(packageLock.version === '1.0.11', `lockfile version is ${packageLock.version}`); check(packageLock.version === '1.0.12', `lockfile version is ${packageLock.version}`);
check(packageLock.packages?.['']?.version === '1.0.11', `lockfile root package version is ${packageLock.packages?.['']?.version}`); check(packageLock.packages?.['']?.version === '1.0.12', `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.11'), 'initial version label is not 1.0.11'); check(indexSource.includes('Version: v1.0.12'), 'initial version label is not 1.0.12');
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.11</p> <p id="versionInfo" class="card-intro">Version: v1.0.12</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>