perkins 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/Gemfile +1 -0
- data/README.md +11 -8
- data/Rakefile +1 -18
- data/config/database.yml +19 -0
- data/db/migrate/20150130143050_create_builds.rb +1 -1
- data/db/migrate/20150220143051_add_build_status_to_build_reports.rb +10 -0
- data/db/migrate/20150220143053_add_commit_to_build_reports.rb +10 -0
- data/db/migrate/20150220143054_add_hook_id_to_repo.rb +10 -0
- data/db/schema.rb +4 -2
- data/examples/Capfile +17 -0
- data/examples/Gemfile +14 -1
- data/examples/Gemfile.lock +45 -19
- data/examples/Procfile +8 -3
- data/examples/README.md +12 -0
- data/examples/boot.rb +5 -4
- data/examples/config.ru +2 -11
- data/examples/{database.yml → config/database.example.yml} +0 -0
- data/examples/config/database.yml +27 -0
- data/examples/config/deploy.rb +78 -0
- data/examples/config/deploy/staging.rb +61 -0
- data/examples/{rainbows.rb → config/rainbows/development.rb} +1 -1
- data/examples/config/rainbows/production.rb +56 -0
- data/examples/{sidekiq.yml → config/sidekiq.yml} +0 -0
- data/examples/db/schema.rb +43 -0
- data/examples/rakefile +8 -0
- data/lib/perkins/application.rb +1 -1
- data/lib/perkins/assets.rb +3 -3
- data/lib/perkins/assets/javascripts/app.js +1 -0
- data/lib/perkins/assets/javascripts/perkings.js.coffee +14 -9
- data/lib/perkins/assets/javascripts/perkins/helpers.js.coffee +2 -2
- data/lib/perkins/assets/javascripts/perkins/m/models.js.coffee +15 -9
- data/lib/perkins/assets/javascripts/perkins/router.js.coffee +1 -0
- data/lib/perkins/assets/javascripts/perkins/v/my_repos.js.coffee +1 -1
- data/lib/perkins/assets/javascripts/perkins/v/orgs.js.coffee +1 -1
- data/lib/perkins/assets/javascripts/perkins/v/repo.js.coffee +38 -5
- data/lib/perkins/assets/javascripts/templates/repo.hamlc +5 -14
- data/lib/perkins/assets/javascripts/templates/repos/build_row.hamlc +10 -5
- data/lib/perkins/assets/javascripts/templates/repos/config.hamlc +23 -13
- data/lib/perkins/assets/javascripts/templates/repos/report_detail.hamlc +6 -6
- data/lib/perkins/assets/javascripts/vendor/eventsource.polyfill.js +512 -0
- data/lib/perkins/build/script.rb +2 -1
- data/lib/perkins/build/script/go.rb +1 -1
- data/lib/perkins/build/script/ruby.rb +1 -1
- data/lib/perkins/build/script/stages.rb +0 -1
- data/lib/perkins/build_report.rb +27 -7
- data/lib/perkins/build_worker.rb +10 -15
- data/lib/perkins/git_loader_worker.rb +1 -14
- data/lib/perkins/repo.rb +106 -21
- data/lib/perkins/runner.rb +57 -12
- data/lib/perkins/server.rb +42 -46
- data/lib/perkins/socket_server.rb +38 -0
- data/lib/perkins/version.rb +1 -1
- data/lib/tasks/db_tasks.rake +35 -0
- data/perkins.gemspec +16 -19
- data/spec/README.md +3 -0
- data/spec/lib/build/build_spec.rb +7 -3
- data/spec/lib/repo_spec.rb +23 -32
- data/spec/lib/runner_spec.rb +52 -2
- data/spec/lib/server_spec.rb +15 -6
- data/spec/spec_helper.rb +6 -5
- metadata +21 -57
- data/.DS_Store +0 -0
- data/lib/perkins/views/builds.haml +0 -43
- data/lib/perkins/views/menu.haml +0 -18
- data/lib/perkins/views/orgs.haml +0 -101
- data/lib/perkins/views/profile.haml +0 -31
- data/lib/perkins/views/repos/config.haml +0 -72
- data/lib/perkins/views/repos/github.haml +0 -45
- data/lib/perkins/views/repos/menu.haml +0 -17
- data/lib/perkins/views/repos/repo.haml +0 -64
- data/lib/perkins/views/repos/spinner.haml +0 -3
File without changes
|
@@ -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
|
+
# }
|
@@ -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
|
File without changes
|
@@ -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
|
data/examples/rakefile
CHANGED
@@ -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"
|
data/lib/perkins/application.rb
CHANGED
@@ -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
|
data/lib/perkins/assets.rb
CHANGED
@@ -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
|
-
|
14
|
-
env.
|
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,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
|
-
|
26
|
-
|
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 = (
|
8
|
-
"#{
|
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"
|