ci-release-build.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. const assert = require('assert')
  2. const request = require('request')
  3. const buildAppVeyorURL = 'https://windows-ci.electronjs.org/api/builds'
  4. const circleCIJobs = [
  5. 'electron-linux-arm',
  6. 'electron-linux-arm64',
  7. 'electron-linux-ia32',
  8. // 'electron-linux-mips64el',
  9. 'electron-linux-x64'
  10. ]
  11. async function makeRequest (requestOptions, parseResponse) {
  12. return new Promise((resolve, reject) => {
  13. request(requestOptions, (err, res, body) => {
  14. if (!err && res.statusCode >= 200 && res.statusCode < 300) {
  15. if (parseResponse) {
  16. const build = JSON.parse(body)
  17. resolve(build)
  18. } else {
  19. resolve(body)
  20. }
  21. } else {
  22. if (parseResponse) {
  23. console.log('Error: ', `(status ${res.statusCode})`, err || JSON.parse(res.body), requestOptions)
  24. } else {
  25. console.log('Error: ', `(status ${res.statusCode})`, err || res.body, requestOptions)
  26. }
  27. reject(err)
  28. }
  29. })
  30. })
  31. }
  32. async function circleCIcall (buildUrl, targetBranch, job, options) {
  33. assert(process.env.CIRCLE_TOKEN, 'CIRCLE_TOKEN not found in environment')
  34. console.log(`Triggering CircleCI to run build job: ${job} on branch: ${targetBranch} with release flag.`)
  35. let buildRequest = {
  36. 'build_parameters': {
  37. 'CIRCLE_JOB': job
  38. }
  39. }
  40. if (options.ghRelease) {
  41. buildRequest.build_parameters.ELECTRON_RELEASE = 1
  42. } else {
  43. buildRequest.build_parameters.RUN_RELEASE_BUILD = 'true'
  44. }
  45. if (options.automaticRelease) {
  46. buildRequest.build_parameters.AUTO_RELEASE = 'true'
  47. }
  48. let circleResponse = await makeRequest({
  49. method: 'POST',
  50. url: buildUrl,
  51. headers: {
  52. 'Content-Type': 'application/json',
  53. 'Accept': 'application/json'
  54. },
  55. body: JSON.stringify(buildRequest)
  56. }, true).catch(err => {
  57. console.log('Error calling CircleCI:', err)
  58. })
  59. console.log(`Check ${circleResponse.build_url} for status. (${job})`)
  60. }
  61. async function buildAppVeyor (targetBranch, options) {
  62. console.log(`Triggering AppVeyor to run build on branch: ${targetBranch} with release flag.`)
  63. assert(process.env.APPVEYOR_TOKEN, 'APPVEYOR_TOKEN not found in environment')
  64. let environmentVariables = {}
  65. if (options.ghRelease) {
  66. environmentVariables.ELECTRON_RELEASE = 1
  67. } else {
  68. environmentVariables.RUN_RELEASE_BUILD = 'true'
  69. }
  70. if (options.automaticRelease) {
  71. environmentVariables.AUTO_RELEASE = 'true'
  72. }
  73. const requestOpts = {
  74. url: buildAppVeyorURL,
  75. auth: {
  76. bearer: process.env.APPVEYOR_TOKEN
  77. },
  78. headers: {
  79. 'Content-Type': 'application/json'
  80. },
  81. body: JSON.stringify({
  82. accountName: 'AppVeyor',
  83. projectSlug: 'electron',
  84. branch: targetBranch,
  85. environmentVariables
  86. }),
  87. method: 'POST'
  88. }
  89. let appVeyorResponse = await makeRequest(requestOpts, true).catch(err => {
  90. console.log('Error calling AppVeyor:', err)
  91. })
  92. const buildUrl = `https://windows-ci.electronjs.org/project/AppVeyor/electron/build/${appVeyorResponse.version}`
  93. console.log(`AppVeyor release build request successful. Check build status at ${buildUrl}`)
  94. }
  95. function buildCircleCI (targetBranch, options) {
  96. const circleBuildUrl = `https://circleci.com/api/v1.1/project/github/electron/electron/tree/${targetBranch}?circle-token=${process.env.CIRCLE_TOKEN}`
  97. if (options.job) {
  98. assert(circleCIJobs.includes(options.job), `Unknown CI job name: ${options.job}.`)
  99. circleCIcall(circleBuildUrl, targetBranch, options.job, options)
  100. } else {
  101. circleCIJobs.forEach((job) => circleCIcall(circleBuildUrl, targetBranch, job, options))
  102. }
  103. }
  104. function runRelease (targetBranch, options) {
  105. if (options.ci) {
  106. switch (options.ci) {
  107. case 'CircleCI': {
  108. buildCircleCI(targetBranch, options)
  109. break
  110. }
  111. case 'AppVeyor': {
  112. buildAppVeyor(targetBranch, options)
  113. break
  114. }
  115. }
  116. } else {
  117. buildCircleCI(targetBranch, options)
  118. buildAppVeyor(targetBranch, options)
  119. }
  120. }
  121. module.exports = runRelease
  122. if (require.main === module) {
  123. const args = require('minimist')(process.argv.slice(2), {
  124. boolean: ['ghRelease', 'automaticRelease']
  125. })
  126. const targetBranch = args._[0]
  127. if (args._.length < 1) {
  128. console.log(`Trigger CI to build release builds of electron.
  129. Usage: ci-release-build.js [--job=CI_JOB_NAME] [--ci=CircleCI|AppVeyor] [--ghRelease] [--automaticRelease] TARGET_BRANCH
  130. `)
  131. process.exit(0)
  132. }
  133. runRelease(targetBranch, args)
  134. }