perkins 0.0.3 → 0.0.5

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/Gemfile +1 -0
  4. data/README.md +11 -8
  5. data/Rakefile +1 -18
  6. data/config/database.yml +19 -0
  7. data/db/migrate/20150130143050_create_builds.rb +1 -1
  8. data/db/migrate/20150220143051_add_build_status_to_build_reports.rb +10 -0
  9. data/db/migrate/20150220143053_add_commit_to_build_reports.rb +10 -0
  10. data/db/migrate/20150220143054_add_hook_id_to_repo.rb +10 -0
  11. data/db/schema.rb +4 -2
  12. data/examples/Capfile +17 -0
  13. data/examples/Gemfile +14 -1
  14. data/examples/Gemfile.lock +45 -19
  15. data/examples/Procfile +8 -3
  16. data/examples/README.md +12 -0
  17. data/examples/boot.rb +5 -4
  18. data/examples/config.ru +2 -11
  19. data/examples/{database.yml → config/database.example.yml} +0 -0
  20. data/examples/config/database.yml +27 -0
  21. data/examples/config/deploy.rb +78 -0
  22. data/examples/config/deploy/staging.rb +61 -0
  23. data/examples/{rainbows.rb → config/rainbows/development.rb} +1 -1
  24. data/examples/config/rainbows/production.rb +56 -0
  25. data/examples/{sidekiq.yml → config/sidekiq.yml} +0 -0
  26. data/examples/db/schema.rb +43 -0
  27. data/examples/rakefile +8 -0
  28. data/lib/perkins/application.rb +1 -1
  29. data/lib/perkins/assets.rb +3 -3
  30. data/lib/perkins/assets/javascripts/app.js +1 -0
  31. data/lib/perkins/assets/javascripts/perkings.js.coffee +14 -9
  32. data/lib/perkins/assets/javascripts/perkins/helpers.js.coffee +2 -2
  33. data/lib/perkins/assets/javascripts/perkins/m/models.js.coffee +15 -9
  34. data/lib/perkins/assets/javascripts/perkins/router.js.coffee +1 -0
  35. data/lib/perkins/assets/javascripts/perkins/v/my_repos.js.coffee +1 -1
  36. data/lib/perkins/assets/javascripts/perkins/v/orgs.js.coffee +1 -1
  37. data/lib/perkins/assets/javascripts/perkins/v/repo.js.coffee +38 -5
  38. data/lib/perkins/assets/javascripts/templates/repo.hamlc +5 -14
  39. data/lib/perkins/assets/javascripts/templates/repos/build_row.hamlc +10 -5
  40. data/lib/perkins/assets/javascripts/templates/repos/config.hamlc +23 -13
  41. data/lib/perkins/assets/javascripts/templates/repos/report_detail.hamlc +6 -6
  42. data/lib/perkins/assets/javascripts/vendor/eventsource.polyfill.js +512 -0
  43. data/lib/perkins/build/script.rb +2 -1
  44. data/lib/perkins/build/script/go.rb +1 -1
  45. data/lib/perkins/build/script/ruby.rb +1 -1
  46. data/lib/perkins/build/script/stages.rb +0 -1
  47. data/lib/perkins/build_report.rb +27 -7
  48. data/lib/perkins/build_worker.rb +10 -15
  49. data/lib/perkins/git_loader_worker.rb +1 -14
  50. data/lib/perkins/repo.rb +106 -21
  51. data/lib/perkins/runner.rb +57 -12
  52. data/lib/perkins/server.rb +42 -46
  53. data/lib/perkins/socket_server.rb +38 -0
  54. data/lib/perkins/version.rb +1 -1
  55. data/lib/tasks/db_tasks.rake +35 -0
  56. data/perkins.gemspec +16 -19
  57. data/spec/README.md +3 -0
  58. data/spec/lib/build/build_spec.rb +7 -3
  59. data/spec/lib/repo_spec.rb +23 -32
  60. data/spec/lib/runner_spec.rb +52 -2
  61. data/spec/lib/server_spec.rb +15 -6
  62. data/spec/spec_helper.rb +6 -5
  63. metadata +21 -57
  64. data/.DS_Store +0 -0
  65. data/lib/perkins/views/builds.haml +0 -43
  66. data/lib/perkins/views/menu.haml +0 -18
  67. data/lib/perkins/views/orgs.haml +0 -101
  68. data/lib/perkins/views/profile.haml +0 -31
  69. data/lib/perkins/views/repos/config.haml +0 -72
  70. data/lib/perkins/views/repos/github.haml +0 -45
  71. data/lib/perkins/views/repos/menu.haml +0 -17
  72. data/lib/perkins/views/repos/repo.haml +0 -64
  73. data/lib/perkins/views/repos/spinner.haml +0 -3
@@ -0,0 +1,27 @@
1
+ production:
2
+ adapter: mysql2
3
+ database: perkins_production
4
+ username: root
5
+ password:
6
+ host: 127.0.0.1
7
+ pool: 22
8
+
9
+ development:
10
+
11
+ adapter: mysql2
12
+ database: perkins_development
13
+ username: root
14
+ password:
15
+ host: localhost
16
+ pool: 22
17
+
18
+ #adapter: sqlite3
19
+ #database: ./db/development2.sqlite3 #point to perkins gem database
20
+ #pool: 25
21
+ #timeout: 5000
22
+
23
+ test:
24
+ adapter: sqlite3
25
+ database: db/test.sqlite3
26
+ pool: 5
27
+ timeout: 5000
@@ -0,0 +1,78 @@
1
+ # config valid only for current version of Capistrano
2
+ lock '3.4.0'
3
+
4
+ #set :application, 'my_app_name'
5
+ #set :repo_url, 'git@example.com:me/my_repo.git'
6
+
7
+ # Default branch is :master
8
+ # ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
9
+
10
+ # Default deploy_to directory is /var/www/my_app_name
11
+ # set :deploy_to, '/var/www/my_app_name'
12
+
13
+ # Default value for :scm is :git
14
+ # set :scm, :git
15
+
16
+ # Default value for :format is :pretty
17
+ # set :format, :pretty
18
+
19
+ # Default value for :log_level is :debug
20
+ # set :log_level, :debug
21
+
22
+ # Default value for :pty is false
23
+ # set :pty, true
24
+
25
+ # Default value for :linked_files is []
26
+ # set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml')
27
+
28
+ # Default value for linked_dirs is []
29
+ # set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
30
+
31
+ # Default value for default_env is {}
32
+ # set :default_env, { path: "/opt/ruby/bin:$PATH" }
33
+
34
+ # Default value for keep_releases is 5
35
+ # set :keep_releases, 5
36
+
37
+ after 'deploy:publishing', 'deploy:restart'
38
+ namespace :deploy do
39
+ task :restart do
40
+ invoke 'rainbows:restart'
41
+ end
42
+ end
43
+
44
+ namespace :deploy do
45
+
46
+ after :restart, :clear_cache do
47
+ on roles(:web), in: :groups, limit: 3, wait: 10 do
48
+ # Here we can do anything such as:
49
+ # within release_path do
50
+ # execute :rake, 'cache:clear'
51
+ # end
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+
58
+
59
+ =begin
60
+
61
+ If preload_app:true and you need capistrano to cleanup your oldbin pid use:
62
+
63
+ after 'deploy:publishing', 'deploy:restart'
64
+ namespace :deploy do
65
+ task :restart do
66
+ invoke 'rainbows:legacy_restart'
67
+ end
68
+ end
69
+ Otherwise use:
70
+
71
+ after 'deploy:publishing', 'deploy:restart'
72
+ namespace :deploy do
73
+ task :restart do
74
+ invoke 'rainbows:reload'
75
+ end
76
+ end
77
+
78
+ =end
@@ -0,0 +1,61 @@
1
+ # server-based syntax
2
+ # ======================
3
+ # Defines a single server with a list of roles and multiple properties.
4
+ # You can define all roles on a single server, or split them:
5
+
6
+ # server 'example.com', user: 'deploy', roles: %w{app db web}, my_property: :my_value
7
+ # server 'example.com', user: 'deploy', roles: %w{app web}, other_property: :other_value
8
+ # server 'db.example.com', user: 'deploy', roles: %w{db}
9
+
10
+
11
+
12
+ # role-based syntax
13
+ # ==================
14
+
15
+ # Defines a role with one or multiple servers. The primary server in each
16
+ # group is considered to be the first unless any hosts have the primary
17
+ # property set. Specify the username and a domain or IP for the server.
18
+ # Don't use `:all`, it's a meta role.
19
+
20
+ # role :app, %w{deploy@example.com}, my_property: :my_value
21
+ # role :web, %w{user1@primary.com user2@additional.com}, other_property: :other_value
22
+ # role :db, %w{deploy@example.com}
23
+
24
+
25
+
26
+ # Configuration
27
+ # =============
28
+ # You can set any configuration variable like in config/deploy.rb
29
+ # These variables are then only loaded and set in this stage.
30
+ # For available Capistrano configuration variables see the documentation page.
31
+ # http://capistranorb.com/documentation/getting-started/configuration/
32
+ # Feel free to add new variables to customise your setup.
33
+
34
+
35
+
36
+ # Custom SSH Options
37
+ # ==================
38
+ # You may pass any option but keep in mind that net/ssh understands a
39
+ # limited set of options, consult the Net::SSH documentation.
40
+ # http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start
41
+ #
42
+ # Global options
43
+ # --------------
44
+ # set :ssh_options, {
45
+ # keys: %w(/home/rlisowski/.ssh/id_rsa),
46
+ # forward_agent: false,
47
+ # auth_methods: %w(password)
48
+ # }
49
+ #
50
+ # The server-based syntax can be used to override options:
51
+ # ------------------------------------
52
+ # server 'example.com',
53
+ # user: 'user_name',
54
+ # roles: %w{web app},
55
+ # ssh_options: {
56
+ # user: 'user_name', # overrides user setting above
57
+ # keys: %w(/home/user_name/.ssh/id_rsa),
58
+ # forward_agent: false,
59
+ # auth_methods: %w(publickey password)
60
+ # # password: 'please use keys'
61
+ # }
@@ -1,5 +1,5 @@
1
1
  worker_processes 4 # assuming four CPU cores
2
2
  Rainbows! do
3
- use :FiberSpawn
3
+ use :EventMachine
4
4
  worker_connections 100
5
5
  end
@@ -0,0 +1,56 @@
1
+ # paths
2
+ # => You can also choose the using Ruby: app_path = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+ app_path = "/var/www/perkins/"
4
+
5
+ working_directory "#{app_path}/current"
6
+ pid "#{app_path}/current/tmp/pids/rainbows.pid"
7
+
8
+ # listen
9
+ listen "/var/www/perkins/shared/perkins.sock", :backlog => 64
10
+
11
+ # logging
12
+ stderr_path "log/rainbows.stderr.log"
13
+ stdout_path "log/rainbows.stdout.log"
14
+
15
+ # workers
16
+ worker_processes 3
17
+
18
+ #worker_processes 4 # assuming four CPU cores
19
+ Rainbows! do
20
+ use :EventMachine
21
+ worker_connections 100
22
+ end
23
+
24
+
25
+ # use correct Gemfile on restarts
26
+ before_exec do |server|
27
+ ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile"
28
+ end
29
+
30
+ # preload
31
+ preload_app true
32
+
33
+ before_fork do |server, worker|
34
+ # the following is highly recomended for Rails + "preload_app true"
35
+ # as there's no need for the master process to hold a connection
36
+ # if defined?(ActiveRecord::Base)
37
+ # ActiveRecord::Base.connection.disconnect!
38
+ # end
39
+
40
+ # Before forking, kill the master process that belongs to the .oldbin PID.
41
+ # This enables 0 downtime deploys.
42
+ old_pid = "#{server.config[:pid]}.oldbin"
43
+ if File.exists?(old_pid) && server.pid != old_pid
44
+ begin
45
+ Process.kill("QUIT", File.read(old_pid).to_i)
46
+ rescue Errno::ENOENT, Errno::ESRCH
47
+ # someone else did our job for us
48
+ end
49
+ end
50
+ end
51
+
52
+ #after_fork do |server, worker|
53
+ # if defined?(ActiveRecord::Base)
54
+ # ActiveRecord::Base.establish_connection
55
+ # end
56
+ #end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended that you check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(version: 20150220143054) do
15
+
16
+ create_table "build_reports", force: true do |t|
17
+ t.string "sha"
18
+ t.string "branch"
19
+ t.string "build_time"
20
+ t.string "duration"
21
+ t.text "response"
22
+ t.boolean "status"
23
+ t.integer "repo_id"
24
+ t.string "build_status"
25
+ t.text "commit"
26
+ end
27
+
28
+ create_table "repos", force: true do |t|
29
+ t.string "url"
30
+ t.string "name"
31
+ t.string "working_dir"
32
+ t.string "branch"
33
+ t.integer "gb_id"
34
+ t.text "github_data"
35
+ t.boolean "cached"
36
+ t.string "build_status"
37
+ t.string "download_status"
38
+ t.integer "hook_id"
39
+ end
40
+
41
+ add_index "repos", ["gb_id"], name: "index_repos_on_gb_id", unique: true, using: :btree
42
+
43
+ end
@@ -1,3 +1,11 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.require
4
+
5
+ spec = Gem::Specification.find_by_name 'perkins'
6
+ import "#{spec.gem_dir}/lib/tasks/db_tasks.rake"
7
+ ActiveRecord::Migrator.migrations_paths << "#{spec.gem_dir}/db/migrate"
8
+
1
9
  desc "Open an irb session preloaded with this library"
2
10
  task :console do
3
11
  sh "irb -rubygems -I lib -r ./boot.rb"
@@ -2,7 +2,7 @@ module Perkins
2
2
  class Application
3
3
  attr_accessor :host , :port, :working_dir, :redis, :database, :sse_endpoint
4
4
  attr_reader :server
5
- attr_accessor :github_client_id, :github_client_secret
5
+ attr_accessor :github_client_id, :github_client_secret, :port
6
6
 
7
7
  class << self
8
8
  attr_accessor :instance
@@ -2,7 +2,6 @@ module Perkins
2
2
  class Assets < Sinatra::Base
3
3
 
4
4
  require "haml_coffee_assets"
5
-
6
5
  configure do
7
6
  set :assets, (Sprockets::Environment.new { |env|
8
7
  env.append_path(settings.root + "/assets/images")
@@ -10,8 +9,9 @@ module Perkins
10
9
  env.append_path(settings.root + "/assets/stylesheets")
11
10
  # compress everything in production
12
11
  if ENV["RACK_ENV"] == "production"
13
- env.js_compressor = YUI::JavaScriptCompressor.new
14
- env.css_compressor = YUI::CssCompressor.new
12
+ #require "yui/compressor"
13
+ #env.js_compressor = YUI::JavaScriptCompressor.new
14
+ #env.css_compressor = YUI::CssCompressor.new
15
15
  end
16
16
  })
17
17
  end
@@ -1,5 +1,6 @@
1
1
  // require_tree
2
2
 
3
+ //= require vendor/eventsource.polyfill
3
4
  //= require vendor/md5
4
5
  //= require vendor/livequery.jquery
5
6
  //= require vendor/hamlcoffee
@@ -1,16 +1,18 @@
1
1
 
2
2
  $(document).ready ()->
3
3
 
4
+ Log.DEBUG = false
5
+
4
6
  $("abbr.timeago").livequery ->
5
7
  $(@).timeago()
6
8
 
7
9
  #reading
8
- es = new EventSource("/stream")
9
- es.onmessage = (e) ->
10
- console.log("MESSAGE RECEIVED")
11
- console.log(e.data)
12
- a = JSON.parse(e.data)
13
10
 
11
+ source = new EventSource('/stream');
12
+ source.addEventListener 'message', (event)->
13
+ a = JSON.parse(event.data)
14
+ console.log(a)
15
+
14
16
  if a.repo.status == "stop"
15
17
  $("#repo-#{a.repo.id} .fa-refresh").removeClass("fa-spin")
16
18
  $(".repo-#{a.repo.id}-spinner.build-status").addClass("hidden")
@@ -21,10 +23,9 @@ $(document).ready ()->
21
23
  #if repo.id is current repo then reload page
22
24
  if current_repo && a.repo.id is current_repo.id && (a.repo.status is "stop" || a.repo.status is "downloaded" )
23
25
  Backbone.history.loadUrl()
24
-
25
- es.onerror = (e)->
26
- console.log("error")
27
- console.log(e)
26
+ #current_repo.fetch()
27
+ #if current_view.build
28
+ # current_view.build.fetch
28
29
 
29
30
  NProgress.configure({ showSpinner: false })
30
31
 
@@ -38,6 +39,10 @@ $(document).ready ()->
38
39
  console.log "AJAX STOP!"
39
40
  NProgress.done()
40
41
 
42
+
43
+
44
+
45
+
41
46
  #application
42
47
  class Perkins.AppLayout extends Backbone.Marionette.Layout
43
48
  template: "#perkins-layout"
@@ -4,8 +4,8 @@ Perkins.Helpers.gravatar_url = (email, size) ->
4
4
  gravatar_id = MD5(email)
5
5
  "http://gravatar.com/avatar/#{gravatar_id}.png?s=#{size}"
6
6
 
7
- Perkins.Helpers.commit_url = (repo, sha) ->
8
- "#{repo.repo.http_url}/commit/#{sha}"
7
+ Perkins.Helpers.commit_url = (sha) ->
8
+ "#{current_repo.get("http_url")}/commit/#{sha}"
9
9
 
10
10
  Perkins.Helpers.status_label = (status)->
11
11
  label = if status == true then "success" else "default"
@@ -5,24 +5,30 @@ class Perkins.Models.Profile extends Backbone.Model
5
5
  class Perkins.Models.Repo extends Backbone.Model
6
6
  url: ()->
7
7
  if @.get('name')
8
- "/repos/#{@.get('name')}"
8
+ "/repos/#{@.get('name')}.json"
9
9
  else
10
- "/repos"
10
+ "/repos.json"
11
11
 
12
12
  class Perkins.Collections.Repos extends Backbone.Collection
13
13
  model: Perkins.Models.Repo
14
14
  url: ->
15
- "/repos"
15
+ "/repos.json"
16
16
 
17
17
  class Perkins.Models.BuildReport extends Backbone.Model
18
18
  initialize: (opts={})->
19
19
  @repo = opts.repo
20
20
 
21
21
  url: ->
22
- "/repos/#{@repo.get('name')}/builds/#{@id}"
22
+ "/repos/#{@repo.get('name')}/builds/#{@id}.json"
23
23
 
24
24
  restart: ->
25
- @fetch(url: @url() + "/restart")
25
+ @fetch(url: @url() + "/restart.json")
26
+
27
+ isStopped: ->
28
+ @get('build_status') is "stopped"
29
+
30
+ isStarted: ->
31
+ @get('build_status') is "started"
26
32
 
27
33
  class Perkins.Collections.BuildReports extends Backbone.Collection
28
34
  model: Perkins.Models.BuildReport
@@ -31,20 +37,20 @@ class Perkins.Collections.BuildReports extends Backbone.Collection
31
37
  @repo = opts.repo
32
38
 
33
39
  url: ->
34
- "/repos/#{@repo.get('name')}/builds"
40
+ "/repos/#{@repo.get('name')}/builds.json"
35
41
 
36
42
  class Perkins.Models.RepoHook extends Backbone.Model
37
43
  initialize: (opts={})->
38
44
  @repo = opts.repo
39
45
 
40
46
  url: ->
41
- "/repos/#{@repo.get('name')}/config"
47
+ "/repos/#{@repo.get('name')}/config.json"
42
48
 
43
49
  class Perkins.Models.Org extends Backbone.Model
44
50
  url: ->
45
- "/orgs/#{@.get('name')}"
51
+ "/orgs/#{@.get('name')}.json"
46
52
 
47
53
  class Perkins.Collections.Orgs extends Backbone.Collection
48
54
  model: Perkins.Models.Org
49
55
  url: ->
50
- "/orgs"
56
+ "/orgs.json"