Merge branch 'sys_hooks' of dev.gitlabhq.com:gitlabhq
This commit is contained in:
commit
3c6daec4b1
33 changed files with 425 additions and 133 deletions
44
app/controllers/admin/hooks_controller.rb
Normal file
44
app/controllers/admin/hooks_controller.rb
Normal file
|
@ -0,0 +1,44 @@
|
|||
class Admin::HooksController < ApplicationController
|
||||
layout "admin"
|
||||
before_filter :authenticate_user!
|
||||
before_filter :authenticate_admin!
|
||||
|
||||
def index
|
||||
@hooks = SystemHook.all
|
||||
@hook = SystemHook.new
|
||||
end
|
||||
|
||||
def create
|
||||
@hook = SystemHook.new(params[:hook])
|
||||
|
||||
if @hook.save
|
||||
redirect_to admin_hooks_path, notice: 'Hook was successfully created.'
|
||||
else
|
||||
@hooks = SystemHook.all
|
||||
render :index
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@hook = SystemHook.find(params[:id])
|
||||
@hook.destroy
|
||||
|
||||
redirect_to admin_hooks_path
|
||||
end
|
||||
|
||||
|
||||
def test
|
||||
@hook = SystemHook.find(params[:hook_id])
|
||||
data = {
|
||||
event_name: "project_create",
|
||||
name: "Ruby",
|
||||
path: "ruby",
|
||||
project_id: 1,
|
||||
owner_name: "Someone",
|
||||
owner_email: "example@gitlabhq.com"
|
||||
}
|
||||
@hook.execute(data)
|
||||
|
||||
redirect_to :back
|
||||
end
|
||||
end
|
|
@ -1,45 +0,0 @@
|
|||
class Admin::MailerController < ApplicationController
|
||||
layout "admin"
|
||||
before_filter :authenticate_user!
|
||||
before_filter :authenticate_admin!
|
||||
|
||||
def preview
|
||||
|
||||
end
|
||||
|
||||
def preview_note
|
||||
@note = Note.first
|
||||
@user = @note.author
|
||||
@project = @note.project
|
||||
case params[:type]
|
||||
when "Commit" then
|
||||
@commit = @project.commit
|
||||
render :file => 'notify/note_commit_email', :layout => 'notify'
|
||||
when "Issue" then
|
||||
@issue = Issue.first
|
||||
render :file => 'notify/note_issue_email', :layout => 'notify'
|
||||
else
|
||||
render :file => 'notify/note_wall_email', :layout => 'notify'
|
||||
end
|
||||
rescue
|
||||
render :text => "Preview not available"
|
||||
end
|
||||
|
||||
def preview_user_new
|
||||
@user = User.first
|
||||
@password = "DHasJKDHAS!"
|
||||
|
||||
render :file => 'notify/new_user_email', :layout => 'notify'
|
||||
rescue
|
||||
render :text => "Preview not available"
|
||||
end
|
||||
|
||||
def preview_issue_new
|
||||
@issue = Issue.first
|
||||
@user = @issue.assignee
|
||||
@project = @issue.project
|
||||
render :file => 'notify/new_issue_email', :layout => 'notify'
|
||||
rescue
|
||||
render :text => "Preview not available"
|
||||
end
|
||||
end
|
|
@ -11,24 +11,24 @@ class HooksController < ApplicationController
|
|||
respond_to :html
|
||||
|
||||
def index
|
||||
@hooks = @project.web_hooks.all
|
||||
@hook = WebHook.new
|
||||
@hooks = @project.hooks.all
|
||||
@hook = ProjectHook.new
|
||||
end
|
||||
|
||||
def create
|
||||
@hook = @project.web_hooks.new(params[:hook])
|
||||
@hook = @project.hooks.new(params[:hook])
|
||||
@hook.save
|
||||
|
||||
if @hook.valid?
|
||||
redirect_to project_hooks_path(@project)
|
||||
else
|
||||
@hooks = @project.web_hooks.all
|
||||
@hooks = @project.hooks.all
|
||||
render :index
|
||||
end
|
||||
end
|
||||
|
||||
def test
|
||||
@hook = @project.web_hooks.find(params[:id])
|
||||
@hook = @project.hooks.find(params[:id])
|
||||
commits = @project.commits(@project.default_branch, nil, 3)
|
||||
data = @project.post_receive_data(commits.last.id, commits.first.id, "refs/heads/#{@project.default_branch}", current_user)
|
||||
@hook.execute(data)
|
||||
|
@ -37,7 +37,7 @@ class HooksController < ApplicationController
|
|||
end
|
||||
|
||||
def destroy
|
||||
@hook = @project.web_hooks.find(params[:id])
|
||||
@hook = @project.hooks.find(params[:id])
|
||||
@hook.destroy
|
||||
|
||||
redirect_to project_hooks_path(@project)
|
||||
|
|
|
@ -19,7 +19,7 @@ class Project < ActiveRecord::Base
|
|||
has_many :notes, :dependent => :destroy
|
||||
has_many :snippets, :dependent => :destroy
|
||||
has_many :deploy_keys, :dependent => :destroy, :foreign_key => "project_id", :class_name => "Key"
|
||||
has_many :web_hooks, :dependent => :destroy
|
||||
has_many :hooks, :dependent => :destroy, :class_name => "ProjectHook"
|
||||
has_many :wikis, :dependent => :destroy
|
||||
has_many :protected_branches, :dependent => :destroy
|
||||
|
||||
|
@ -120,7 +120,7 @@ class Project < ActiveRecord::Base
|
|||
errors.add(:path, " like 'gitolite-admin' is not allowed")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def self.access_options
|
||||
UsersProject.access_roles
|
||||
end
|
||||
|
|
3
app/models/project_hook.rb
Normal file
3
app/models/project_hook.rb
Normal file
|
@ -0,0 +1,3 @@
|
|||
class ProjectHook < WebHook
|
||||
belongs_to :project
|
||||
end
|
13
app/models/system_hook.rb
Normal file
13
app/models/system_hook.rb
Normal file
|
@ -0,0 +1,13 @@
|
|||
class SystemHook < WebHook
|
||||
|
||||
def async_execute(data)
|
||||
Resque.enqueue(SystemHookWorker, id, data)
|
||||
end
|
||||
|
||||
def self.all_hooks_fire(data)
|
||||
SystemHook.all.each do |sh|
|
||||
sh.async_execute data
|
||||
end
|
||||
end
|
||||
|
||||
end
|
|
@ -1,4 +1,5 @@
|
|||
class User < ActiveRecord::Base
|
||||
|
||||
include Account
|
||||
|
||||
devise :database_authenticatable, :token_authenticatable, :lockable,
|
||||
|
|
|
@ -68,7 +68,7 @@ class UsersProject < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def repo_access_human
|
||||
""
|
||||
self.class.access_roles.invert[self.project_access]
|
||||
end
|
||||
end
|
||||
# == Schema Information
|
||||
|
|
|
@ -4,8 +4,6 @@ class WebHook < ActiveRecord::Base
|
|||
# HTTParty timeout
|
||||
default_timeout 10
|
||||
|
||||
belongs_to :project
|
||||
|
||||
validates :url,
|
||||
presence: true,
|
||||
format: {
|
||||
|
@ -14,9 +12,8 @@ class WebHook < ActiveRecord::Base
|
|||
|
||||
def execute(data)
|
||||
WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" })
|
||||
rescue
|
||||
# There was a problem calling this web hook, let's forget about it.
|
||||
end
|
||||
|
||||
end
|
||||
# == Schema Information
|
||||
#
|
||||
|
|
67
app/observers/system_hook_observer.rb
Normal file
67
app/observers/system_hook_observer.rb
Normal file
|
@ -0,0 +1,67 @@
|
|||
class SystemHookObserver < ActiveRecord::Observer
|
||||
observe :user, :project, :users_project
|
||||
|
||||
def after_create(model)
|
||||
if model.kind_of? Project
|
||||
SystemHook.all_hooks_fire({
|
||||
event_name: "project_create",
|
||||
name: model.name,
|
||||
path: model.path,
|
||||
project_id: model.id,
|
||||
owner_name: model.owner.name,
|
||||
owner_email: model.owner.email,
|
||||
created_at: model.created_at
|
||||
})
|
||||
elsif model.kind_of? User
|
||||
SystemHook.all_hooks_fire({
|
||||
event_name: "user_create",
|
||||
name: model.name,
|
||||
email: model.email,
|
||||
created_at: model.created_at
|
||||
})
|
||||
|
||||
elsif model.kind_of? UsersProject
|
||||
SystemHook.all_hooks_fire({
|
||||
event_name: "user_add_to_team",
|
||||
project_name: model.project.name,
|
||||
project_path: model.project.path,
|
||||
project_id: model.project_id,
|
||||
user_name: model.user.name,
|
||||
user_email: model.user.email,
|
||||
project_access: model.repo_access_human,
|
||||
created_at: model.created_at
|
||||
})
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
def after_destroy(model)
|
||||
if model.kind_of? Project
|
||||
SystemHook.all_hooks_fire({
|
||||
event_name: "project_destroy",
|
||||
name: model.name,
|
||||
path: model.path,
|
||||
project_id: model.id,
|
||||
owner_name: model.owner.name,
|
||||
owner_email: model.owner.email,
|
||||
})
|
||||
elsif model.kind_of? User
|
||||
SystemHook.all_hooks_fire({
|
||||
event_name: "user_destroy",
|
||||
name: model.name,
|
||||
email: model.email
|
||||
})
|
||||
|
||||
elsif model.kind_of? UsersProject
|
||||
SystemHook.all_hooks_fire({
|
||||
event_name: "user_remove_from_team",
|
||||
project_name: model.project.name,
|
||||
project_path: model.project.path,
|
||||
project_id: model.project_id,
|
||||
user_name: model.user.name,
|
||||
user_email: model.user.email,
|
||||
project_access: model.repo_access_human
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
|
@ -27,7 +27,7 @@ module GitPush
|
|||
true
|
||||
end
|
||||
|
||||
def execute_web_hooks(oldrev, newrev, ref, user)
|
||||
def execute_hooks(oldrev, newrev, ref, user)
|
||||
ref_parts = ref.split('/')
|
||||
|
||||
# Return if this is not a push to a branch (e.g. new commits)
|
||||
|
@ -35,7 +35,7 @@ module GitPush
|
|||
|
||||
data = post_receive_data(oldrev, newrev, ref, user)
|
||||
|
||||
web_hooks.each { |web_hook| web_hook.execute(data) }
|
||||
hooks.each { |hook| hook.execute(data) }
|
||||
end
|
||||
|
||||
def post_receive_data(oldrev, newrev, ref, user)
|
||||
|
@ -97,7 +97,7 @@ module GitPush
|
|||
self.update_merge_requests(oldrev, newrev, ref, user)
|
||||
|
||||
# Execute web hooks
|
||||
self.execute_web_hooks(oldrev, newrev, ref, user)
|
||||
self.execute_hooks(oldrev, newrev, ref, user)
|
||||
|
||||
# Create satellite
|
||||
self.satellite.create unless self.satellite.exists?
|
||||
|
|
45
app/views/admin/hooks/_data_ex.html.erb
Normal file
45
app/views/admin/hooks/_data_ex.html.erb
Normal file
|
@ -0,0 +1,45 @@
|
|||
<% data_ex_str = <<eos
|
||||
{
|
||||
:before => "95790bf891e76fee5e1747ab589903a6a1f80f22",
|
||||
:after => "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
|
||||
:ref => "refs/heads/master",
|
||||
:user_id => 4,
|
||||
:user_name => "John Smith",
|
||||
:repository => {
|
||||
:name => "Diaspora",
|
||||
:url => "localhost/diaspora",
|
||||
:description => "",
|
||||
:homepage => "localhost/diaspora",
|
||||
:private => true
|
||||
},
|
||||
:commits => [
|
||||
[0] {
|
||||
:id => "450d0de7532f8b663b9c5cce183b...",
|
||||
:message => "Update Catalan translation to e38cb41.",
|
||||
:timestamp => "2011-12-12T14:27:31+02:00",
|
||||
:url => "http://localhost/diaspora/commits/450d0de7532f...",
|
||||
:author => {
|
||||
:name => "Jordi Mallach",
|
||||
:email => "jordi@softcatala.org"
|
||||
}
|
||||
},
|
||||
|
||||
....
|
||||
|
||||
[3] {
|
||||
:id => "da1560886d4f094c3e6c9ef40349...",
|
||||
:message => "fixed readme",
|
||||
:timestamp => "2012-01-03T23:36:29+02:00",
|
||||
:url => "http://localhost/diaspora/commits/da1560886d...",
|
||||
:author => {
|
||||
:name => "gitlab dev user",
|
||||
:email => "gitlabdev@dv6700.(none)"
|
||||
}
|
||||
}
|
||||
],
|
||||
total_commits_count => 3
|
||||
}
|
||||
eos
|
||||
%>
|
||||
<% js_lexer = Pygments::Lexer[:js] %>
|
||||
<%= raw js_lexer.highlight(data_ex_str) %>
|
39
app/views/admin/hooks/index.html.haml
Normal file
39
app/views/admin/hooks/index.html.haml
Normal file
|
@ -0,0 +1,39 @@
|
|||
.alert.alert-info
|
||||
%span
|
||||
Post receive hooks for binding events.
|
||||
%br
|
||||
Read more about system hooks
|
||||
%strong #{link_to "here", help_system_hooks_path, :class => "vlink"}
|
||||
|
||||
= form_for @hook, :as => :hook, :url => admin_hooks_path do |f|
|
||||
-if @hook.errors.any?
|
||||
.alert-message.block-message.error
|
||||
- @hook.errors.full_messages.each do |msg|
|
||||
%p= msg
|
||||
.clearfix
|
||||
= f.label :url, "URL:"
|
||||
.input
|
||||
= f.text_field :url, :class => "text_field xxlarge"
|
||||
|
||||
= f.submit "Add System Hook", :class => "btn primary"
|
||||
%hr
|
||||
|
||||
-if @hooks.any?
|
||||
%h3
|
||||
Hooks
|
||||
%small (#{@hooks.count})
|
||||
%br
|
||||
%table.admin-table
|
||||
%tr
|
||||
%th URL
|
||||
%th Method
|
||||
%th
|
||||
- @hooks.each do |hook|
|
||||
%tr
|
||||
%td
|
||||
= link_to admin_hook_path(hook) do
|
||||
%strong= hook.url
|
||||
= link_to 'Test Hook', admin_hook_test_path(hook), :class => "btn small right"
|
||||
%td POST
|
||||
%td
|
||||
= link_to 'Remove', admin_hook_path(hook), :confirm => 'Are you sure?', :method => :delete, :class => "danger btn small right"
|
|
@ -1,28 +0,0 @@
|
|||
%p This is page with preview for all system emails that are sent to user
|
||||
%p Email previews built based on existing Project/Commit/Issue base - so some preview maybe unavailable unless object appear in system
|
||||
|
||||
#accordion
|
||||
%h3
|
||||
%a New user
|
||||
%div
|
||||
%iframe{ :src=> admin_mailer_preview_user_new_path, :width=>"100%", :height=>"350"}
|
||||
%h3
|
||||
%a New issue
|
||||
%div
|
||||
%iframe{ :src=> admin_mailer_preview_issue_new_path, :width=>"100%", :height=>"350"}
|
||||
%h3
|
||||
%a Commit note
|
||||
%div
|
||||
%iframe{ :src=> admin_mailer_preview_note_path(:type => "Commit"), :width=>"100%", :height=>"350"}
|
||||
%h3
|
||||
%a Issue note
|
||||
%div
|
||||
%iframe{ :src=> admin_mailer_preview_note_path(:type => "Issue"), :width=>"100%", :height=>"350"}
|
||||
%h3
|
||||
%a Wall note
|
||||
%div
|
||||
%iframe{ :src=> admin_mailer_preview_note_path(:type => "Wall"), :width=>"100%", :height=>"350"}
|
||||
|
||||
:javascript
|
||||
$(function() {
|
||||
$("#accordion").accordion(); });
|
13
app/views/help/system_hooks.html.haml
Normal file
13
app/views/help/system_hooks.html.haml
Normal file
|
@ -0,0 +1,13 @@
|
|||
%h3 System hooks
|
||||
.back_link
|
||||
= link_to :back do
|
||||
← back
|
||||
%hr
|
||||
|
||||
%p.slead
|
||||
Your Gitlab instance can perform HTTP POST request on next event: create_project, delete_project, create_user, delete_user, change_team_member.
|
||||
%br
|
||||
System Hooks can be used for logging or change information in LDAP server.
|
||||
%br
|
||||
%h5 Hooks request example:
|
||||
= render "admin/hooks/data_ex"
|
|
@ -15,7 +15,7 @@
|
|||
%li{:class => tab_class(:admin_logs)}
|
||||
= link_to "Logs", admin_logs_path
|
||||
%li{:class => tab_class(:admin_emails)}
|
||||
= link_to "Emails", admin_emails_path
|
||||
= link_to "Hooks", admin_hooks_path
|
||||
%li{:class => tab_class(:admin_resque)}
|
||||
= link_to "Resque", admin_resque_path
|
||||
|
||||
|
|
7
app/workers/system_hook_worker.rb
Normal file
7
app/workers/system_hook_worker.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class SystemHookWorker
|
||||
@queue = :system_hook
|
||||
|
||||
def self.perform(hook_id, data)
|
||||
SystemHook.find(hook_id).execute data
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue