Files
cypress/scripts/binary/upload.js
Emily Rohrbough e396956534 feat: remove windows 32-bit support (#18630)
Co-authored-by: Jennifer Shehane <jennifer@cypress.io>
Co-authored-by: Zach Bloomquist <git@chary.us>
2021-10-29 08:54:02 -05:00

189 lines
5.2 KiB
JavaScript

const awspublish = require('gulp-awspublish')
const rename = require('gulp-rename')
const gulpDebug = require('gulp-debug')
let fs = require('fs-extra')
const path = require('path')
const gulp = require('gulp')
const Promise = require('bluebird')
const meta = require('./meta')
const la = require('lazy-ass')
const check = require('check-more-types')
const uploadUtils = require('./util/upload')
fs = Promise.promisifyAll(fs)
// TODO: refactor this
// system expects desktop application to be inside a file
// with this name
const zipName = 'cypress.zip'
module.exports = {
zipName,
getPublisher () {
return uploadUtils.getPublisher(this.getAwsObj)
},
getAwsObj () {
return uploadUtils.getS3Credentials()
},
// returns desktop folder for a given folder without platform
// something like desktop/0.20.1
getUploadeVersionFolder (aws, version) {
la(check.unemptyString(aws.folder), 'aws object is missing desktop folder', aws.folder)
const dirName = [aws.folder, version].join('/')
return dirName
},
getFullUploadName ({ folder, version, platformArch, name }) {
la(check.unemptyString(folder), 'missing folder', folder)
la(check.semver(version), 'missing or invalid version', version)
la(check.unemptyString(name), 'missing file name', name)
la(uploadUtils.isValidPlatformArch(platformArch),
'invalid platform and arch', platformArch)
const fileName = [folder, version, platformArch, name].join('/')
return fileName
},
// store uploaded application in subfolders by platform and version
// something like desktop/0.20.1/darwin-x64/
getUploadDirName ({ version, platform }) {
const aws = this.getAwsObj()
const platformArch = uploadUtils.getUploadNameByOsAndArch(platform)
const versionFolder = this.getUploadeVersionFolder(aws, version)
const dirName = [versionFolder, platformArch, null].join('/')
console.log('target directory %s', dirName)
return dirName
},
getManifestUrl (folder, version, uploadOsName) {
const url = uploadUtils.getUploadUrl()
la(check.url(url), 'could not get upload url', url)
return {
url: [url, folder, version, uploadOsName, zipName].join('/'),
}
},
getRemoteManifest (folder, version) {
la(check.unemptyString(folder), 'missing manifest folder', folder)
la(check.semver(version), 'invalid manifest version', version)
const getUrl = this.getManifestUrl.bind(null, folder, version)
return {
name: 'Cypress',
version,
packages: {
// keep these for compatibility purposes
// although they are now deprecated
mac: getUrl('darwin-x64'),
linux64: getUrl('linux-x64'),
// start adding the new ones
// using node's platform
darwin: getUrl('darwin-x64'),
linux: getUrl('linux-x64'),
// the new-new names that use platform and arch as is
'darwin-x64': getUrl('darwin-x64'),
'linux-x64': getUrl('linux-x64'),
'win32-x64': getUrl('win32-x64'),
},
}
},
createRemoteManifest (folder, version) {
const obj = this.getRemoteManifest(folder, version)
const src = path.resolve('manifest.json')
return fs.outputJsonAsync(src, obj).return(src)
},
s3Manifest (version) {
const publisher = this.getPublisher()
const aws = this.getAwsObj()
const headers = {}
headers['Cache-Control'] = 'no-cache'
let manifest = null
return new Promise((resolve, reject) => {
return this.createRemoteManifest(aws.folder, version)
.then((src) => {
manifest = src
return gulp.src(src)
.pipe(rename((p) => {
p.dirname = `${aws.folder}/${p.dirname}`
return p
})).pipe(gulpDebug())
.pipe(publisher.publish(headers))
.pipe(awspublish.reporter())
.on('error', reject)
.on('end', resolve)
})
}).finally(() => {
return fs.removeAsync(manifest)
})
},
toS3 ({ zipFile, version, platform }) {
console.log('#uploadToS3 ⏳')
la(check.unemptyString(version), 'expected version string', version)
la(check.unemptyString(zipFile), 'expected zip filename', zipFile)
la(check.extension('zip', zipFile),
'zip filename should end with .zip', zipFile)
la(meta.isValidPlatform(platform), 'invalid platform', platform)
console.log(`zip filename ${zipFile}`)
if (!fs.existsSync(zipFile)) {
throw new Error(`Cannot find zip file ${zipFile}`)
}
const upload = () => {
return new Promise((resolve, reject) => {
const publisher = this.getPublisher()
const headers = {}
headers['Cache-Control'] = 'no-cache'
return gulp.src(zipFile)
.pipe(rename((p) => {
// rename to standard filename zipName
p.basename = path.basename(zipName, p.extname)
p.dirname = this.getUploadDirName({ version, platform })
return p
})).pipe(gulpDebug())
.pipe(publisher.publish(headers))
.pipe(awspublish.reporter())
.on('error', reject)
.on('end', resolve)
})
}
return upload()
.then(() => {
return uploadUtils.purgeDesktopAppFromCache({ version, platform, zipName })
})
},
}