download-circleci-artifacts.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const args = require('minimist')(process.argv.slice(2))
  2. const nugget = require('nugget')
  3. const request = require('request')
  4. async function makeRequest (requestOptions, parseResponse) {
  5. return new Promise((resolve, reject) => {
  6. request(requestOptions, (err, res, body) => {
  7. if (!err && res.statusCode >= 200 && res.statusCode < 300) {
  8. if (parseResponse) {
  9. const build = JSON.parse(body)
  10. resolve(build)
  11. } else {
  12. resolve(body)
  13. }
  14. } else {
  15. console.error('Error occurred while requesting:', requestOptions.url)
  16. if (parseResponse) {
  17. try {
  18. console.log('Error: ', `(status ${res.statusCode})`, err || JSON.parse(res.body), requestOptions)
  19. } catch (err) {
  20. console.log('Error: ', `(status ${res.statusCode})`, err || res.body, requestOptions)
  21. }
  22. } else {
  23. console.log('Error: ', `(status ${res.statusCode})`, err || res.body, requestOptions)
  24. }
  25. reject(err)
  26. }
  27. })
  28. })
  29. }
  30. async function downloadArtifact (name, buildNum, dest) {
  31. const circleArtifactUrl = `https://circleci.com/api/v1.1/project/github/electron/electron/${args.buildNum}/artifacts?circle-token=${process.env.CIRCLE_TOKEN}`
  32. const artifacts = await makeRequest({
  33. method: 'GET',
  34. url: circleArtifactUrl,
  35. headers: {
  36. 'Content-Type': 'application/json',
  37. 'Accept': 'application/json'
  38. }
  39. }, true).catch(err => {
  40. console.log('Error calling CircleCI:', err)
  41. })
  42. const artifactToDownload = artifacts.find(artifact => {
  43. return (artifact.path === name)
  44. })
  45. if (!artifactToDownload) {
  46. console.log(`Could not find artifact called ${name} to download for build #${buildNum}.`)
  47. process.exit(1)
  48. } else {
  49. console.log(`Downloading ${artifactToDownload.url}.`)
  50. await downloadFile(artifactToDownload.url, dest)
  51. console.log(`Successfully downloaded ${name}.`)
  52. }
  53. }
  54. function downloadFile (url, directory) {
  55. return new Promise((resolve, reject) => {
  56. const nuggetOpts = {
  57. dir: directory
  58. }
  59. nugget(url, nuggetOpts, (err) => {
  60. if (err) {
  61. reject(err)
  62. } else {
  63. resolve()
  64. }
  65. })
  66. })
  67. }
  68. if (!args.name || !args.buildNum || !args.dest) {
  69. console.log(`Download CircleCI artifacts.
  70. Usage: download-circleci-artifacts.js [--buildNum=CIRCLE_BUILD_NUMBER] [--name=artifactName] [--dest]`)
  71. process.exit(0)
  72. } else {
  73. downloadArtifact(args.name, args.buildNum, args.dest)
  74. }