release_robot 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +50 -0
- data/CONTRIBUTING.md +58 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +40 -0
- data/Rakefile +21 -0
- data/bin/release_robot +7 -0
- data/lib/release_robot.rb +134 -0
- data/lib/release_robot/main.rb +88 -0
- data/lib/release_robot/printer.rb +60 -0
- data/lib/release_robot/version.rb +3 -0
- data/release_robot.gemspec +28 -0
- metadata +140 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d6a538b348c00e6432db77a517a6b137abf87085
|
4
|
+
data.tar.gz: 851612ac8cb53d5803ed37cbb04395af2e640445
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 29fd114c621cf47d88ffe255cdec15db430375516c721160d30002449ebf8031073381c3a680133e0755e233e922966fb78b1d86013bdb09a0e3413ea55a7fee
|
7
|
+
data.tar.gz: 96c91c028f7c655fdbfa369523f340854170f374060012e7061d90a3a6289c69cfbbc0dcb15b640ba523dcc6627fe57c4740f7dff51370e0e4765139800ce165
|
data/.gitignore
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/test/tmp/
|
10
|
+
/test/version_tmp/
|
11
|
+
/tmp/
|
12
|
+
|
13
|
+
# Used by dotenv library to load environment variables.
|
14
|
+
# .env
|
15
|
+
|
16
|
+
## Specific to RubyMotion:
|
17
|
+
.dat*
|
18
|
+
.repl_history
|
19
|
+
build/
|
20
|
+
*.bridgesupport
|
21
|
+
build-iPhoneOS/
|
22
|
+
build-iPhoneSimulator/
|
23
|
+
|
24
|
+
## Specific to RubyMotion (use of CocoaPods):
|
25
|
+
#
|
26
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
27
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
28
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
29
|
+
#
|
30
|
+
# vendor/Pods/
|
31
|
+
|
32
|
+
## Documentation cache and generated files:
|
33
|
+
/.yardoc/
|
34
|
+
/_yardoc/
|
35
|
+
/doc/
|
36
|
+
/rdoc/
|
37
|
+
|
38
|
+
## Environment normalization:
|
39
|
+
/.bundle/
|
40
|
+
/vendor/bundle
|
41
|
+
/lib/bundler/man/
|
42
|
+
|
43
|
+
# for a library or gem, you might want to ignore these files since the code is
|
44
|
+
# intended to run in multiple environments; otherwise, check them in:
|
45
|
+
# Gemfile.lock
|
46
|
+
# .ruby-version
|
47
|
+
# .ruby-gemset
|
48
|
+
|
49
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
50
|
+
.rvmrc
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
Contributing
|
2
|
+
============
|
3
|
+
|
4
|
+
We love pull requests from everyone. By participating in this project, you agree
|
5
|
+
to abide by the [contributor covenant].
|
6
|
+
|
7
|
+
[contributor covenant v1.4]: http://contributor-covenant.org/version/1/4/
|
8
|
+
|
9
|
+
Here's a quick guide for contributing:
|
10
|
+
|
11
|
+
1. Fork the repo.
|
12
|
+
|
13
|
+
2. Run the tests. We only take pull requests with passing tests, and it's great
|
14
|
+
to know that you have a clean slate: `bundle && bundle exec rake`
|
15
|
+
|
16
|
+
3. Add a test for your change. Only refactoring and documentation changes
|
17
|
+
require no new tests. If you are adding functionality or fixing a bug, we need
|
18
|
+
a test!
|
19
|
+
|
20
|
+
4. Make the test pass.
|
21
|
+
|
22
|
+
5. Push to your fork and submit a pull request.
|
23
|
+
|
24
|
+
At this point you're waiting on us. We like to at least comment on, if not
|
25
|
+
accept, pull requests within seven business days. We may suggest some changes or improvements or
|
26
|
+
alternatives.
|
27
|
+
|
28
|
+
Some things that will increase the chance that your pull request is accepted,
|
29
|
+
taken straight from the Ruby on Rails guide:
|
30
|
+
|
31
|
+
* Use Rails idioms and helpers
|
32
|
+
* Include tests that fail without your code, and pass with it
|
33
|
+
* Update the documentation, the surrounding one, examples elsewhere, guides,
|
34
|
+
whatever is affected by your contribution
|
35
|
+
|
36
|
+
Running Tests
|
37
|
+
-------------
|
38
|
+
|
39
|
+
release_robot uses [cucumber]() for its unit tests. If you submit
|
40
|
+
tests that are not written for cucumber without a very good reason, you
|
41
|
+
will be asked to rewrite them before we'll accept.
|
42
|
+
|
43
|
+
### To run a full test suite:
|
44
|
+
|
45
|
+
bundle exec rake
|
46
|
+
|
47
|
+
This will run RSpec and Cucumber against all version of Rails
|
48
|
+
|
49
|
+
### To run single test file
|
50
|
+
|
51
|
+
bundle exec rake test TEST=test/test_foobar.rb
|
52
|
+
|
53
|
+
Syntax
|
54
|
+
------
|
55
|
+
|
56
|
+
Please follow the [Ruby style guide](https://github.com/bbatsov/ruby-style-guide).
|
57
|
+
Rubocop will be used on Pull Requests. If you submit code that deviates from this style,
|
58
|
+
you will be asked to justify it, and may be asked to change it.
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2017 Mammoth HR
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# release_robot
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
```bash
|
6
|
+
$ rake install
|
7
|
+
$ release_robot
|
8
|
+
```
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
This requires your Github username and password to authenticate and requires that you *do not* have 2-factor auth setup for Github. The gem will prompt you for those credentials on first run and store them in `~/.release_robot_settings.yml`.
|
13
|
+
|
14
|
+
## What it does
|
15
|
+
|
16
|
+
Currently, this gem will scan all repositories in the `MammothHR` Github account, collect any Pull Requests that are labeled with "Ready for Thursday Release" or "Ready for Immediate Release," change the base branch to `weekly-release`, determine the build status from Travis, parse any Podio URLs from the Pull Request body, and print out two summaries:
|
17
|
+
1. A verbose summary for posting to #releases channel, which shows the PR title, URL, Podio URL(s) if any, and the build status.
|
18
|
+
2. A terse summary with today's date and a bulleted list of PR titles and the repo to which they belong.
|
19
|
+
|
20
|
+
## Next steps to automate
|
21
|
+
|
22
|
+
- post reminder about updating versions in package.json if an addon is updated
|
23
|
+
- tag repos with the correct tag
|
24
|
+
- For the most part, for Thursday releases, this will be the next minor version (i.e. if the last tag was v2.13.2, then next is v2.13.3).
|
25
|
+
- For hrsc and hrsc-ember, their tags should always be in sync
|
26
|
+
- merge PRs with green builds (perhaps a separate script)
|
27
|
+
- delete branches after merge
|
28
|
+
- check if there's a staging branch for merged branches and either
|
29
|
+
- include that in the notes, or
|
30
|
+
- auto teardown
|
31
|
+
- mark Podio tasks as Complete after deploy (perhaps a separate script)
|
32
|
+
- skip CI for all but the last merge to `weekly-release`
|
33
|
+
- Can be done by adding 'skip ci' to the merge commit (in the web interface, this can be done when “Confirm Merge” comes up; unsure about API)
|
34
|
+
- figure out a standard way to define pre- or post-deploy steps so those can be included in the release prep somehow
|
35
|
+
|
36
|
+
*"Nice to have" Slack integrations:*
|
37
|
+
These would require setting up a slack bot server to receive Github webhooks
|
38
|
+
- Post to #code-review-requests when the label "Needs Code Review" is added (https://developer.github.com/v3/activity/events/types/#labelevent)
|
39
|
+
- Approved PR adds the :white_check_mark: reaction to the link posted in #code-review-requests (https://developer.github.com/v3/activity/events/types/#pullrequestreviewevent)
|
40
|
+
- Merged PR automatically adds the :merge: reaction to the link posted in #code-review-requests (https://developer.github.com/v3/activity/events/types/#pullrequestevent)
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
|
4
|
+
desc 'Run in IRB for debugging'
|
5
|
+
task :console do
|
6
|
+
require 'irb'
|
7
|
+
require 'irb/completion'
|
8
|
+
require 'pp'
|
9
|
+
require 'yaml'
|
10
|
+
require 'octokit'
|
11
|
+
Dir[File.expand_path "lib/**/*.rb"].each{|file| require_relative file }
|
12
|
+
ARGV.clear
|
13
|
+
IRB.start
|
14
|
+
end
|
15
|
+
|
16
|
+
Rake::TestTask.new do |t|
|
17
|
+
t.libs << 'test'
|
18
|
+
t.test_files = FileList['test/**/*_test.rb']
|
19
|
+
end
|
20
|
+
|
21
|
+
task default: :test
|
data/bin/release_robot
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'optparse/date'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'json'
|
5
|
+
require 'octokit'
|
6
|
+
require 'highline/import'
|
7
|
+
require 'release_robot/main'
|
8
|
+
require 'release_robot/printer'
|
9
|
+
|
10
|
+
module ReleaseRobot
|
11
|
+
class << self
|
12
|
+
def run(args)
|
13
|
+
options = ReleaseRobot.parse(args)
|
14
|
+
|
15
|
+
create_settings_file_if_nonexistent
|
16
|
+
|
17
|
+
fetch_envars_from_config
|
18
|
+
|
19
|
+
missing_envars = get_missing_envars
|
20
|
+
|
21
|
+
write_missing_envars(missing_envars) if missing_envars.any?
|
22
|
+
|
23
|
+
robot = ReleaseRobot::Main.new
|
24
|
+
pull_requests = robot.start
|
25
|
+
client = robot.client
|
26
|
+
|
27
|
+
ReleaseRobot::Printer.new(pull_requests, client).print_all
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse(args)
|
31
|
+
options = OpenStruct.new
|
32
|
+
|
33
|
+
opt_parser = OptionParser.new do |opts|
|
34
|
+
opts.separator ''
|
35
|
+
opts.banner = 'Usage: release_robot [options]'
|
36
|
+
|
37
|
+
opts.separator ''
|
38
|
+
opts.separator 'Common options:'
|
39
|
+
|
40
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
41
|
+
puts opts
|
42
|
+
exit
|
43
|
+
end
|
44
|
+
|
45
|
+
opts.on_tail('-v', '--version', 'Show version') do
|
46
|
+
puts ReleaseRobot::VERSION
|
47
|
+
exit
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
opt_parser.parse!(args)
|
52
|
+
options
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_missing_envars
|
56
|
+
missing_envars = {}
|
57
|
+
|
58
|
+
ReleaseRobot.envars.each do |key|
|
59
|
+
next if ENV[key]
|
60
|
+
missing_envars[key] = get_envar(key)
|
61
|
+
end
|
62
|
+
|
63
|
+
return missing_envars
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_envar(key)
|
67
|
+
if key =~ /GITHUB_PASSWORD/
|
68
|
+
env_value = ask("Enter your #{key}: ") { |q| q.echo = "*" }
|
69
|
+
else
|
70
|
+
print "Enter your #{key}: "
|
71
|
+
env_value = gets.chomp
|
72
|
+
end
|
73
|
+
env_value.strip! unless should_not_strip?(key)
|
74
|
+
if env_value.length == 0
|
75
|
+
puts 'Invalid input. This is a required field.'
|
76
|
+
exit
|
77
|
+
end
|
78
|
+
env_value
|
79
|
+
end
|
80
|
+
|
81
|
+
def should_not_strip?(key)
|
82
|
+
false
|
83
|
+
end
|
84
|
+
|
85
|
+
def fetch_envars_from_config
|
86
|
+
return unless envars = YAML.load_file(settings_file_path)
|
87
|
+
envars.each_pair do |key, value|
|
88
|
+
value.strip! unless should_not_strip?(key)
|
89
|
+
ENV[key.upcase] = value
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def write_missing_envars(missing_envars={})
|
94
|
+
puts "\nTo avoid entering setup information each time, the following configuration has been stored in `#{settings_file_path}`:"
|
95
|
+
missing_envars.each_pair do |key, value|
|
96
|
+
if key =~ /password|token/i
|
97
|
+
puts "\t#{key}=[FILTERED]"
|
98
|
+
else
|
99
|
+
puts "\t#{key}=#{value}"
|
100
|
+
end
|
101
|
+
|
102
|
+
data = YAML.load_file(settings_file_path) || {}
|
103
|
+
ENV[key.upcase] = data[key.downcase] = value
|
104
|
+
File.open(settings_file_path, 'w') { |f| YAML.dump(data, f) }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def create_settings_file_if_nonexistent
|
109
|
+
File.new(settings_file_path, "w+") unless File.file?(settings_file_path)
|
110
|
+
end
|
111
|
+
|
112
|
+
def settings_file_path
|
113
|
+
File.join(ENV['HOME'], '.release_robot_settings.yml')
|
114
|
+
end
|
115
|
+
|
116
|
+
def root
|
117
|
+
File.dirname __dir__
|
118
|
+
end
|
119
|
+
|
120
|
+
def envars
|
121
|
+
envars_help.keys
|
122
|
+
end
|
123
|
+
|
124
|
+
def envars_help
|
125
|
+
{
|
126
|
+
'GITHUB_USERNAME' =>
|
127
|
+
"Your username for github.com\n\n",
|
128
|
+
|
129
|
+
'GITHUB_PASSWORD' =>
|
130
|
+
"Your password for github.com\n\n",
|
131
|
+
}
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module ReleaseRobot
|
2
|
+
class Main
|
3
|
+
RELEASE_BASE_BRANCH = 'weekly-release'.freeze
|
4
|
+
THURSDAY_LABEL = 'Ready for Thursday Release'.freeze
|
5
|
+
IMMEDIATE_LABEL = 'Ready for Immediate Release'.freeze
|
6
|
+
|
7
|
+
def start
|
8
|
+
repos.each do |repo|
|
9
|
+
next unless repo.owner.login == 'MammothHR'
|
10
|
+
|
11
|
+
repo_name = repo.full_name
|
12
|
+
puts "Fetching issues for #{repo_name}"
|
13
|
+
|
14
|
+
all_issues = labels.map do |label|
|
15
|
+
client.list_issues(repo_name, labels: label)
|
16
|
+
end.flatten
|
17
|
+
|
18
|
+
all_issues.each do |issue|
|
19
|
+
collect_pull_requests(repo_name, issue)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
return pull_requests
|
24
|
+
end
|
25
|
+
|
26
|
+
def labels
|
27
|
+
[THURSDAY_LABEL, IMMEDIATE_LABEL]
|
28
|
+
end
|
29
|
+
|
30
|
+
def client
|
31
|
+
@client ||= Octokit::Client.new(
|
32
|
+
login: ENV['GITHUB_USERNAME'],
|
33
|
+
password: ENV['GITHUB_PASSWORD']
|
34
|
+
)
|
35
|
+
rescue => ex
|
36
|
+
puts "Failed: #{ex}"
|
37
|
+
puts '(Do you have the right Github username and password stored in'
|
38
|
+
puts 'GITHUB_USERNAME and GITHUB_PASSWORD?)'
|
39
|
+
end
|
40
|
+
|
41
|
+
def repos
|
42
|
+
@repos ||= client.repos(owner: 'MammothHR')
|
43
|
+
end
|
44
|
+
|
45
|
+
def pull_requests
|
46
|
+
@pull_requests ||= {
|
47
|
+
'success' => [],
|
48
|
+
'pending' => [],
|
49
|
+
'failure' => []
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def collect_pull_requests(repo_name, issue)
|
54
|
+
print "- Determining build status for #{issue.number}"
|
55
|
+
pull_request = client.pull_request(repo_name, issue.number)
|
56
|
+
|
57
|
+
# Build status
|
58
|
+
status = client.combined_status(repo_name, pull_request.head.sha)
|
59
|
+
|
60
|
+
change_base(repo_name, pull_request)
|
61
|
+
|
62
|
+
sort_issue_by_status(issue, status.state, repo_name)
|
63
|
+
end
|
64
|
+
|
65
|
+
def change_base(repo_name, pull_request)
|
66
|
+
client.update_pull_request(
|
67
|
+
repo_name,
|
68
|
+
pull_request.number,
|
69
|
+
nil,
|
70
|
+
nil,
|
71
|
+
base: RELEASE_BASE_BRANCH
|
72
|
+
)
|
73
|
+
rescue Octokit::UnprocessableEntity => ex
|
74
|
+
puts "Error occurred when attempting to change base branch to #{RELEASE_BASE_BRANCH}:"
|
75
|
+
puts ex.message
|
76
|
+
end
|
77
|
+
|
78
|
+
def sort_issue_by_status(issue, status, repo_name)
|
79
|
+
case status
|
80
|
+
when 'success' then pull_requests['success'] << [repo_name, issue]
|
81
|
+
when 'pending' then pull_requests['pending'] << [repo_name, issue]
|
82
|
+
when 'failure' then pull_requests['failure'] << [repo_name, issue]
|
83
|
+
end
|
84
|
+
|
85
|
+
print " -- #{status}\n"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module ReleaseRobot
|
2
|
+
class Printer
|
3
|
+
PODIO_URL_REGEX = /https:\/\/podio.com\/hranswerlink-8ee92nawfl\/issue-tracker\/apps\/product-feedback\/items\/\d+/
|
4
|
+
|
5
|
+
attr_accessor :pull_requests, :client
|
6
|
+
|
7
|
+
def initialize(pull_requests, client)
|
8
|
+
@pull_requests = pull_requests
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def print_all
|
13
|
+
print_prep_list
|
14
|
+
print_deploy_list
|
15
|
+
end
|
16
|
+
|
17
|
+
def print_prep_list
|
18
|
+
print_title 'Prep list for #releases'
|
19
|
+
|
20
|
+
puts "For today's release:\n\n"
|
21
|
+
|
22
|
+
pull_requests.each_pair do |status, issues|
|
23
|
+
issues.each do |(repo_name, issue)|
|
24
|
+
puts issue.title
|
25
|
+
puts issue.html_url
|
26
|
+
podio_urls(repo_name, issue).each { |url| puts url }
|
27
|
+
puts "*Build #{status}*"
|
28
|
+
puts
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def print_deploy_list
|
34
|
+
print_title 'List for #deploys'
|
35
|
+
|
36
|
+
puts Date.today.strftime('%D')
|
37
|
+
|
38
|
+
pull_requests.each_pair do |_, issues|
|
39
|
+
issues.each do |(repo_name, issue)|
|
40
|
+
slug = repo_name.gsub('MammothHR/', '')
|
41
|
+
|
42
|
+
puts "(#{slug}) #{issue.title}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def print_title(title)
|
48
|
+
puts
|
49
|
+
puts '-' * 50
|
50
|
+
puts title
|
51
|
+
puts '-' * 50
|
52
|
+
puts
|
53
|
+
end
|
54
|
+
|
55
|
+
def podio_urls(repo_name, issue)
|
56
|
+
pr = client.pull_request(repo_name, issue.number)
|
57
|
+
pr.body.scan PODIO_URL_REGEX
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'release_robot/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'release_robot'
|
8
|
+
spec.version = ReleaseRobot::VERSION
|
9
|
+
spec.authors = ['Mark J. Lehman']
|
10
|
+
spec.email = ['markopolo@gmail.com']
|
11
|
+
spec.description = %q{Automate release tasks}
|
12
|
+
spec.summary = %q{Automate tasks surrounding releasing and deploying new code, informing stakeholders, and getting feedback.}
|
13
|
+
spec.homepage = 'https://github.com/MammothHR/release_robot'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.required_ruby_version = '>= 2.0'
|
22
|
+
spec.add_development_dependency 'pry', '~> 0'
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.5'
|
25
|
+
|
26
|
+
spec.add_runtime_dependency 'octokit', '~> 4.6.2', '>= 4.6.0'
|
27
|
+
spec.add_runtime_dependency 'highline', '~> 1.7.0', '>= 1.7.0'
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: release_robot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mark J. Lehman
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-08-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pry
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: octokit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 4.6.2
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 4.6.0
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 4.6.2
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 4.6.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: highline
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 1.7.0
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.7.0
|
85
|
+
type: :runtime
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 1.7.0
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 1.7.0
|
95
|
+
description: Automate release tasks
|
96
|
+
email:
|
97
|
+
- markopolo@gmail.com
|
98
|
+
executables:
|
99
|
+
- release_robot
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- ".gitignore"
|
104
|
+
- CONTRIBUTING.md
|
105
|
+
- Gemfile
|
106
|
+
- LICENSE.txt
|
107
|
+
- README.md
|
108
|
+
- Rakefile
|
109
|
+
- bin/release_robot
|
110
|
+
- lib/release_robot.rb
|
111
|
+
- lib/release_robot/main.rb
|
112
|
+
- lib/release_robot/printer.rb
|
113
|
+
- lib/release_robot/version.rb
|
114
|
+
- release_robot.gemspec
|
115
|
+
homepage: https://github.com/MammothHR/release_robot
|
116
|
+
licenses:
|
117
|
+
- MIT
|
118
|
+
metadata: {}
|
119
|
+
post_install_message:
|
120
|
+
rdoc_options: []
|
121
|
+
require_paths:
|
122
|
+
- lib
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '2.0'
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 2.6.11
|
136
|
+
signing_key:
|
137
|
+
specification_version: 4
|
138
|
+
summary: Automate tasks surrounding releasing and deploying new code, informing stakeholders,
|
139
|
+
and getting feedback.
|
140
|
+
test_files: []
|