janky 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/CHANGES +3 -0
  2. data/COPYING +22 -0
  3. data/Gemfile +2 -0
  4. data/README.md +211 -0
  5. data/Rakefile +19 -0
  6. data/config.ru +3 -0
  7. data/janky.gemspec +102 -0
  8. data/lib/janky.rb +224 -0
  9. data/lib/janky/app.rb +81 -0
  10. data/lib/janky/branch.rb +112 -0
  11. data/lib/janky/build.rb +223 -0
  12. data/lib/janky/build_request.rb +49 -0
  13. data/lib/janky/builder.rb +108 -0
  14. data/lib/janky/builder/client.rb +82 -0
  15. data/lib/janky/builder/http.rb +43 -0
  16. data/lib/janky/builder/mock.rb +45 -0
  17. data/lib/janky/builder/payload.rb +63 -0
  18. data/lib/janky/builder/receiver.rb +20 -0
  19. data/lib/janky/builder/runner.rb +47 -0
  20. data/lib/janky/campfire.rb +127 -0
  21. data/lib/janky/campfire/mock.rb +0 -0
  22. data/lib/janky/commit.rb +14 -0
  23. data/lib/janky/database/migrate/1312115512_init.rb +48 -0
  24. data/lib/janky/database/migrate/1312117285_non_unique_repo_uri.rb +10 -0
  25. data/lib/janky/database/migrate/1312198807_repo_enabled.rb +11 -0
  26. data/lib/janky/database/migrate/1313867551_add_build_output_column.rb +9 -0
  27. data/lib/janky/database/migrate/1313871652_add_commit_url_column.rb +9 -0
  28. data/lib/janky/database/migrate/1317384618_add_repo_hook_url.rb +9 -0
  29. data/lib/janky/database/migrate/1317384619_add_build_room_id.rb +9 -0
  30. data/lib/janky/database/migrate/1317384629_drop_default_room_id.rb +9 -0
  31. data/lib/janky/database/migrate/1317384649_github_team_id.rb +9 -0
  32. data/lib/janky/database/schema.rb +68 -0
  33. data/lib/janky/database/seed.dump.gz +0 -0
  34. data/lib/janky/exception.rb +62 -0
  35. data/lib/janky/github.rb +67 -0
  36. data/lib/janky/github/api.rb +69 -0
  37. data/lib/janky/github/commit.rb +27 -0
  38. data/lib/janky/github/mock.rb +47 -0
  39. data/lib/janky/github/payload.rb +34 -0
  40. data/lib/janky/github/payload_parser.rb +57 -0
  41. data/lib/janky/github/receiver.rb +69 -0
  42. data/lib/janky/helpers.rb +17 -0
  43. data/lib/janky/hubot.rb +117 -0
  44. data/lib/janky/job_creator.rb +111 -0
  45. data/lib/janky/notifier.rb +84 -0
  46. data/lib/janky/notifier/campfire.rb +21 -0
  47. data/lib/janky/notifier/mock.rb +55 -0
  48. data/lib/janky/notifier/multi.rb +22 -0
  49. data/lib/janky/public/css/base.css +204 -0
  50. data/lib/janky/public/images/building-bot.gif +0 -0
  51. data/lib/janky/public/images/disclosure-arrow.png +0 -0
  52. data/lib/janky/public/images/logo.png +0 -0
  53. data/lib/janky/public/images/robawt-status.gif +0 -0
  54. data/lib/janky/public/javascripts/application.js +3 -0
  55. data/lib/janky/public/javascripts/jquery.js +16 -0
  56. data/lib/janky/public/javascripts/jquery.relatize.js +111 -0
  57. data/lib/janky/repository.rb +174 -0
  58. data/lib/janky/tasks.rb +36 -0
  59. data/lib/janky/templates/console.mustache +4 -0
  60. data/lib/janky/templates/index.mustache +11 -0
  61. data/lib/janky/templates/layout.mustache +22 -0
  62. data/lib/janky/version.rb +3 -0
  63. data/lib/janky/views/console.rb +33 -0
  64. data/lib/janky/views/index.rb +35 -0
  65. data/lib/janky/views/layout.rb +19 -0
  66. data/test/default.xml.erb +0 -0
  67. data/test/janky_test.rb +271 -0
  68. data/test/test_helper.rb +107 -0
  69. metadata +319 -0
data/CHANGES ADDED
@@ -0,0 +1,3 @@
1
+ = 0.9 / 2011-12-19
2
+
3
+ * Initial public release.
data/COPYING ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2011 GitHub, Inc. <https://github.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,211 @@
1
+ Janky
2
+ =====
3
+
4
+ This is Janky, a continuous integration server built on top of
5
+ [Jenkins][], controlled by [Hubot][], and designed for [GitHub][].
6
+
7
+ * **Built on top of Jenkins.** The power, vast amount of plugins and large
8
+ communauty of the popular CI server all wrapped up in a great experience.
9
+
10
+ * **Controlled by Hubot.** Day to day operations are exposed as simple
11
+ Hubot commands that the whole team can use.
12
+
13
+ * **Designed for GitHub.** Janky creates the appropriate [web hooks][w] for
14
+ you and the web app restricts access to members of your GitHub organization.
15
+
16
+ [GitHub]: https://github.com
17
+ [Hubot]: http://hubot.github.com
18
+ [Jenkins]: http://jenkins-ci.org
19
+ [w]: http://developer.github.com/v3/repos/hooks/
20
+
21
+ Hubot Usage
22
+ -----------
23
+
24
+ Start by setting up a new Jenkins job and GitHub web hook for a
25
+ repository:
26
+
27
+ hubot ci setup github/janky
28
+
29
+ The `setup` command can safely be run over and over again. It won't do
30
+ anything unless it needs to. It takes an optional name argument:
31
+
32
+ hubot ci setup github/janky janky-ruby1.9.2
33
+
34
+ All branches are built automatically on push. Disable auto build with:
35
+
36
+ hubot ci toggle janky
37
+
38
+ Run the command again to re-enable it. Force a build of the master
39
+ branch:
40
+
41
+ hubot ci build janky
42
+
43
+ Of a specific branch:
44
+
45
+ hubot ci build janky/libgit2
46
+
47
+ Different builds aren't relevant to the same Campfire room and so Janky
48
+ lets you choose where notifications are sent to. First get a list of
49
+ available rooms:
50
+
51
+ hubot ci rooms
52
+
53
+ Then pick one:
54
+
55
+ hubot ci set janky room The Serious Room
56
+
57
+ Get the status of a build:
58
+
59
+ hubot ci status janky
60
+
61
+ Specific branch:
62
+
63
+ hubot ci status janky/libgit2
64
+
65
+ All builds:
66
+
67
+ hubot ci status
68
+
69
+ Finally, get a quick reference of the available commands with:
70
+
71
+ hubot ci?
72
+
73
+ Installing
74
+ ----------
75
+
76
+ ### Jenkins
77
+
78
+ Janky requires access to a Jenkins server. Version **1.427** is
79
+ recommended. Refer to the Jenkins [documentation][doc] for installation
80
+ instructions and install the [Notification Plugin][np] version 1.4.
81
+
82
+ [doc]: https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins
83
+ [np]: https://wiki.jenkins-ci.org/display/JENKINS/Notification+Plugin
84
+
85
+ ### Deploying
86
+
87
+ Janky is designed to be deployed to [Heroku](https://heroku.com).
88
+
89
+ Grab all the necessary files from [this gist][gist]:
90
+
91
+ $ git clone gist://gist.github.com/123 janky
92
+
93
+ Then push up it to a new Heroku app:
94
+
95
+ $ cd janky
96
+ $ heroku create --stack cedar
97
+ $ git push heroku master
98
+
99
+ After configuration the app (see below), create the database:
100
+
101
+ $ heroku run rake db:migrate
102
+
103
+ [gist]: https://gist.github.com/gist/1234
104
+
105
+ ### Configuring
106
+
107
+ Janky is configured using environment variables. Use the `heroku config`
108
+ command:
109
+
110
+ $ heroku config:add VARIABLE=value
111
+
112
+ Required settings:
113
+
114
+ * `JANKY_BASE_URL`: The application URL with a trailing slash. Example:
115
+ `http://mf-doom-42.heroku.com/`.
116
+ * `JANKY_BUILDER_DEFAULT`: The Jenkins server URL with a trailing slash.
117
+ Example: `http://jenkins.example.com/`.
118
+ * `JANKY_CONFIG_DIR`: Directory where build config templates are stored.
119
+ Typically set to `/app/config` on Heroku.
120
+ * `JANKY_HUBOT_USER`: Login used to protect the Hubot API.
121
+ * `JANKY_HUBOT_PASSWORD`: Password for the Hubot API.
122
+ * `JANKY_GITHUB_USER`: The login of the GitHub user used to access the
123
+ API. Requires Push and Pull privileges.
124
+ * `JANKY_GITHUB_PASSWORD`: The password for the GitHub user.
125
+ * `JANKY_GITHUB_HOOK_SECRET`: Secret used to sign hook requests from
126
+ GitHub.
127
+ * `JANKY_CAMPFIRE_ACCOUNT`: The name of your Campfire account.
128
+ * `JANKY_CAMPFIRE_TOKEN`: The authentication token of the user sending
129
+ build notifications.
130
+ * `JANKY_CAMPFIRE_DEFAULT_ROOM`: The name of the room where notifications
131
+ are sent by default. Example: "Builds".
132
+
133
+ To restrict access to members of a GitHub organization, [register a new
134
+ OAuth application on GitHub](https://github.com/account/applications)
135
+ with the callback set to `$JANKY_BASE_URL/auth/github/callback` then set
136
+ a few extra settings:
137
+
138
+ * `JANKY_SESSION_SECRET`: Random session cookie secret. Typically
139
+ generated by a tool like `pgwen`.
140
+ * `JANKY_AUTH_CLIENT_ID`: The client ID of the OAuth application.
141
+ * `JANKY_AUTH_CLIENT_SECRET`: The client secret of the OAuth application.
142
+ * `JANKY_AUTH_ORGANIZATION`: The organization name. Example: "github".
143
+
144
+ ### Hubot
145
+
146
+ Install the [ci script](http://git.io/hubot-ci-master) in your Hubot
147
+ then set the `HUBOT_JANKY_URL` environment variable. Example:
148
+ `http://user:secret@janky.example.com/_hubot/`, with user and password
149
+ replaced by `JANKY_HUBOT_USER` and `JANKY_HUBOT_PASSWORD` repectively.
150
+
151
+ ### Custom Build Configuration
152
+
153
+ The default build command should suffice for most Ruby applications:
154
+
155
+ $ bundle install --path vendor/gems --binstubs
156
+ $ bundle exec rake
157
+
158
+ For more control you can add a `script/cibuild` at the root of your
159
+ repository for Jenkins to execute instead.
160
+
161
+ For total control, whole Jenkins' `config.xml` files can be associated
162
+ with Janky builds. Given a build called `windows`, Janky will try
163
+ `config/jobs/windows.xml.erb` before falling back to the default
164
+ configuration, `config/jobs/default.xml.erb`. After updating or adding
165
+ a custom config, run `hubot ci setup` again to update the Jenkins
166
+ server.
167
+
168
+ Hacking
169
+ -------
170
+
171
+ Create the databases:
172
+
173
+ $ mysqladmin -uroot create janky_development
174
+ $ mysqladmin -uroot create janky_test
175
+
176
+ Create the tables:
177
+
178
+ $ RACK_ENV=development bin/rake db:migrate
179
+ $ RACK_ENV=test bin/rake db:migrate
180
+
181
+ Get your environment up and running:
182
+
183
+ $ script/boostrap
184
+
185
+ Seed some data into the development database:
186
+
187
+ $ bin/rake db:seed
188
+
189
+ Start the server:
190
+
191
+ $ script/server
192
+
193
+ Open the app:
194
+
195
+ $ open http://localhost:9393/
196
+
197
+ Run the test suite:
198
+
199
+ $ ruby test/janky_spec.rb
200
+
201
+ Contributing
202
+ ------------
203
+
204
+ Fork the [Janky repository on GitHub](https://github.com/github/janky) and
205
+ send a Pull Request.
206
+
207
+ Copying
208
+ -------
209
+
210
+ Copyright © 2011, GitHub, Inc. See the `COPYING` file for license
211
+ rights and limitations (MIT).
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
2
+ ENV["RACK_ENV"] ||= "development"
3
+
4
+ require "janky"
5
+ Janky.setup(ENV)
6
+ require "janky/tasks"
7
+
8
+ task "db:seed" do
9
+ if ENV["RACK_ENV"] != "development"
10
+ fail "refusing to load seed data into non-development database"
11
+ end
12
+
13
+ dump = File.expand_path("../lib/janky/database/seed.dump.gz", __FILE__)
14
+
15
+ Replicate::Loader.new do |loader|
16
+ loader.log_to $stderr, false, false
17
+ loader.read Zlib::GzipReader.open(dump)
18
+ end
19
+ end
data/config.ru ADDED
@@ -0,0 +1,3 @@
1
+ require "janky"
2
+ Janky.setup(ENV)
3
+ run Janky.app
data/janky.gemspec ADDED
@@ -0,0 +1,102 @@
1
+ require File.expand_path("../lib/janky/version", __FILE__)
2
+
3
+ Gem::Specification.new "janky", Janky::VERSION do |s|
4
+ s.description = "Janky is a Continuous Integration server"
5
+ s.summary = "Continuous Integration server built on top of Jenkins and " \
6
+ "designed for GitHub and Hubot"
7
+ s.authors = ["GitHub, Inc."]
8
+ s.homepage = "https://github.com/github/janky"
9
+ s.has_rdoc = false
10
+
11
+ # runtime
12
+ s.add_dependency "rake", "~>0.9.2"
13
+ s.add_dependency "sinatra", "~>1.3"
14
+ s.add_dependency "sinatra_auth_github", "~>0.1.5"
15
+ s.add_dependency "mustache", "~>0.11"
16
+ s.add_dependency "yajl-ruby", "~>0.8"
17
+ s.add_dependency "activerecord", "~>3.1.0"
18
+ s.add_dependency "broach", "~>0.2"
19
+ s.add_dependency "replicate", "~>1.4"
20
+
21
+ # development
22
+ s.add_development_dependency "shotgun", "~>0.9"
23
+ s.add_development_dependency "thin", "~>1.2"
24
+ s.add_development_dependency "mysql2", "~>0.3.0"
25
+
26
+ # test
27
+ s.add_development_dependency "database_cleaner", "~>0.6"
28
+
29
+ s.files = %w[
30
+ CHANGES
31
+ COPYING
32
+ Gemfile
33
+ README.md
34
+ Rakefile
35
+ config.ru
36
+ janky.gemspec
37
+ lib/janky.rb
38
+ lib/janky/app.rb
39
+ lib/janky/branch.rb
40
+ lib/janky/build.rb
41
+ lib/janky/build_request.rb
42
+ lib/janky/builder.rb
43
+ lib/janky/builder/client.rb
44
+ lib/janky/builder/http.rb
45
+ lib/janky/builder/mock.rb
46
+ lib/janky/builder/payload.rb
47
+ lib/janky/builder/receiver.rb
48
+ lib/janky/builder/runner.rb
49
+ lib/janky/campfire.rb
50
+ lib/janky/campfire/mock.rb
51
+ lib/janky/commit.rb
52
+ lib/janky/database/migrate/1312115512_init.rb
53
+ lib/janky/database/migrate/1312117285_non_unique_repo_uri.rb
54
+ lib/janky/database/migrate/1312198807_repo_enabled.rb
55
+ lib/janky/database/migrate/1313867551_add_build_output_column.rb
56
+ lib/janky/database/migrate/1313871652_add_commit_url_column.rb
57
+ lib/janky/database/migrate/1317384618_add_repo_hook_url.rb
58
+ lib/janky/database/migrate/1317384619_add_build_room_id.rb
59
+ lib/janky/database/migrate/1317384629_drop_default_room_id.rb
60
+ lib/janky/database/migrate/1317384649_github_team_id.rb
61
+ lib/janky/database/schema.rb
62
+ lib/janky/database/seed.dump.gz
63
+ lib/janky/exception.rb
64
+ lib/janky/github.rb
65
+ lib/janky/github/api.rb
66
+ lib/janky/github/commit.rb
67
+ lib/janky/github/mock.rb
68
+ lib/janky/github/payload.rb
69
+ lib/janky/github/payload_parser.rb
70
+ lib/janky/github/receiver.rb
71
+ lib/janky/helpers.rb
72
+ lib/janky/hubot.rb
73
+ lib/janky/job_creator.rb
74
+ lib/janky/notifier.rb
75
+ lib/janky/notifier/campfire.rb
76
+ lib/janky/notifier/mock.rb
77
+ lib/janky/notifier/multi.rb
78
+ lib/janky/public/css/base.css
79
+ lib/janky/public/images/building-bot.gif
80
+ lib/janky/public/images/disclosure-arrow.png
81
+ lib/janky/public/images/logo.png
82
+ lib/janky/public/images/robawt-status.gif
83
+ lib/janky/public/javascripts/application.js
84
+ lib/janky/public/javascripts/jquery.js
85
+ lib/janky/public/javascripts/jquery.relatize.js
86
+ lib/janky/repository.rb
87
+ lib/janky/tasks.rb
88
+ lib/janky/templates/console.mustache
89
+ lib/janky/templates/index.mustache
90
+ lib/janky/templates/layout.mustache
91
+ lib/janky/version.rb
92
+ lib/janky/views/console.rb
93
+ lib/janky/views/index.rb
94
+ lib/janky/views/layout.rb
95
+ ]
96
+
97
+ s.test_files = %w[
98
+ test/default.xml.erb
99
+ test/janky_test.rb
100
+ test/test_helper.rb
101
+ ]
102
+ end
data/lib/janky.rb ADDED
@@ -0,0 +1,224 @@
1
+ require "net/http"
2
+ require "digest/md5"
3
+
4
+ require "active_record"
5
+ require "replicate"
6
+ require "sinatra/base"
7
+ require "mustache/sinatra"
8
+ require "yajl"
9
+ require "yajl/json_gem"
10
+ require "tilt"
11
+ require "broach"
12
+ require "sinatra/auth/github"
13
+
14
+ require "janky/repository"
15
+ require "janky/branch"
16
+ require "janky/commit"
17
+ require "janky/build"
18
+ require "janky/build_request"
19
+ require "janky/github"
20
+ require "janky/github/api"
21
+ require "janky/github/mock"
22
+ require "janky/github/payload"
23
+ require "janky/github/commit"
24
+ require "janky/github/payload_parser"
25
+ require "janky/github/receiver"
26
+ require "janky/job_creator"
27
+ require "janky/helpers"
28
+ require "janky/hubot"
29
+ require "janky/builder"
30
+ require "janky/builder/client"
31
+ require "janky/builder/runner"
32
+ require "janky/builder/http"
33
+ require "janky/builder/mock"
34
+ require "janky/builder/payload"
35
+ require "janky/builder/receiver"
36
+ require "janky/campfire"
37
+ require "janky/exception"
38
+ require "janky/notifier"
39
+ require "janky/notifier/mock"
40
+ require "janky/notifier/multi"
41
+ require "janky/notifier/campfire"
42
+ require "janky/app"
43
+ require "janky/views/layout"
44
+ require "janky/views/index"
45
+ require "janky/views/console"
46
+
47
+ # This is Janky, a continuous integration server. Checkout the 'app'
48
+ # method on this module for an overview of the different components
49
+ # involved.
50
+ module Janky
51
+ # The base exception class raised when errors are encountered.
52
+ class Error < StandardError; end
53
+
54
+ # Setup the application, including the database and Jenkins connections.
55
+ #
56
+ # settings - Hash of app settings. Typically ENV but any object responding
57
+ # to #[] is valid. See required_settings for required keys.
58
+ # The RACK_ENV setting is always required.
59
+ #
60
+ # Raises an Error when required settings are missing.
61
+ # Returns nothing.
62
+ def self.setup(settings)
63
+ env = settings["RACK_ENV"]
64
+ if env.nil? || env.empty?
65
+ raise Error, "RACK_ENV is required"
66
+ end
67
+
68
+ required_settings.each do |setting|
69
+ next if !settings[setting].nil? && !settings[setting].empty?
70
+
71
+ if env == "production"
72
+ raise Error, "#{setting} setting is required"
73
+ end
74
+ end
75
+
76
+ if env != "production"
77
+ settings["DATABASE_URL"] ||= "mysql2://root@localhost/janky_#{env}"
78
+ settings["JANKY_BASE_URL"] ||= "http://localhost:9393"
79
+ settings["JANKY_BUILDER_DEFAULT"] ||= "http://localhost:8080/"
80
+ settings["JANKY_CONFIG_DIR"] ||= File.dirname(__FILE__)
81
+ end
82
+
83
+ database = URI(settings["DATABASE_URL"])
84
+ adapter = database.scheme == "postgres" ? "postgresql" : database.scheme
85
+ base_url = URI(settings["JANKY_BASE_URL"]).to_s
86
+
87
+ ActiveRecord::Base.establish_connection(
88
+ :adapter => adapter,
89
+ :host => database.host,
90
+ :database => database.path[1..-1],
91
+ :username => database.user,
92
+ :password => database.password,
93
+ :reconnect => true
94
+ )
95
+
96
+ self.jobs_config_dir = config_dir = Pathname(settings["JANKY_CONFIG_DIR"])
97
+ if !config_dir.directory?
98
+ raise Error, "#{config_dir} is not a directory"
99
+ end
100
+
101
+ # Setup the callback URL of this Janky host.
102
+ Janky::Builder.setup(base_url + "/_builder")
103
+
104
+ # Setup the default Jenkins build host
105
+ Janky::Builder[:default] = settings["JANKY_BUILDER_DEFAULT"]
106
+
107
+ Janky::GitHub.setup(
108
+ settings["JANKY_GITHUB_USER"],
109
+ settings["JANKY_GITHUB_PASSWORD"],
110
+ settings["JANKY_GITHUB_HOOK_SECRET"],
111
+ base_url + "/_github"
112
+ )
113
+
114
+ if settings.key?("JANKY_SESSION_SECRET")
115
+ Janky::App.register Sinatra::Auth::Github
116
+ Janky::App.set({
117
+ :sessions => true,
118
+ :session_secret => settings["JANKY_SESSION_SECRET"],
119
+ :github_team_id => settings["JANKY_AUTH_TEAM_ID"],
120
+ :github_organization => settings["JANKY_AUTH_ORGANIZATION"],
121
+ :github_options => {
122
+ :secret => settings["JANKY_AUTH_CLIENT_SECRET"],
123
+ :client_id => settings["JANKY_AUTH_CLIENT_ID"],
124
+ :scopes => "repo",
125
+ },
126
+ })
127
+ end
128
+
129
+ Janky::Hubot.set(
130
+ :base_url => settings["JANKY_BASE_URL"],
131
+ :username => settings["JANKY_HUBOT_USER"],
132
+ :password => settings["JANKY_HUBOT_PASSWORD"]
133
+ )
134
+
135
+ Janky::Campfire.setup(
136
+ settings["JANKY_CAMPFIRE_ACCOUNT"],
137
+ settings["JANKY_CAMPFIRE_TOKEN"],
138
+ settings["JANKY_CAMPFIRE_DEFAULT_ROOM"]
139
+ )
140
+
141
+ Janky::Exception.setup(Janky::Exception::Mock)
142
+
143
+ Notifier.setup(Notifier::Campfire)
144
+ end
145
+
146
+ # List of settings required in production.
147
+ #
148
+ # Returns an Array of Strings.
149
+ def self.required_settings
150
+ %w[RACK_ENV DATABASE_URL
151
+ JANKY_BASE_URL
152
+ JANKY_BUILDER_DEFAULT
153
+ JANKY_CONFIG_DIR
154
+ JANKY_GITHUB_USER JANKY_GITHUB_PASSWORD JANKY_GITHUB_HOOK_SECRET
155
+ JANKY_HUBOT_USER JANKY_HUBOT_PASSWORD
156
+ JANKY_CAMPFIRE_ACCOUNT JANKY_CAMPFIRE_TOKEN JANKY_CAMPFIRE_DEFAULT_ROOM]
157
+ end
158
+
159
+ # Directory where Jenkins job configuration templates are located.
160
+ #
161
+ # Returns the directory as a Pathname.
162
+ class << self
163
+ attr_accessor :jobs_config_dir
164
+ end
165
+
166
+ # Mock out all network-dependant components. Must be called after setup.
167
+ # Typically used in test environments.
168
+ #
169
+ # Returns nothing.
170
+ def self.enable_mock!
171
+ Janky::Builder.enable_mock!
172
+ Janky::GitHub.enable_mock!
173
+ Janky::Notifier.enable_mock!
174
+ Janky::Campfire.enable_mock!
175
+ Janky::App.disable :github_team_id
176
+ end
177
+
178
+ # Reset the state of the mocks.
179
+ #
180
+ # Returns nothing.
181
+ def self.reset!
182
+ Janky::Notifier.reset!
183
+ Janky::Builder.reset!
184
+ end
185
+
186
+ # The Janky Rack application, assembled from four apps. Exceptions
187
+ # raised during the request cycle are caught by the Exception
188
+ # middleware which typically report exceptions to an external
189
+ # service before re-raising the exception.
190
+ #
191
+ # Returns a memoized Rack application.
192
+ def self.app
193
+ @app ||= Rack::Builder.app {
194
+ # Exception reporting middleware.
195
+ use Janky::Exception::Middleware
196
+
197
+ # GitHub Post-Receive requests.
198
+ map "/_github" do
199
+ run Janky::GitHub.receiver
200
+ end
201
+
202
+ # Jenkins callback requests.
203
+ map "/_builder" do
204
+ run Janky::Builder.receiver
205
+ end
206
+
207
+ # Hubot API, protected by Basic Auth.
208
+ map "/_hubot" do
209
+ use Rack::Auth::Basic do |username, password|
210
+ username == Janky::Hubot.username &&
211
+ password == Janky::Hubot.password
212
+ end
213
+
214
+ run Janky::Hubot
215
+ end
216
+
217
+ # Web dashboard
218
+ map "/" do
219
+ use Janky::NoAuth
220
+ run Janky::App
221
+ end
222
+ }
223
+ end
224
+ end