Files
cypress/packages/electron/lib/install.js
Gleb Bahmutov abf4d85869 switch to electron-builder to code sign and notarize Cypress ap… (#6013)
* electron@7.x

* node12.8.1-chrome78-ff70

* Revert "node12.8.1-chrome78-ff70" for now

This reverts commit db2d521994.

* update sendCommand to log on all sendcommands

* promisification in 6.x

* Revert "Revert "node12.8.1-chrome78-ff70" for now"

This reverts commit 57fe764098.

* fix sendcommand

* fix cdp in electron

* fix desktop-gui test

* skip tests that will be fixed by #4973

* bump MAX_ALLOWED_FILE_SIZE :/

* update electron browser spec

* make new dialog code null-proof

* add failing e2e test for issue 5475

* bump electron packager

* add e2e snapshot

* update deprecated electron getters/setters

https://github.com/electron/electron/blob/7-1-x/docs/api/modernization/property-updates.md

* build and test on Mac

* use electron-builder 20.41.0

that adds an option to use hardened Mac OS, which is necessary
for code notarization later.

See https://github.com/electron-userland/electron-builder/releases/tag/v20.41.0
and https://github.com/electron-userland/electron-builder/pull/3858

* electron-builder and pass hardenedRuntime: true

* uncomment build

* upload built binary on mac

* back to 20.41.0, trying after sign hook without success

* use current electron-builder alias instead of build

* retry smoke test on first failure

* testing

* trying to notarize signed app (that does not have node_modules yet)

* env variable names

* copy node_modules ourselves

* build and bundle binary on mac on circle, inject new context

* enable build steps before electron build

* increase mac build timeout

* update build folder on mac

* uncomment actual electron build command

* set linux target to zip

* set zip as target for all platforms

* updated steps

* put notarization hook back

* tweaks for icons

* remove dist electron before code sign

* icons per platform

* make node_modules copy path platform-specific

* fix linux build unpacked folder

* build mac

* fix lint

* test new mac binary against kitchensink

* working on Linux build

* try building entire thing on Linux

* removing correct electron dist folder

* increase zip size limit for now

* add folder rename on Linux from linux-unpacked to Cypress

* print file sizes before zipping

* move linux-unpacked to build dir function

* try deleting second electron file, but code signing probably would not work

* test windows build [build binary]

* ignore tsc errors

* windows build path

* windows [build binary]

* update windows build folder

* increase binary build timeout on Mac

* no need to pass our dist folder

* adding explicit list of additional binaries to code sign on mac

* yarn lock

* uncomment necessary build steps

* electron dir for Linux

* yarn lock again

* back to execa v3

* use execa v4 in packages launcher

* yarn lock again and again

* updated tests that use execa

* print build folder

* add executable name on Linux

* get rid of execa.shell in build scripts

* remove old and commented out code

* need to test building binary on Windows

* throw error from after sign hook if fails

* use execa to zip

* yarn lock

* fix after merge variable

* update test

* add nohoist ffmpeg installer

* patch

* yarn types pass

* yarn lock has binary

Co-authored-by: Zach Bloomquist <github@chary.us>
Co-authored-by: Brian Mann <brian.mann86@gmail.com>
2020-03-24 21:34:52 -04:00

132 lines
3.1 KiB
JavaScript

/* eslint-disable no-console */
const _ = require('lodash')
const os = require('os')
const path = require('path')
const Promise = require('bluebird')
const pkg = require('../package.json')
const paths = require('./paths')
const log = require('debug')('cypress:electron')
let fs = require('fs-extra')
fs = Promise.promisifyAll(fs)
let electronVersion
// ensure we have an electronVersion set in package.json
if (!(electronVersion = pkg.devDependencies.electron)) {
throw new Error('Missing \'electron\' devDependency in ./package.json')
}
module.exports = {
getElectronVersion () {
return electronVersion
},
// returns icons package so that the caller code can find
// paths to the icons without hard-coding them
icons () {
return require('@cypress/icons')
},
checkCurrentVersion () {
const pathToVersion = paths.getPathToVersion()
// read in the version file
return fs.readFileAsync(pathToVersion, 'utf8')
.then((str) => {
const version = str.replace('v', '')
// and if it doesn't match the electron version
// throw an error
if (version !== electronVersion) {
throw new Error(`Currently installed version: '${version}' does not match electronVersion: '${electronVersion}`)
} else {
return process.exit()
}
})
},
checkExecExistence () {
return fs.statAsync(paths.getPathToExec())
},
move (src, dest) {
// src is ./tmp/Cypress-darwin-x64
// dest is ./dist/Cypress
return fs.moveAsync(src, dest, { overwrite: true })
.then(() => {
// remove the tmp folder now
return fs.removeAsync(path.dirname(src))
})
},
removeEmptyApp () {
// nuke the temporary blank /app
return fs.removeAsync(paths.getPathToResources('app'))
},
packageAndExit () {
return this.package()
.then(() => {
return this.removeEmptyApp()
}).then(() => {
return process.exit()
})
},
package (options = {}) {
const pkgr = require('electron-packager')
const icons = require('@cypress/icons')
const iconPath = icons.getPathToIcon('cypress')
log('package icon', iconPath)
_.defaults(options, {
dist: paths.getPathToDist(),
dir: 'app',
out: 'tmp',
name: 'Cypress',
platform: os.platform(),
arch: os.arch(),
asar: false,
prune: true,
overwrite: true,
electronVersion,
icon: iconPath,
})
log('packager options %j', options)
return pkgr(options)
.then((appPaths) => {
return appPaths[0]
})
// Promise.resolve("tmp\\Cypress-win32-x64")
.then((appPath) => {
// and now move the tmp into dist
console.log('moving created file from', appPath)
console.log('to', options.dist)
return this.move(appPath, options.dist)
}).catch((err) => {
console.log(err.stack)
return process.exit(1)
})
},
ensure () {
return Promise.join(
this.checkCurrentVersion(),
this.checkExecExistence(),
)
},
check () {
return this.ensure()
.bind(this)
.catch(this.packageAndExit)
},
}