mirror of
https://github.com/cypress-io/cypress.git
synced 2026-01-05 14:09:46 -06:00
* try codesign on mac circle * run mac code sign setup as sudo * check env variables * pass org context to command * update shell command * hmm does shell need to login * add FASTLANE_LANE * fix log messages in build * DEBUG code sign * try importing profile first * use sign shell script inline * exit if importing profile fails * unlock keychain * try creating custom keychain and using it * more unlocking * try using -T * append new keychain to the list * try mac executor 10.1.0 * skip node version check * set keychain name to use for signing * remove passing name of the keychain * more comments * use env variables directly to code sign on mac * use electron-builder to sign mac app * try disabling publishing by electron-builder * try testing Mac binary against kitchensink * wait on the right job * run on mac-sign-2 branch * remove buildkite pipeline * remove old commands * darwin platform * workflows via templates * inherit stdio when calling codesign * build binary for this branch * actually build an app, dah * add note about code sign in PR * remove FASTLANE env variable * enable linux builds and remove current branch
229 lines
6.7 KiB
CoffeeScript
229 lines
6.7 KiB
CoffeeScript
require("console.table")
|
|
_ = require("lodash")
|
|
fs = require("fs-extra")
|
|
Promise = require("bluebird")
|
|
bumpercar = require("@cypress/bumpercar")
|
|
path = require("path")
|
|
la = require('lazy-ass')
|
|
check = require('check-more-types')
|
|
R = require("ramda")
|
|
{configFromEnvOrJsonFile, filenameToShellVariable} = require('@cypress/env-or-json-file')
|
|
makeEmptyGithubCommit = require("make-empty-github-commit")
|
|
parse = require("parse-github-repo-url")
|
|
|
|
fs = Promise.promisifyAll(fs)
|
|
|
|
car = null
|
|
|
|
# all the projects to trigger / run / change environment variables for
|
|
_PROVIDERS = {
|
|
appVeyor: {
|
|
main: "cypress-io/cypress"
|
|
others: [
|
|
"cypress-io/cypress-test-tiny"
|
|
"cypress-io/cypress-test-example-repos"
|
|
]
|
|
}
|
|
|
|
circle: {
|
|
main: "cypress-io/cypress"
|
|
others: [
|
|
"cypress-io/cypress-test-tiny"
|
|
"cypress-io/cypress-test-module-api"
|
|
"cypress-io/cypress-test-node-versions"
|
|
"cypress-io/cypress-test-nested-projects"
|
|
"cypress-io/cypress-test-ci-environments"
|
|
"cypress-io/cypress-test-example-repos"
|
|
]
|
|
}
|
|
}
|
|
|
|
remapProjects = (projectsByProvider) ->
|
|
list = []
|
|
|
|
_.mapValues projectsByProvider, (provider, name) ->
|
|
provider.others.forEach (repo) ->
|
|
list.push({
|
|
repo
|
|
provider: name
|
|
})
|
|
|
|
list
|
|
|
|
remapMain = (projectsByProvider) ->
|
|
list = []
|
|
|
|
_.mapValues projectsByProvider, (provider, name) ->
|
|
list.push({
|
|
repo: provider.main
|
|
provider: name
|
|
})
|
|
|
|
list
|
|
|
|
# make flat list of objects
|
|
# {repo, provider}
|
|
PROJECTS = remapProjects(_PROVIDERS)
|
|
|
|
getCiConfig = ->
|
|
key = path.join("scripts", "support", "ci.json")
|
|
config = configFromEnvOrJsonFile(key)
|
|
|
|
if !config
|
|
console.error('⛔️ Cannot find CI credentials')
|
|
console.error('Using @cypress/env-or-json-file module')
|
|
console.error('and filename', key)
|
|
console.error('which is environment variable', filenameToShellVariable(key))
|
|
throw new Error('CI config not found')
|
|
config
|
|
|
|
awaitEachProjectAndProvider = (projects, fn, filter = R.identity) ->
|
|
creds = getCiConfig()
|
|
|
|
## configure a new Bumpercar
|
|
providers = {}
|
|
if check.unemptyString(creds.githubToken)
|
|
providers.travis = {
|
|
githubToken: creds.githubToken
|
|
}
|
|
if check.unemptyString(creds.circleToken)
|
|
providers.circle = {
|
|
circleToken: creds.circleToken
|
|
}
|
|
if check.unemptyString(creds.appVeyorToken)
|
|
providers.appVeyor = {
|
|
appVeyorToken: creds.appVeyorToken
|
|
}
|
|
if check.unemptyString(creds.buildkiteToken)
|
|
providers.buildkite = {
|
|
buildkiteToken: creds.buildkiteToken
|
|
}
|
|
providerNames = Object.keys(providers)
|
|
console.log("configured providers", providerNames)
|
|
la(check.not.empty(providerNames), "empty list of providers")
|
|
|
|
car = bumpercar.create({providers})
|
|
|
|
filteredProjects = R.filter(filter, projects)
|
|
if check.empty(filteredProjects)
|
|
console.log("⚠️ zero filtered projects left after filtering")
|
|
console.table("filtered projects", filteredProjects)
|
|
Promise.mapSeries filteredProjects, (project) ->
|
|
fn(project.repo, project.provider, creds)
|
|
|
|
# do not trigger all projects if there is specific provider
|
|
# for example appVeyor should be used for Windows testing
|
|
getFilterByProvider = (providerName) ->
|
|
if providerName
|
|
console.log("only allow projects for provider", providerName)
|
|
projectFilter = R.propEq("provider", providerName)
|
|
else
|
|
projectFilter = R.identity
|
|
projectFilter
|
|
|
|
module.exports = {
|
|
nextVersion: (version) ->
|
|
MAIN_PROJECTS = remapMain(_PROVIDERS)
|
|
console.log("Setting next version to build", version)
|
|
console.table("In these projects", MAIN_PROJECTS)
|
|
|
|
la(check.unemptyString(version),
|
|
"missing next version to set", version)
|
|
|
|
setNextDevVersion = (project, provider) ->
|
|
console.log("setting env var NEXT_DEV_VERSION to %s on %s in project %s",
|
|
version, provider, project)
|
|
car.updateProjectEnv(project, provider, {
|
|
NEXT_DEV_VERSION: version,
|
|
})
|
|
|
|
awaitEachProjectAndProvider(MAIN_PROJECTS, setNextDevVersion)
|
|
|
|
# in each project, set a couple of environment variables
|
|
version: (nameOrUrl, binaryVersionOrUrl, platform, providerName) ->
|
|
console.table("All possible projects", PROJECTS)
|
|
|
|
la(check.unemptyString(nameOrUrl),
|
|
"missing cypress name or url to set", nameOrUrl)
|
|
|
|
if check.semver(nameOrUrl)
|
|
console.log("for version", nameOrUrl)
|
|
nameOrUrl = "cypress@#{nameOrUrl}"
|
|
console.log("full NPM install name is", nameOrUrl)
|
|
|
|
la(check.unemptyString(binaryVersionOrUrl),
|
|
"missing binary version or url", binaryVersionOrUrl)
|
|
|
|
result = {
|
|
versionName: nameOrUrl,
|
|
binary: binaryVersionOrUrl
|
|
}
|
|
|
|
projectFilter = getFilterByProvider(providerName)
|
|
|
|
updateProject = (project, provider) ->
|
|
console.log("setting environment variables in", project)
|
|
car.updateProjectEnv(project, provider, {
|
|
CYPRESS_NPM_PACKAGE_NAME: nameOrUrl,
|
|
CYPRESS_INSTALL_BINARY: binaryVersionOrUrl
|
|
})
|
|
awaitEachProjectAndProvider(PROJECTS, updateProject, projectFilter)
|
|
.then R.always(result)
|
|
|
|
# triggers test projects on multiple CIs
|
|
# the test projects will exercise the new version of
|
|
# the Cypress test runner we just built
|
|
runTestProjects: (message, providerName, version) ->
|
|
projectFilter = getFilterByProvider(providerName)
|
|
|
|
if not message
|
|
message =
|
|
"""
|
|
Testing new Cypress version #{version}
|
|
|
|
"""
|
|
if process.env.CIRCLE_BUILD_URL
|
|
message += "\n"
|
|
message += "Circle CI build url #{process.env.CIRCLE_BUILD_URL}"
|
|
|
|
if process.env.APPVEYOR
|
|
slug = process.env.APPVEYOR_PROJECT_SLUG
|
|
build = process.env.APPVEYOR_BUILD_ID
|
|
message += "\n"
|
|
message += "AppVeyor CI #{slug} #{build}"
|
|
|
|
makeCommit = (project, provider, creds) ->
|
|
# instead of triggering CI via API
|
|
# car.runProject(project, provider)
|
|
# make empty commit to trigger CIs
|
|
|
|
parsedRepo = parse(project)
|
|
console.log("making commit to project", project)
|
|
|
|
defaultOptions = {
|
|
owner: parsedRepo[0],
|
|
repo: parsedRepo[1],
|
|
token: creds.githubToken,
|
|
message
|
|
}
|
|
|
|
if not version
|
|
return makeEmptyGithubCommit(defaultOptions)
|
|
|
|
# first try to commit to branch for next upcoming version
|
|
specificBranchOptions = {
|
|
owner: parsedRepo[0],
|
|
repo: parsedRepo[1],
|
|
token: creds.githubToken,
|
|
message,
|
|
branch: version
|
|
}
|
|
makeEmptyGithubCommit(specificBranchOptions)
|
|
.catch () ->
|
|
# maybe there is no branch for next version
|
|
# try default branch
|
|
makeEmptyGithubCommit(defaultOptions)
|
|
|
|
awaitEachProjectAndProvider(PROJECTS, makeCommit, projectFilter)
|
|
}
|