github_informer 0.0.2
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/LICENSE +22 -0
- data/README.md +51 -0
- data/bin/gh_execute +60 -0
- data/lib/github_informer.rb +85 -0
- metadata +64 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bede0acb6870c5ba232527f3eed280ea5b5c1c5d
|
4
|
+
data.tar.gz: 6ea2200407bbcfcc44c6986fae3e18337bd1823d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 83e0f5b017e0d649aff7cd433ff76fd990618766c444981e6fca2e11741b0372a97fc3461188da768b64e10cacaa1dc5328c8a3123656231fc683af971ad8507
|
7
|
+
data.tar.gz: b93dc24ee431518428ff7c3ffe89c58284127a3eaa97400c2fa89b08affec3dbad5e73552815d894e3299195e6b2f49c7cb9fc3ed5e792e741e4caf29204cbcb
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 BBC
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# github_informer
|
2
|
+
|
3
|
+
Gem for submitting useful metadata to github to inform pull requests
|
4
|
+
|
5
|
+
## Submitting CI information
|
6
|
+
|
7
|
+
GithubInformer lets you wrap execution of your test or build scripts with github
|
8
|
+
hooks to let you add CI status check information to your commits. These status
|
9
|
+
checks appear alongside your pull request discussion in github and help with the
|
10
|
+
conversation.
|
11
|
+
|
12
|
+
### Using the CLI
|
13
|
+
|
14
|
+
The CLI is the easiest method of capturing your status checks. Simply install
|
15
|
+
the gem and wrap your ci commands like this example:
|
16
|
+
|
17
|
+
gh_execute --cmd 'bundle exec rspec'
|
18
|
+
|
19
|
+
You can add a context to the execution so it's more identifiable in github:
|
20
|
+
|
21
|
+
gh_execute --context 'Rspec tests' --cmd 'bundle exec rspec'
|
22
|
+
|
23
|
+
There are numerous optional arguments for more control:
|
24
|
+
|
25
|
+
gh_execute --cmd 'bundle exec rspec'
|
26
|
+
[--context <CONTEXT>]
|
27
|
+
[--path <PATH_TO_CHECKOUT>]
|
28
|
+
[--url <URL_LINK_TO_CI_JOB>]
|
29
|
+
|
30
|
+
If you're running in jenkins, url will automatically get picked up by the
|
31
|
+
environment.
|
32
|
+
|
33
|
+
### Using the API
|
34
|
+
|
35
|
+
You can have much more control over the messages that get reported into github
|
36
|
+
if you write a ruby script to wrap your execution. For example, the following
|
37
|
+
script gives comprehensive failure messages:
|
38
|
+
|
39
|
+
# Create new informer
|
40
|
+
g = GithubInformer.new(:context => 'HiveCI', :url => ENV['HIVE_JOB_URL'] )
|
41
|
+
|
42
|
+
# Add a pending status check to github
|
43
|
+
g.report_start( :description => 'Executing unit tests in Hive environment')
|
44
|
+
|
45
|
+
# Wrap execution of the script
|
46
|
+
g.execute( 'bundle exec rake unittests' )
|
47
|
+
|
48
|
+
# Report a different message depending on the exit value of the script
|
49
|
+
g.report_end( 0 => [:pass, 'Unit tests were fine: good to merge'],
|
50
|
+
1 => [:pending, 'Tests are re-running. Hold off merge.'],
|
51
|
+
2..200 => [:fail, 'Unit test failure. Do not merge'] )
|
data/bin/gh_execute
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'github_informer'
|
6
|
+
|
7
|
+
class CLIParser
|
8
|
+
|
9
|
+
#
|
10
|
+
# Return a structure describing the options.
|
11
|
+
#
|
12
|
+
def self.parse(args)
|
13
|
+
|
14
|
+
# Default values
|
15
|
+
options = OpenStruct.new
|
16
|
+
options.context = 'Custom Check'
|
17
|
+
options.path = '.'
|
18
|
+
options.url = ENV['BUILD_URL'] #Chances are this is running in jenkins
|
19
|
+
|
20
|
+
opt_parser = OptionParser.new do |opts|
|
21
|
+
opts.banner = "Usage: ghi_execute [options]"
|
22
|
+
|
23
|
+
opts.on("-c", "--context NAME",
|
24
|
+
"Name to identify this check.") do |name|
|
25
|
+
options.context = name
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on("-p", "--path PATH",
|
29
|
+
"Path to the cloned github repo") do |path|
|
30
|
+
options.path = path
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.on("-c", "--cmd COMMAND",
|
34
|
+
"The command to run") do |cmd|
|
35
|
+
options.cmd = cmd
|
36
|
+
end
|
37
|
+
|
38
|
+
opts.on("-u", "--url URL",
|
39
|
+
"Url to link back to the execution from github") do |path|
|
40
|
+
options.url = url
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
opt_parser.parse!(args)
|
46
|
+
options
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
options = CLIParser.parse(ARGV)
|
51
|
+
|
52
|
+
raise "Must include a cmd to execute ( --cmd 'make' )" if !options.cmd
|
53
|
+
|
54
|
+
g = GithubInformer.new(:context => options.context, :url => options.url, :repo => options.path)
|
55
|
+
|
56
|
+
g.report_start()
|
57
|
+
|
58
|
+
g.execute( options.cmd )
|
59
|
+
|
60
|
+
g.report_end()
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'octokit'
|
2
|
+
|
3
|
+
class GithubInformer
|
4
|
+
|
5
|
+
attr_accessor :params, :repo, :sha, :result
|
6
|
+
|
7
|
+
# Create a new GithubInformer
|
8
|
+
# GithubInformer.new( :context => 'HiveCI',
|
9
|
+
# :url => 'http://hive.local',
|
10
|
+
# :repo => '/path/to/checkout' )
|
11
|
+
def initialize( args = {} )
|
12
|
+
|
13
|
+
::Octokit.configure do |c|
|
14
|
+
c.access_token = args[:github_auth] || ENV['GITHUB_AUTH']
|
15
|
+
c.auto_paginate = true
|
16
|
+
end
|
17
|
+
|
18
|
+
@params = {}
|
19
|
+
@params[:context] = args[:context] or raise "Requires a context"
|
20
|
+
@params[:target_url] = args[:url]
|
21
|
+
|
22
|
+
path = args[:repo] || '.'
|
23
|
+
@repo = GithubInformer.determine_repo(path)
|
24
|
+
@sha = GithubInformer.determine_sha(path)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Report start of job to github
|
28
|
+
# ghi.report_start( :description => 'Build job in progress')
|
29
|
+
def report_start( args = {} )
|
30
|
+
Octokit.create_status( repo, sha, 'pending', params.merge(args) )
|
31
|
+
end
|
32
|
+
|
33
|
+
def execute( cmd )
|
34
|
+
system( cmd )
|
35
|
+
@result = $?.exitstatus
|
36
|
+
end
|
37
|
+
|
38
|
+
# Report
|
39
|
+
# ghi.report_end( 0 => [ :pass, 'Build passed successfully'],
|
40
|
+
# 1..100 => [ :fail, 'Build had errors' ],
|
41
|
+
# :default => [ :error, 'Build totally broken'] )
|
42
|
+
def report_end( args = { 0 => [:pass, 'Good to merge'],
|
43
|
+
:default => [:fail, 'Do not merge' ] } )
|
44
|
+
if result
|
45
|
+
(status,description) = args[:default] || [ :fail, 'Do not merge' ]
|
46
|
+
hash = args.select { |a| a === result }
|
47
|
+
if !hash.empty?
|
48
|
+
(status, description) = hash.values.flatten
|
49
|
+
end
|
50
|
+
|
51
|
+
status = GithubInformer.normalise_status(status)
|
52
|
+
Octokit.create_status( repo, sha, status, params.merge( {:description => description} ) )
|
53
|
+
else
|
54
|
+
Octokit.create_status( repo, sha, 'error', params.merge( {:description => 'Program never completed'} ) )
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Make sure the statuses are what the github api expect
|
59
|
+
def self.normalise_status(status)
|
60
|
+
case
|
61
|
+
when status.to_s.match(/fail/)
|
62
|
+
'failure'
|
63
|
+
when status.to_s.match(/pass/)
|
64
|
+
'success'
|
65
|
+
else
|
66
|
+
status.to_s
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def self.determine_repo(path)
|
72
|
+
output = `cd #{path} && git remote -v | grep github`
|
73
|
+
res = output.match(/github.com:(.*\/.*).git/)
|
74
|
+
repo = res.captures.first
|
75
|
+
raise "Couldn't determine repo" if !repo
|
76
|
+
repo
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.determine_sha(path)
|
80
|
+
sha = `cd #{path} && git rev-parse HEAD`.strip
|
81
|
+
raise "Couldn't determine sha" if !sha || sha.length == 0
|
82
|
+
sha
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: github_informer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- BBC
|
8
|
+
- David Buckhurst
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-08-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: octokit
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
description: Publish CI results to Github
|
29
|
+
email: david.buckhurst@bbc.co.uk
|
30
|
+
executables:
|
31
|
+
- gh_execute
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- LICENSE
|
36
|
+
- README.md
|
37
|
+
- bin/gh_execute
|
38
|
+
- lib/github_informer.rb
|
39
|
+
homepage: https://github.com/bbc/github_informer
|
40
|
+
licenses:
|
41
|
+
- MIT
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.4.5
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: Github Informer
|
63
|
+
test_files: []
|
64
|
+
has_rdoc:
|