github_release.rb 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/env ruby
  2. require 'pathname'
  3. require 'octokit'
  4. require 'fileutils'
  5. BUILD_SH = Pathname(__FILE__).+('../../build.sh').expand_path
  6. REPOSITORY = 'realm/realm-swift'
  7. def sh(*args)
  8. puts "executing: #{args.join(' ')}" if false
  9. system(*args, false ? {} : {:out => '/dev/null'}) || exit(1)
  10. end
  11. def release_notes(version)
  12. changelog = BUILD_SH.parent.+('CHANGELOG.md').readlines
  13. current_version_index = changelog.find_index { |line| line =~ (/^#{Regexp.escape version}/) }
  14. unless current_version_index
  15. raise "Update the changelog for the last version (#{version})"
  16. end
  17. current_version_index += 2
  18. previous_version_lines = changelog[(current_version_index+1)...-1]
  19. previous_version_index = current_version_index + (previous_version_lines.find_index { |line| line =~ /^\d+\.\d+\.\d+(-(alpha|beta|rc)(\.\d+)?)?\s+/ } || changelog.count)
  20. relevant = changelog[current_version_index..previous_version_index]
  21. relevant.join.strip
  22. end
  23. def create_release(version)
  24. access_token = ENV['GITHUB_ACCESS_TOKEN']
  25. raise 'GITHUB_ACCESS_TOKEN must be set to create GitHub releases' unless access_token
  26. release_notes = release_notes(version)
  27. github = Octokit::Client.new
  28. github.access_token = ENV['GITHUB_ACCESS_TOKEN']
  29. puts 'Creating GitHub release'
  30. prerelease = (version =~ /alpha|beta|rc|preview/) ? true : false
  31. release = "v#{version}"
  32. response = github.create_release(REPOSITORY, release, name: release, body: release_notes, prerelease: prerelease)
  33. release_url = response[:url]
  34. Dir.glob 'release-package/*.zip' do |upload|
  35. puts "Uploading #{upload} to GitHub"
  36. github.upload_asset(release_url, upload, content_type: 'application/zip')
  37. end
  38. end
  39. def package_release_notes(version)
  40. release_notes = release_notes(version)
  41. FileUtils.mkdir_p("ExtractedChangelog")
  42. out_file = File.new("ExtractedChangelog/CHANGELOG.md", "w")
  43. out_file.puts(release_notes)
  44. end
  45. def download_artifacts(key, sha)
  46. access_token = ENV['GITHUB_ACCESS_TOKEN']
  47. raise 'GITHUB_ACCESS_TOKEN must be set to create GitHub releases' unless access_token
  48. github = Octokit::Client.new
  49. github.auto_paginate = true
  50. github.access_token = ENV['GITHUB_ACCESS_TOKEN']
  51. response = github.repository_artifacts(REPOSITORY)
  52. sha_artifacts = response[:artifacts].filter { |artifact| artifact[:workflow_run][:head_sha] == sha && artifact[:name] == key }
  53. sha_artifacts.each { |artifact|
  54. download_url = github.artifact_download_url(REPOSITORY, artifact[:id])
  55. download(artifact[:name], download_url)
  56. }
  57. end
  58. def download(name, url)
  59. sh 'curl', '--output', "#{name}.zip", "#{url}"
  60. end
  61. if ARGV[0] == 'create-release'
  62. version = ARGV[1]
  63. create_release(version)
  64. elsif ARGV[0] == 'package-release-notes'
  65. version = ARGV[1]
  66. package_release_notes(version)
  67. elsif ARGV[0] == 'download-artifacts'
  68. key = ARGV[1]
  69. sha = ARGV[2]
  70. download_artifacts(key, sha)
  71. end