installed-update-builder.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. /** Select isolated qualification inputs without weakening the ordinary Windows installer or signing hooks. */
  2. import { join } from 'node:path'
  3. import { createElectronBuilderConfig } from './electron-builder-config.mjs'
  4. import { readInstalledUpdateRun } from './installed-update-qualification.ts'
  5. import { verifyInstalledUpdateApplication } from './prepare-installed-update-application.ts'
  6. import { verifyDesktopRuntime } from '../src/runtime-tree.ts'
  7. /**
  8. * Validate one version and construct its signed-only, test-only builder configuration.
  9. * @param manifest Original run.json with prepared runtime and application files.
  10. * @param version One of the run's two versions.
  11. * @param environment File-owned .env.windows settings loaded by a supervised caller; never logged here.
  12. * @returns Configuration only. Calling builder hooks requires separate hardware authorization and supervision.
  13. */
  14. export async function createInstalledUpdateBuilderConfig(manifest: string, version: string, environment: NodeJS.ProcessEnv) {
  15. const run = await readInstalledUpdateRun(manifest)
  16. if (!run.versions.includes(version)) throw new Error('installed update: package version is outside the qualification run')
  17. if (environment.DSH_DESKTOP_AUTO_UPDATE_ENV !== 'test' || environment.DSH_DESKTOP_UNSIGNED === '1'
  18. || environment.DOWNLOAD_TEST_ORIGIN !== run.origin || environment.DOWNLOAD_TEST_COS_BUCKET !== run.bucket) {
  19. throw new Error('installed update: signed ordinary-update qualification requires matching test deployment settings')
  20. }
  21. const application = await verifyInstalledUpdateApplication(run.root)
  22. const dsh = join(run.root, version, 'dsh')
  23. await verifyDesktopRuntime(dsh, version, { platform: 'win32', arch: 'x64' })
  24. const config = createElectronBuilderConfig({ ...environment, DSH_DESKTOP_APP_ID: run.appId,
  25. DSH_DESKTOP_TARGET_PLATFORM: 'win32', DSH_DESKTOP_TARGET_ARCH: 'x64', DSH_DESKTOP_UNSIGNED: '0' }, 'win32', 'x64', dsh)
  26. return { ...config,
  27. productName: run.productName,
  28. directories: { ...config.directories, output: join(run.root, version, 'installer') },
  29. extraMetadata: { ...config.extraMetadata, name: `dsh-update-test-${run.id}`, version, main: 'qualification-bootstrap.mjs' },
  30. files: [
  31. { from: application, to: '.', filter: ['lib/*.js', 'lib/*.cjs', 'renderer/**/*', 'qualification-bootstrap.mjs', 'installed-update-identity.mjs'] },
  32. 'package.json',
  33. { from: dsh, to: 'dsh', filter: ['**/*'] },
  34. { from: join(dsh, 'node_modules'), to: 'dsh/node_modules', filter: ['**/*'] },
  35. ],
  36. publish: [{ provider: 'generic' as const, url: `${run.origin}/${run.feedKey.slice(0, -'nightly.yml'.length)}`, channel: 'nightly' }],
  37. }
  38. }