loadrunner 0.4.2 → 0.4.3
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 +4 -4
- data/README.md +80 -35
- data/bin/loadrunner +2 -1
- data/lib/loadrunner.rb +3 -13
- data/lib/{load_runner → loadrunner}/client.rb +3 -3
- data/lib/{load_runner → loadrunner}/command_line.rb +12 -11
- data/lib/{load_runner → loadrunner}/docopt.txt +8 -8
- data/lib/{load_runner/git_hub_api.rb → loadrunner/github_api.rb} +5 -5
- data/lib/loadrunner/runner.rb +79 -0
- data/lib/{load_runner → loadrunner}/server.rb +16 -9
- data/lib/{load_runner → loadrunner}/server_base.rb +1 -2
- data/lib/{load_runner → loadrunner}/server_helper.rb +1 -1
- data/lib/{load_runner → loadrunner}/signature_helper.rb +1 -1
- data/lib/loadrunner/status.rb +21 -0
- data/lib/loadrunner/version.rb +3 -0
- metadata +17 -30
- data/lib/load_runner/runner.rb +0 -79
- data/lib/load_runner/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd9af2dc326ef685b9146a1b8a298abf9ed016561863165fd08e7aa5e4b5e79a
|
4
|
+
data.tar.gz: 75fc0ebe16b294f51f0f6aa324170cb9e653315a26b0be8af42f98ee90c2a014
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b85c8c7f3bf7d681c6e0ebc7adec6a968a78317723c47492782859068414cfe632cd25b75cf26e5f1c69e336c8b3b779718830ace0f98c8784bf235de1592323
|
7
|
+
data.tar.gz: d577629537efad165e299e9d9b0853239d89369f7660f455c34d54f78b468f57f5edad85f831c654ed8affe5e4765740db7a7855b323d12b2f709ff6e523a78b
|
data/README.md
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
|
1
|
+
Loadrunner - GitHub Webhook Server and Event Simulator
|
2
2
|
======================================================
|
3
3
|
|
4
4
|
[](https://badge.fury.io/rb/loadrunner)
|
5
5
|
[](https://travis-ci.com/DannyBen/loadrunner)
|
6
6
|
[](https://codeclimate.com/github/DannyBen/loadrunner/maintainability)
|
7
|
-
[](https://codeclimate.com/github/DannyBen/loadrunner/test_coverage)
|
8
7
|
|
9
8
|
---
|
10
9
|
|
11
|
-
|
10
|
+
Loadrunner is a multi-purpose utility for working with GitHub webhooks and
|
12
11
|
statuses.
|
13
12
|
|
14
13
|
It provides these features:
|
@@ -35,19 +34,18 @@ $ gem install loadrunner
|
|
35
34
|
Getting Started
|
36
35
|
--------------------------------------------------
|
37
36
|
|
38
|
-
1. Download the [
|
39
|
-
exmaple. This directory contains several
|
37
|
+
1. Download the [hooks](hooks) directory from this repository, as an
|
38
|
+
exmaple. This directory contains several hook examples.
|
40
39
|
2. Make sure that all files within that folder are executables.
|
41
|
-
3. Start the server (from the `
|
40
|
+
3. Start the server (from the `hooks` **parent** directory):
|
42
41
|
`loadrunner server`
|
43
42
|
4. In another terminal, send a sample webhook event:
|
44
|
-
`loadrunner event localhost:3000
|
43
|
+
`loadrunner event localhost:3000 myrepo push master
|
45
44
|
|
46
45
|
The server should respond with a detailed JSON response, specifying what
|
47
|
-
|
48
|
-
been* executed, if they were defined in the
|
49
|
-
(`
|
50
|
-
```
|
46
|
+
hooks were executed (`executed_hooks`) and what hooks *could have
|
47
|
+
been* executed, if they were defined in the hooks folder
|
48
|
+
(`matching_hooks`).
|
51
49
|
|
52
50
|
|
53
51
|
For more options, see the [documentation][1] or run
|
@@ -58,43 +56,86 @@ $ loadrunner --help
|
|
58
56
|
|
59
57
|
|
60
58
|
|
61
|
-
Building
|
59
|
+
Building Hooks
|
62
60
|
--------------------------------------------------
|
63
61
|
|
64
|
-
When running the server, it will look for
|
65
|
-
the `./
|
62
|
+
When running the server, it will look for hooks (executable scripts) in
|
63
|
+
the `./hooks` directory, using one of these format:
|
66
64
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
65
|
+
hooks/global
|
66
|
+
hooks/<repo name>/global
|
67
|
+
hooks/<repo name>/<event type>
|
68
|
+
hooks/<repo name>/<event type>@branch=<branch name>
|
69
|
+
hooks/<repo name>/<event type>@tag=<branch name>
|
72
70
|
|
73
71
|
For example:
|
74
72
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
73
|
+
hooks/global
|
74
|
+
hooks/myrepo/global
|
75
|
+
hooks/myrepo/push
|
76
|
+
hooks/myrepo/push@branch=master
|
77
|
+
hooks/myrepo/push@tag=release
|
80
78
|
|
81
|
-
When none of the
|
82
|
-
|
79
|
+
When none of the hooks are found, Loadrunner will respond with a list of
|
80
|
+
hooks it was looking for, so you can use this response to figure out what
|
83
81
|
it needs.
|
84
82
|
|
85
|
-
The
|
86
|
-
executables.
|
83
|
+
The hooks can be written in any language, and should simply be executables.
|
87
84
|
|
88
85
|
### Environment Variables
|
89
86
|
|
90
|
-
These environment variables are available to your
|
87
|
+
These environment variables are available to your hooks:
|
91
88
|
|
92
89
|
- `LOADRUNNER_REPO`
|
93
90
|
- `LOADRUNNER_EVENT`
|
94
91
|
- `LOADRUNNER_BRANCH`
|
92
|
+
- `LOADRUNNER_COMMIT`
|
95
93
|
- `LOADRUNNER_REF`
|
96
94
|
- `LOADRUNNER_TAG`
|
97
|
-
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
Using as a Rack or Sinatra mount
|
99
|
+
--------------------------------------------------
|
100
|
+
|
101
|
+
If you wish to mount the Loadrunner server under another Rack or Sinatra
|
102
|
+
application, use the `Loadrunner::Server` as the handler.
|
103
|
+
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
# config.ru
|
107
|
+
require "loadrunner/server"
|
108
|
+
|
109
|
+
map "/github" do
|
110
|
+
run Loadrunner::Server
|
111
|
+
end
|
112
|
+
|
113
|
+
run YourOwnApp
|
114
|
+
```
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
Sending Pull Request status from Ruby code
|
119
|
+
--------------------------------------------------
|
120
|
+
|
121
|
+
You may use the `Loadrunner::Status` class to update the status of a
|
122
|
+
GitHub pull request.
|
123
|
+
|
124
|
+
First, make sure that your GitHub API access token is set in the environment
|
125
|
+
variable `GITHUB_ACCESS_TOKEN`.
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
require 'loadrunner/status'
|
129
|
+
|
130
|
+
response = Loadrunner::Status.update repo: 'user/repo',
|
131
|
+
sha: 'commit sha string',
|
132
|
+
state: :pending, # :pending :success :failure :error
|
133
|
+
context: "My Hooks Server",
|
134
|
+
description: "Jobs have not started yet",
|
135
|
+
url: "http://example.com"
|
136
|
+
```
|
137
|
+
|
138
|
+
Only `repo`, `sha` and `state` are required, the rest arguments are optional.
|
98
139
|
|
99
140
|
|
100
141
|
|
@@ -103,16 +144,20 @@ Running with Docker
|
|
103
144
|
|
104
145
|
You can run both the server and the client using Docker.
|
105
146
|
|
106
|
-
|
107
|
-
|
147
|
+
```shell
|
148
|
+
# Server
|
149
|
+
$ docker run -p3000:3000 dannyben/loadrunner server
|
108
150
|
|
109
|
-
|
110
|
-
|
151
|
+
# Client
|
152
|
+
$ docker run dannyben/loadrunner event http://webhook.server.com repo push
|
153
|
+
```
|
111
154
|
|
112
155
|
If you wish to connect the client to the server you are running through Docker,
|
113
156
|
you can do something like this:
|
114
157
|
|
115
|
-
|
158
|
+
```shell
|
159
|
+
$ docker run --network host dannyben/loadrunner event http://localhost:3000 repo push
|
160
|
+
```
|
116
161
|
|
117
162
|
See also: The [docker-compose file](docker-compose.yml).
|
118
163
|
|
data/bin/loadrunner
CHANGED
data/lib/loadrunner.rb
CHANGED
@@ -1,15 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require '
|
4
|
-
require 'load_runner/server_helper'
|
5
|
-
require 'load_runner/git_hub_api'
|
6
|
-
|
7
|
-
require 'load_runner/runner'
|
8
|
-
require 'load_runner/server_base'
|
9
|
-
require 'load_runner/server'
|
10
|
-
|
11
|
-
require 'load_runner/client'
|
12
|
-
|
13
|
-
require 'load_runner/command_line'
|
1
|
+
require 'loadrunner/server'
|
2
|
+
require 'loadrunner/client'
|
3
|
+
require 'loadrunner/command_line'
|
14
4
|
|
15
5
|
require 'byebug' if ENV['BYEBUG']
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
require 'uri'
|
3
3
|
|
4
|
-
module
|
4
|
+
module Loadrunner
|
5
5
|
|
6
6
|
# Send simulated GitHub events to any webhook server
|
7
7
|
class Client
|
@@ -12,7 +12,7 @@ module LoadRunner
|
|
12
12
|
@secret_token = opts[:secret_token]
|
13
13
|
@encoding = opts[:encoding] || :json
|
14
14
|
|
15
|
-
base_url = opts[:base_url] || 'http://localhost:3000
|
15
|
+
base_url = opts[:base_url] || 'http://localhost:3000'
|
16
16
|
base_url = "http://#{base_url}" unless base_url =~ /^http/
|
17
17
|
|
18
18
|
url_parts = URI.parse base_url
|
@@ -42,7 +42,7 @@ module LoadRunner
|
|
42
42
|
self.class.post host_path, body: @payload, headers: headers(event)
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
private
|
46
46
|
|
47
47
|
def headers(event=:push)
|
48
48
|
{}.tap do |header|
|
@@ -1,7 +1,11 @@
|
|
1
1
|
require 'super_docopt'
|
2
2
|
require 'colsole'
|
3
|
+
require 'loadrunner/client'
|
4
|
+
require 'loadrunner/server'
|
5
|
+
require 'loadrunner/status'
|
6
|
+
require 'loadrunner/version'
|
3
7
|
|
4
|
-
module
|
8
|
+
module Loadrunner
|
5
9
|
|
6
10
|
# Handles the command line interface
|
7
11
|
class CommandLine < SuperDocopt::Base
|
@@ -33,20 +37,17 @@ module LoadRunner
|
|
33
37
|
end
|
34
38
|
|
35
39
|
def status
|
36
|
-
|
37
|
-
|
38
|
-
state:
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
}
|
43
|
-
|
44
|
-
response = api.status args['REPO'], args['SHA'], opts
|
40
|
+
response = Status.update repo: args['REPO'],
|
41
|
+
sha: args['SHA'],
|
42
|
+
state: args['STATE'],
|
43
|
+
context: args['--context'],
|
44
|
+
description: args['--desc'],
|
45
|
+
url: args['--url']
|
45
46
|
|
46
47
|
show response
|
47
48
|
end
|
48
49
|
|
49
|
-
|
50
|
+
private
|
50
51
|
|
51
52
|
def client_opts
|
52
53
|
{
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
loadrunner
|
2
2
|
|
3
3
|
Usage:
|
4
4
|
loadrunner server [--port N --bind IP]
|
@@ -27,7 +27,7 @@ Parameters:
|
|
27
27
|
URL
|
28
28
|
The URL of the webhook endpoint. This path should responds
|
29
29
|
to POST requests. If you are sending an event to a loadrunner server,
|
30
|
-
send it to the
|
30
|
+
send it to the root endpoint (e.g. localhost:3000).
|
31
31
|
|
32
32
|
REPO
|
33
33
|
The name of the repository. This can be either the short name
|
@@ -50,7 +50,7 @@ Parameters:
|
|
50
50
|
Commit SHA string.
|
51
51
|
|
52
52
|
STATE
|
53
|
-
One of 'success', 'pending', 'error', 'failure'
|
53
|
+
One of 'success', 'pending', 'error', 'failure'.
|
54
54
|
|
55
55
|
Options:
|
56
56
|
--port N
|
@@ -80,13 +80,13 @@ Environment Variables:
|
|
80
80
|
|
81
81
|
Examples:
|
82
82
|
# Simulate push events
|
83
|
-
loadrunner event localhost:3000
|
84
|
-
loadrunner event localhost:3000
|
85
|
-
loadrunner event localhost:3000
|
86
|
-
loadrunner event localhost:3000
|
83
|
+
loadrunner event localhost:3000 myrepo push master
|
84
|
+
loadrunner event localhost:3000 myrepo push branch=master
|
85
|
+
loadrunner event localhost:3000 myrepo push tag=staging --form
|
86
|
+
loadrunner event localhost:3000 myrepo push refs/tags/staging
|
87
87
|
|
88
88
|
# Send a payload file
|
89
|
-
loadrunner payload localhost:3000
|
89
|
+
loadrunner payload localhost:3000 push payload.json
|
90
90
|
|
91
91
|
# Start the server
|
92
92
|
loadrunner server
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
|
3
|
-
module
|
3
|
+
module Loadrunner
|
4
4
|
# Communicate with GitHub
|
5
|
-
class
|
5
|
+
class GithubAPI
|
6
6
|
include HTTParty
|
7
7
|
|
8
8
|
base_uri 'https://api.github.com'
|
@@ -17,7 +17,7 @@ module LoadRunner
|
|
17
17
|
message = {
|
18
18
|
body: {
|
19
19
|
state: (opts[:state] ? opts[:state].to_s : 'pending'),
|
20
|
-
context: (opts[:context] || '
|
20
|
+
context: (opts[:context] || 'Loadrunner'),
|
21
21
|
description: opts[:description],
|
22
22
|
target_url: opts[:target_url]
|
23
23
|
}.to_json
|
@@ -25,7 +25,7 @@ module LoadRunner
|
|
25
25
|
self.class.post "/repos/#{repo}/statuses/#{sha}", message.merge(request_options)
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
private
|
29
29
|
|
30
30
|
def request_options
|
31
31
|
{
|
@@ -36,7 +36,7 @@ module LoadRunner
|
|
36
36
|
def headers
|
37
37
|
{
|
38
38
|
"Authorization" => "token #{secret_token}",
|
39
|
-
"User-Agent" => "
|
39
|
+
"User-Agent" => "Loadrunner"
|
40
40
|
}
|
41
41
|
end
|
42
42
|
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Loadrunner
|
2
|
+
|
3
|
+
# Executes event hooks
|
4
|
+
class Runner
|
5
|
+
attr_reader :opts
|
6
|
+
attr_accessor :response, :hooks_dir
|
7
|
+
|
8
|
+
def initialize(opts)
|
9
|
+
@hooks_dir = 'hooks'
|
10
|
+
@opts = opts
|
11
|
+
end
|
12
|
+
|
13
|
+
# Execute all matching hooks based on the input payload. This method
|
14
|
+
# populates the `#response` object, and returns true on success.
|
15
|
+
def execute
|
16
|
+
set_environment_vars
|
17
|
+
|
18
|
+
@response = opts.dup
|
19
|
+
hooks = locate_hooks
|
20
|
+
@response[:matching_hooks] = matching_hooks
|
21
|
+
|
22
|
+
if hooks.empty?
|
23
|
+
@response[:error] = "Could not find any hook to process this request. Please implement one of the 'matching_hooks'."
|
24
|
+
return false
|
25
|
+
else
|
26
|
+
execute_all hooks
|
27
|
+
@response[:executed_hooks] = hooks
|
28
|
+
return true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# Find all hooks that fit the payload meta data.
|
35
|
+
def locate_hooks
|
36
|
+
hooks = []
|
37
|
+
|
38
|
+
matching_hooks.each do |hook|
|
39
|
+
hooks << hook if File.exist? hook
|
40
|
+
end
|
41
|
+
|
42
|
+
hooks
|
43
|
+
end
|
44
|
+
|
45
|
+
# Execute all hooks.
|
46
|
+
def execute_all(hooks)
|
47
|
+
hooks.each do |hook|
|
48
|
+
run_bg hook
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Run a command in the background.
|
53
|
+
def run_bg(cmd)
|
54
|
+
job = fork { exec cmd }
|
55
|
+
Process.detach job
|
56
|
+
end
|
57
|
+
|
58
|
+
# Set all payload meta data as environment variables so that the
|
59
|
+
# hook can use them.
|
60
|
+
def set_environment_vars
|
61
|
+
opts.each { |key, value| ENV["LOADRUNNER_#{key.to_s.upcase}"] = value }
|
62
|
+
end
|
63
|
+
|
64
|
+
def matching_hooks
|
65
|
+
base = "#{hooks_dir}/#{opts[:repo]}/#{opts[:event]}"
|
66
|
+
hooks = [
|
67
|
+
"#{hooks_dir}/global",
|
68
|
+
"#{hooks_dir}/#{opts[:repo]}/global",
|
69
|
+
"#{base}"
|
70
|
+
]
|
71
|
+
|
72
|
+
hooks.tap do |h|
|
73
|
+
h << "#{base}@branch=#{opts[:branch]}" if opts[:branch]
|
74
|
+
h << "#{base}@tag=#{opts[:tag]}" if opts[:tag]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
@@ -1,4 +1,9 @@
|
|
1
|
-
|
1
|
+
require 'loadrunner/server_helper'
|
2
|
+
require 'loadrunner/server_base'
|
3
|
+
require 'loadrunner/signature_helper'
|
4
|
+
require 'loadrunner/runner'
|
5
|
+
|
6
|
+
module Loadrunner
|
2
7
|
|
3
8
|
# The Sinatra server
|
4
9
|
class Server < ServerBase
|
@@ -6,10 +11,10 @@ module LoadRunner
|
|
6
11
|
include SignatureHelper
|
7
12
|
|
8
13
|
get '/' do
|
9
|
-
"
|
14
|
+
"loadrunner ready"
|
10
15
|
end
|
11
16
|
|
12
|
-
post '/
|
17
|
+
post '/' do
|
13
18
|
request.body.rewind
|
14
19
|
payload_body = request.body.read
|
15
20
|
|
@@ -23,15 +28,17 @@ module LoadRunner
|
|
23
28
|
else
|
24
29
|
json_string = URI.decode_www_form(payload_body).to_h["payload"]
|
25
30
|
end
|
26
|
-
payload =
|
31
|
+
payload = JSON.parse json_string
|
27
32
|
|
28
33
|
opts = {}
|
29
|
-
opts[:repo] = payload.dig(
|
34
|
+
opts[:repo] = payload.dig('repository', 'name')
|
35
|
+
opts[:commit] = payload['after']
|
30
36
|
opts[:event] = request.env['HTTP_X_GITHUB_EVENT']
|
31
|
-
opts[:ref] = payload[
|
32
|
-
opts[:branch] = payload[
|
33
|
-
opts[:tag] = payload[
|
34
|
-
|
37
|
+
opts[:ref] = payload['ref']
|
38
|
+
opts[:branch] = payload['ref'] =~ /refs\/heads/ ? payload['ref'].sub('refs/heads/', '') : nil
|
39
|
+
opts[:tag] = payload['ref'] =~ /refs\/tags/ ? payload['ref'].sub('refs/tags/', '') : nil
|
40
|
+
|
41
|
+
File.write "last_payload.json", json_string if ENV['DEBUG']
|
35
42
|
|
36
43
|
runner = Runner.new opts
|
37
44
|
success = runner.execute
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'sinatra/base'
|
2
2
|
require "sinatra/reloader"
|
3
3
|
require "sinatra/json"
|
4
|
-
require 'active_support/core_ext/hash/indifferent_access'
|
5
4
|
|
6
|
-
module
|
5
|
+
module Loadrunner
|
7
6
|
|
8
7
|
# The base class for the sinatra server.
|
9
8
|
# Initialize what we can here, but since there are values that will
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'loadrunner/github_api'
|
2
|
+
|
3
|
+
module Loadrunner
|
4
|
+
# Update GitHub pull request status
|
5
|
+
class Status
|
6
|
+
class << self
|
7
|
+
def update(repo:, sha:, state:, context: nil, description: nil, url: nil)
|
8
|
+
api = GithubAPI.new
|
9
|
+
|
10
|
+
opts = {
|
11
|
+
state: state,
|
12
|
+
target_url: url,
|
13
|
+
context: context,
|
14
|
+
description: description
|
15
|
+
}
|
16
|
+
|
17
|
+
api.status repo, sha, opts
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loadrunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: super_docopt
|
@@ -72,42 +72,28 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3
|
75
|
+
version: '4.3'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: activesupport
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '5.1'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '5.1'
|
82
|
+
version: '4.3'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: colsole
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
87
|
- - "~>"
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
89
|
+
version: '0.6'
|
104
90
|
type: :runtime
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
94
|
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
96
|
+
version: '0.6'
|
111
97
|
description: Run your GitHub webhook server and Send simulated github events
|
112
98
|
email: db@dannyben.com
|
113
99
|
executables:
|
@@ -117,17 +103,18 @@ extra_rdoc_files: []
|
|
117
103
|
files:
|
118
104
|
- README.md
|
119
105
|
- bin/loadrunner
|
120
|
-
- lib/load_runner/client.rb
|
121
|
-
- lib/load_runner/command_line.rb
|
122
|
-
- lib/load_runner/docopt.txt
|
123
|
-
- lib/load_runner/git_hub_api.rb
|
124
|
-
- lib/load_runner/runner.rb
|
125
|
-
- lib/load_runner/server.rb
|
126
|
-
- lib/load_runner/server_base.rb
|
127
|
-
- lib/load_runner/server_helper.rb
|
128
|
-
- lib/load_runner/signature_helper.rb
|
129
|
-
- lib/load_runner/version.rb
|
130
106
|
- lib/loadrunner.rb
|
107
|
+
- lib/loadrunner/client.rb
|
108
|
+
- lib/loadrunner/command_line.rb
|
109
|
+
- lib/loadrunner/docopt.txt
|
110
|
+
- lib/loadrunner/github_api.rb
|
111
|
+
- lib/loadrunner/runner.rb
|
112
|
+
- lib/loadrunner/server.rb
|
113
|
+
- lib/loadrunner/server_base.rb
|
114
|
+
- lib/loadrunner/server_helper.rb
|
115
|
+
- lib/loadrunner/signature_helper.rb
|
116
|
+
- lib/loadrunner/status.rb
|
117
|
+
- lib/loadrunner/version.rb
|
131
118
|
homepage: https://github.com/DannyBen/loadrunner
|
132
119
|
licenses:
|
133
120
|
- MIT
|
data/lib/load_runner/runner.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
module LoadRunner
|
2
|
-
|
3
|
-
# Executes event handlers
|
4
|
-
class Runner
|
5
|
-
attr_reader :opts
|
6
|
-
attr_accessor :response, :handlers_dir
|
7
|
-
|
8
|
-
def initialize(opts)
|
9
|
-
@handlers_dir = 'handlers'
|
10
|
-
@opts = opts
|
11
|
-
end
|
12
|
-
|
13
|
-
# Execute all matching handlers based on the input payload. This method
|
14
|
-
# populates the `#response` object, and returns true on success.
|
15
|
-
def execute
|
16
|
-
set_environment_vars
|
17
|
-
|
18
|
-
@response = opts.dup
|
19
|
-
handlers = locate_handlers
|
20
|
-
@response[:matching_handlers] = matching_handlers
|
21
|
-
|
22
|
-
if handlers.empty?
|
23
|
-
@response[:error] = "Could not find any handler to process this webhook. Please implement one of the 'matching_handlers'."
|
24
|
-
return false
|
25
|
-
else
|
26
|
-
execute_all handlers
|
27
|
-
@response[:executed_handlers] = handlers
|
28
|
-
return true
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
# Find all handlers that fit the payload meta data.
|
35
|
-
def locate_handlers
|
36
|
-
handlers = []
|
37
|
-
|
38
|
-
matching_handlers.each do |handler|
|
39
|
-
handlers << handler if File.exist? handler
|
40
|
-
end
|
41
|
-
|
42
|
-
handlers
|
43
|
-
end
|
44
|
-
|
45
|
-
# Execute all handlers.
|
46
|
-
def execute_all(handlers)
|
47
|
-
handlers.each do |handler|
|
48
|
-
run_bg handler
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# Run a command in the background.
|
53
|
-
def run_bg(cmd)
|
54
|
-
job = fork { exec cmd }
|
55
|
-
Process.detach job
|
56
|
-
end
|
57
|
-
|
58
|
-
# Set all payload meta data as environment variables so that the
|
59
|
-
# handler can use them.
|
60
|
-
def set_environment_vars
|
61
|
-
opts.each { |key, value| ENV["LOADRUNNER_#{key.to_s.upcase}"] = value }
|
62
|
-
end
|
63
|
-
|
64
|
-
def matching_handlers
|
65
|
-
base = "#{handlers_dir}/#{opts[:repo]}/#{opts[:event]}"
|
66
|
-
handlers = [
|
67
|
-
"#{handlers_dir}/global",
|
68
|
-
"#{handlers_dir}/#{opts[:repo]}/global",
|
69
|
-
"#{base}"
|
70
|
-
]
|
71
|
-
|
72
|
-
handlers.tap do |h|
|
73
|
-
h << "#{base}@branch=#{opts[:branch]}" if opts[:branch]
|
74
|
-
h << "#{base}@tag=#{opts[:tag]}" if opts[:tag]
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
end
|
data/lib/load_runner/version.rb
DELETED