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
File without changes
@@ -0,0 +1,14 @@
1
+ module Janky
2
+ class Commit < ActiveRecord::Base
3
+ belongs_to :repository
4
+ has_many :builds
5
+
6
+ def last_build
7
+ builds.last
8
+ end
9
+
10
+ def short_sha
11
+ sha1[0..7]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,48 @@
1
+ class Init < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :repositories, :force => true do |t|
4
+ t.string :name, :null => false
5
+ t.string :uri, :null => false
6
+ t.integer :room_id, :default => 376289, :null => false # Builds room
7
+ t.timestamps
8
+ end
9
+ add_index :repositories, :name, :unique => true
10
+ add_index :repositories, :uri, :unique => true
11
+
12
+ create_table :branches, :force => true do |t|
13
+ t.string :name, :null => false
14
+ t.belongs_to :repository, :null => false
15
+ t.timestamps
16
+ end
17
+ add_index :branches, [:name, :repository_id], :unique => true
18
+
19
+ create_table :commits, :force => true do |t|
20
+ t.string :sha1, :null => false
21
+ t.string :message, :null => false
22
+ t.string :author, :null => false
23
+ t.datetime :committed_at
24
+ t.belongs_to :repository, :null => false
25
+ t.timestamps
26
+ end
27
+ add_index :commits, [:sha1, :repository_id], :unique => true
28
+
29
+ create_table :builds, :force => true do |t|
30
+ t.boolean :green, :default => false
31
+ t.string :url, :null => true
32
+ t.string :compare, :null => false
33
+ t.datetime :started_at
34
+ t.datetime :completed_at
35
+ t.belongs_to :commit, :null => false
36
+ t.belongs_to :branch, :null => false
37
+ t.timestamps
38
+ end
39
+ add_index :builds, :url, :unique => true
40
+ end
41
+
42
+ def self.down
43
+ drop_table :repositories
44
+ drop_table :branches
45
+ drop_table :commits
46
+ drop_table :builds
47
+ end
48
+ end
@@ -0,0 +1,10 @@
1
+ class NonUniqueRepoUri < ActiveRecord::Migration
2
+ def self.up
3
+ remove_index :repositories, :uri
4
+ add_index :repositories, :uri
5
+ end
6
+
7
+ def self.down
8
+ add_index :repositories, :uri, :unique => true
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class RepoEnabled < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :repositories, :enabled, :boolean, :null => false, :default => true
4
+ add_index :repositories, :enabled
5
+ end
6
+
7
+ def self.down
8
+ remove_column :repositories, :enabled
9
+ remove_index :repositories, :enabled
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ class AddBuildOutputColumn < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :builds, :output, :text, :null => true, :default => nil
4
+ end
5
+
6
+ def self.down
7
+ remove_column :builds, :output
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class AddCommitUrlColumn < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :commits, :url, :string, :null => false
4
+ end
5
+
6
+ def self.down
7
+ remove_column :commits, :url
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class AddRepoHookUrl < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :repositories, :hook_url, :string, :null => true
4
+ end
5
+
6
+ def self.down
7
+ remove_column :repositories, :hook_url
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class AddBuildRoomId < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :builds, :room_id, :integer, :null => true
4
+ end
5
+
6
+ def self.down
7
+ remove_column :builds, :room_id
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class DropDefaultRoomId < ActiveRecord::Migration
2
+ def self.up
3
+ change_column :repositories, :room_id, :integer, :default => nil, :null => true
4
+ end
5
+
6
+ def self.down
7
+ change_column :repositories, :room_id, :integer, :default => 376289, :null => false
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class GithubTeamId < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :repositories, :github_team_id, :integer, :null => true
4
+ end
5
+
6
+ def self.down
7
+ remove_column :repositories, :github_team_id
8
+ end
9
+ end
@@ -0,0 +1,68 @@
1
+ # This file is auto-generated from the current state of the database. Instead
2
+ # of editing this file, please use the migrations feature of Active Record to
3
+ # incrementally modify your database, and then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your
6
+ # database schema. If you need to create the application database on another
7
+ # system, you should be using db:schema:load, not running all the migrations
8
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
9
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
10
+ #
11
+ # It's strongly recommended to check this file into your version control system.
12
+
13
+ ActiveRecord::Schema.define(:version => 1317384649) do
14
+
15
+ create_table "branches", :force => true do |t|
16
+ t.string "name", :null => false
17
+ t.integer "repository_id", :null => false
18
+ t.datetime "created_at"
19
+ t.datetime "updated_at"
20
+ end
21
+
22
+ add_index "branches", ["name", "repository_id"], :name => "index_branches_on_name_and_repository_id", :unique => true
23
+
24
+ create_table "builds", :force => true do |t|
25
+ t.boolean "green", :default => false
26
+ t.string "url"
27
+ t.string "compare", :null => false
28
+ t.datetime "started_at"
29
+ t.datetime "completed_at"
30
+ t.integer "commit_id", :null => false
31
+ t.integer "branch_id", :null => false
32
+ t.datetime "created_at"
33
+ t.datetime "updated_at"
34
+ t.text "output", :limit => 2147483647
35
+ t.integer "room_id"
36
+ end
37
+
38
+ add_index "builds", ["url"], :name => "index_builds_on_url", :unique => true
39
+
40
+ create_table "commits", :force => true do |t|
41
+ t.string "sha1", :null => false
42
+ t.string "message", :null => false
43
+ t.string "author", :null => false
44
+ t.datetime "committed_at"
45
+ t.integer "repository_id", :null => false
46
+ t.datetime "created_at"
47
+ t.datetime "updated_at"
48
+ t.string "url", :null => false
49
+ end
50
+
51
+ add_index "commits", ["sha1", "repository_id"], :name => "index_commits_on_sha1_and_repository_id", :unique => true
52
+
53
+ create_table "repositories", :force => true do |t|
54
+ t.string "name", :null => false
55
+ t.string "uri", :null => false
56
+ t.integer "room_id"
57
+ t.datetime "created_at"
58
+ t.datetime "updated_at"
59
+ t.boolean "enabled", :default => true, :null => false
60
+ t.string "hook_url"
61
+ t.integer "github_team_id"
62
+ end
63
+
64
+ add_index "repositories", ["enabled"], :name => "index_repositories_on_enabled"
65
+ add_index "repositories", ["name"], :name => "index_repositories_on_name", :unique => true
66
+ add_index "repositories", ["uri"], :name => "index_repositories_on_uri"
67
+
68
+ end
Binary file
@@ -0,0 +1,62 @@
1
+ module Janky
2
+ module Exception
3
+ def self.setup(notifier)
4
+ @notifier = notifier
5
+ end
6
+
7
+ def self.report(exception, context={})
8
+ @notifier.report(exception, context)
9
+ end
10
+
11
+ def self.push(context)
12
+ @notifier.push(context)
13
+ end
14
+
15
+ def self.reset!
16
+ @notifier.reset!
17
+ end
18
+
19
+ def self.push_http_response(response)
20
+ push(
21
+ :response_code => response.code.inspect,
22
+ :response_body => response.body.inspect
23
+ )
24
+ end
25
+
26
+ class Middleware
27
+ def initialize(app)
28
+ @app = app
29
+ end
30
+
31
+ def call(env)
32
+ request = Rack::Request.new(env)
33
+ Exception.reset!
34
+ Exception.push(
35
+ :app => "janky",
36
+ :method => request.request_method,
37
+ :user_agent => request.user_agent,
38
+ :params => (request.params.inspect rescue nil),
39
+ :session => (request.session.inspect rescue nil),
40
+ :referrer => request.referrer,
41
+ :remote_ip => request.ip,
42
+ :url => request.url
43
+ )
44
+ @app.call(env)
45
+ rescue Object => boom
46
+ Exception.report(boom)
47
+ raise
48
+ end
49
+ end
50
+
51
+ class Mock
52
+ def self.push(context)
53
+ end
54
+
55
+ def self.report(e, context={})
56
+ end
57
+
58
+ def self.reset!
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,67 @@
1
+ module Janky
2
+ module GitHub
3
+ def self.setup(user, password, secret, url)
4
+ @user = user
5
+ @password = password
6
+ @secret = secret
7
+ @url = url
8
+ end
9
+
10
+ class << self
11
+ attr_reader :secret
12
+ end
13
+
14
+ def self.enable_mock!
15
+ @api = Mock.new(@user, @password)
16
+ end
17
+
18
+ def self.repo_make_private(nwo)
19
+ api.make_private(nwo)
20
+ end
21
+
22
+ def self.repo_make_public(nwo)
23
+ api.make_public(nwo)
24
+ end
25
+
26
+ def self.repo_make_unauthorized(nwo)
27
+ api.make_unauthorized(nwo)
28
+ end
29
+
30
+ def self.receiver
31
+ @receiver ||= Receiver.new(@secret)
32
+ end
33
+
34
+ def self.repo_get(nwo)
35
+ response = api.repo_get(nwo)
36
+
37
+ case response.code
38
+ when "200"
39
+ Yajl.load(response.body)
40
+ when "403", "404"
41
+ nil
42
+ else
43
+ Exception.push_http_response(response)
44
+ raise Error, "Failed to get hook"
45
+ end
46
+ end
47
+
48
+ def self.hook_create(nwo)
49
+ response = api.create(nwo, @secret, @url)
50
+
51
+ if response.code == "201"
52
+ Yajl.load(response.body)["url"]
53
+ else
54
+ Exception.push_http_response(response)
55
+ raise Error, "Failed to create hook"
56
+ end
57
+ end
58
+
59
+ def self.hook_exists?(url)
60
+ api.get(url).code == "200"
61
+ end
62
+
63
+ def self.api
64
+ @api ||= API.new(@user, @password)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,69 @@
1
+ module Janky
2
+ module GitHub
3
+ class API
4
+ def initialize(user, password)
5
+ @user = user
6
+ @password = password
7
+ end
8
+
9
+ def create(nwo, secret, url)
10
+ request = Net::HTTP::Post.new("/repos/#{nwo}/hooks")
11
+ payload = build_payload(url, secret)
12
+ request.body = Yajl.dump(payload)
13
+ request.basic_auth(@user, @password)
14
+
15
+ http.request(request)
16
+ end
17
+
18
+ def trigger(hook_url)
19
+ path = URI(hook_url).path
20
+ request = Net::HTTP::Post.new("#{path}/test")
21
+ request.basic_auth(@user, @password)
22
+
23
+ http.request(request)
24
+ end
25
+
26
+ def get(hook_url)
27
+ path = URI(hook_url).path
28
+ request = Net::HTTP::Get.new(path)
29
+ request.basic_auth(@user, @password)
30
+
31
+ http.request(request)
32
+ end
33
+
34
+ def repo_get(nwo)
35
+ path = "/repos/#{nwo}"
36
+ request = Net::HTTP::Get.new(path)
37
+ request.basic_auth(@user, @password)
38
+
39
+ http.request(request)
40
+ end
41
+
42
+ def build_payload(url, secret)
43
+ { "name" => "web",
44
+ "active" => true,
45
+ "config" => {
46
+ "url" => url,
47
+ "secret" => secret,
48
+ "content_type" => "json"
49
+ }
50
+ }
51
+ end
52
+
53
+ def http
54
+ @http ||= http!
55
+ end
56
+
57
+ def http!
58
+ uri = URI("https://api.github.com")
59
+ http = Net::HTTP.new(uri.host, uri.port)
60
+
61
+ http.use_ssl = true
62
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
63
+ http.ca_path = "/etc/ssl/certs"
64
+
65
+ http
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,27 @@
1
+ module Janky
2
+ module GitHub
3
+ class Commit
4
+ def initialize(sha1, url, message, author, time)
5
+ @sha1 = sha1
6
+ @url = url
7
+ @message = message
8
+ @author = author
9
+ @time = time
10
+ end
11
+
12
+ attr_reader :sha1, :url, :message, :author
13
+
14
+ def committed_at
15
+ @time
16
+ end
17
+
18
+ def to_hash
19
+ { :id => @sha1,
20
+ :url => @url,
21
+ :message => @message,
22
+ :author => {:name => @author},
23
+ :timestamp => @time }
24
+ end
25
+ end
26
+ end
27
+ end