Commit c5de01f8 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'refactor/services' of /home/git/repositories/gitlab/gitlabhq

parents adc51a9b 6caa5a84
v 5.3.0
- Refactored services
- Campfire service added
v 5.2.0 v 5.2.0
- Turbolinks - Turbolinks
- Git over http with ldap credentials - Git over http with ldap credentials
......
...@@ -101,6 +101,9 @@ gem "foreman" ...@@ -101,6 +101,9 @@ gem "foreman"
# Cache # Cache
gem "redis-rails" gem "redis-rails"
# Campfire integration
gem 'tinder', '~> 1.9.2'
group :assets do group :assets do
gem "sass-rails" gem "sass-rails"
gem "coffee-rails" gem "coffee-rails"
......
...@@ -130,6 +130,8 @@ GEM ...@@ -130,6 +130,8 @@ GEM
railties (>= 3.0.0) railties (>= 3.0.0)
faraday (0.8.7) faraday (0.8.7)
multipart-post (~> 1.1) multipart-post (~> 1.1)
faraday_middleware (0.9.0)
faraday (>= 0.7.4, < 0.9)
faye-websocket (0.4.7) faye-websocket (0.4.7)
eventmachine (>= 0.12.0) eventmachine (>= 0.12.0)
ffaker (1.16.0) ffaker (1.16.0)
...@@ -214,7 +216,7 @@ GEM ...@@ -214,7 +216,7 @@ GEM
activesupport (>= 3.1, < 4.1) activesupport (>= 3.1, < 4.1)
haml (>= 3.1, < 4.1) haml (>= 3.1, < 4.1)
railties (>= 3.1, < 4.1) railties (>= 3.1, < 4.1)
hashie (2.0.4) hashie (1.2.0)
hike (1.2.2) hike (1.2.2)
http_parser.rb (0.5.3) http_parser.rb (0.5.3)
httparty (0.11.0) httparty (0.11.0)
...@@ -420,6 +422,7 @@ GEM ...@@ -420,6 +422,7 @@ GEM
multi_json (~> 1) multi_json (~> 1)
redis (~> 3) redis (~> 3)
redis-namespace redis-namespace
simple_oauth (0.1.9)
simplecov (0.7.1) simplecov (0.7.1)
multi_json (~> 1.0) multi_json (~> 1.0)
simplecov-html (~> 0.7.1) simplecov-html (~> 0.7.1)
...@@ -461,11 +464,24 @@ GEM ...@@ -461,11 +464,24 @@ GEM
thor (0.18.1) thor (0.18.1)
tilt (1.3.7) tilt (1.3.7)
timers (1.1.0) timers (1.1.0)
tinder (1.9.2)
eventmachine (~> 1.0)
faraday (~> 0.8)
faraday_middleware (~> 0.9)
hashie (~> 1.0)
json (~> 1.7.5)
mime-types (~> 1.19)
multi_json (~> 1.5)
twitter-stream (~> 0.1)
treetop (1.4.12) treetop (1.4.12)
polyglot polyglot
polyglot (>= 0.3.1) polyglot (>= 0.3.1)
turbolinks (1.1.1) turbolinks (1.1.1)
coffee-rails coffee-rails
twitter-stream (0.1.16)
eventmachine (>= 0.12.8)
http_parser.rb (~> 0.5.1)
simple_oauth (~> 0.1.4)
tzinfo (0.3.37) tzinfo (0.3.37)
uglifier (2.0.1) uglifier (2.0.1)
execjs (>= 0.3.0) execjs (>= 0.3.0)
...@@ -570,6 +586,7 @@ DEPENDENCIES ...@@ -570,6 +586,7 @@ DEPENDENCIES
test_after_commit test_after_commit
therubyracer therubyracer
thin thin
tinder (~> 1.9.2)
turbolinks turbolinks
uglifier uglifier
webmock webmock
...@@ -60,7 +60,7 @@ class Wall ...@@ -60,7 +60,7 @@ class Wall
renderNote: (note) -> renderNote: (note) ->
template = @noteTemplate() template = @noteTemplate()
template = template.replace('{{author_name}}', note.author.name) template = template.replace('{{author_name}}', note.author.name)
template = template.replace('{{created_at}}', note.created_at) template = template.replace(/{{created_at}}/g, note.created_at)
template = template.replace('{{text}}', linkify(sanitize(note.body))) template = template.replace('{{text}}', linkify(sanitize(note.body)))
if note.attachment if note.attachment
......
class ServicesController < ProjectResourceController class ServicesController < ProjectResourceController
# Authorize # Authorize
before_filter :authorize_admin_project! before_filter :authorize_admin_project!
before_filter :service, only: [:edit, :update, :test]
respond_to :html respond_to :html
def index def index
@gitlab_ci_service = @project.gitlab_ci_service @project.build_missing_services
@services = @project.services.reload
end end
def edit def edit
@service = @project.gitlab_ci_service
# Create if missing
@service = @project.create_gitlab_ci_service unless @service
end end
def update def update
@service = @project.gitlab_ci_service
if @service.update_attributes(params[:service]) if @service.update_attributes(params[:service])
redirect_to edit_project_service_path(@project, :gitlab_ci) redirect_to edit_project_service_path(@project, @service.to_param)
else else
render 'edit' render 'edit'
end end
...@@ -28,9 +24,14 @@ class ServicesController < ProjectResourceController ...@@ -28,9 +24,14 @@ class ServicesController < ProjectResourceController
def test def test
data = GitPushService.new.sample_data(project, current_user) data = GitPushService.new.sample_data(project, current_user)
@service = project.gitlab_ci_service
@service.execute(data) @service.execute(data)
redirect_to :back redirect_to :back
end end
private
def service
@service ||= @project.services.find { |service| service.to_param == params[:id] }
end
end end
# == Schema Information
#
# Table name: services
#
# id :integer not null, primary key
# type :string(255)
# title :string(255)
# token :string(255)
# project_id :integer not null
# created_at :datetime not null
# updated_at :datetime not null
# active :boolean default(FALSE), not null
# project_url :string(255)
#
class CampfireService < Service
attr_accessible :subdomain, :room
validates :token, presence: true, if: :activated?
def title
'Campfire'
end
def description
'Simple web-based real-time group chat'
end
def to_param
'campfire'
end
def fields
[
{ type: 'text', name: 'token', placeholder: '' },
{ type: 'text', name: 'subdomain', placeholder: '' },
{ type: 'text', name: 'room', placeholder: '' }
]
end
def execute(push_data)
room = gate.find_room_by_name(self.room)
return true unless room
message = build_message(push_data)
room.speak(message)
end
private
def gate
@gate ||= Tinder::Campfire.new(subdomain, token: token)
end
def build_message(push)
ref = push[:ref].gsub("refs/heads/", "")
before = push[:before]
after = push[:after]
message = ""
message << "[#{project.name_with_namespace}] "
message << "#{push[:user_name]} "
if before =~ /000000/
message << "pushed new branch #{ref} \n"
elsif after =~ /000000/
message << "removed branch #{ref} \n"
else
message << "pushed #{push[:total_commits_count]} commits to #{ref}. "
message << "#{project.web_url}/compare/#{before}...#{after}"
end
message
end
end
...@@ -54,4 +54,23 @@ class GitlabCiService < Service ...@@ -54,4 +54,23 @@ class GitlabCiService < Service
def status_img_path def status_img_path
project_url + "/status.png?ref=" + project.default_branch project_url + "/status.png?ref=" + project.default_branch
end end
def title
'GitLab CI'
end
def description
'Continuous integration server from GitLab'
end
def to_param
'gitlab_ci'
end
def fields
[
{ type: 'text', name: 'token', placeholder: 'GitLab CI project specific token' },
{ type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3'}
]
end
end end
...@@ -45,9 +45,11 @@ class Project < ActiveRecord::Base ...@@ -45,9 +45,11 @@ class Project < ActiveRecord::Base
has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id' has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id'
has_one :gitlab_ci_service, dependent: :destroy has_one :gitlab_ci_service, dependent: :destroy
has_one :campfire_service, dependent: :destroy
has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id"
has_one :forked_from_project, through: :forked_project_link has_one :forked_from_project, through: :forked_project_link
has_many :services, dependent: :destroy
has_many :events, dependent: :destroy has_many :events, dependent: :destroy
has_many :merge_requests, dependent: :destroy has_many :merge_requests, dependent: :destroy
has_many :issues, dependent: :destroy, order: "state DESC, created_at DESC" has_many :issues, dependent: :destroy, order: "state DESC, created_at DESC"
...@@ -223,8 +225,18 @@ class Project < ActiveRecord::Base ...@@ -223,8 +225,18 @@ class Project < ActiveRecord::Base
self.issues_enabled && !self.used_default_issues_tracker? self.issues_enabled && !self.used_default_issues_tracker?
end end
def services def build_missing_services
[gitlab_ci_service].compact available_services_names.each do |service_name|
service = services.find { |service| service.to_param == service_name }
# If service is available but missing in db
# we should create an instance. Ex `create_gitlab_ci_service`
service = self.send :"create_#{service_name}_service" if service.nil?
end
end
def available_services_names
%w(gitlab_ci campfire)
end end
def gitlab_ci? def gitlab_ci?
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
# project_url :string(255) # project_url :string(255)
# #
# To add new service you should build a class inherited from Service
# and implement a set of methods
class Service < ActiveRecord::Base class Service < ActiveRecord::Base
attr_accessible :title, :token, :type, :active attr_accessible :title, :token, :type, :active
...@@ -24,4 +26,25 @@ class Service < ActiveRecord::Base ...@@ -24,4 +26,25 @@ class Service < ActiveRecord::Base
def activated? def activated?
active active
end end
def title
# implement inside child
end
def description
# implement inside child
end
def to_param
# implement inside child
end
def fields
# implement inside child
[]
end
def execute
# implement inside child
end
end end
%h3.page_title %h3.page_title
GitLab CI - if @service.activated?
%small Continuous integration server from GitLab %span.cgreen
.pull-right %i.icon-circle
- if @service.active - else
%small.cgreen Enabled %span.cgray
- else %i.icon-circle-blank
%small.cgray Disabled = @service.title
%p= @service.description
.back_link .back_link
= link_to project_services_path(@project) do = link_to project_services_path(@project) do
&larr; to services &larr; to services
%hr %hr
= form_for(@service, :as => :service, :url => project_service_path(@project, :gitlab_ci), :method => :put) do |f|
= form_for(@service, as: :service, url: project_service_path(@project, @service.to_param), method: :put) do |f|
- if @service.errors.any? - if @service.errors.any?
.alert.alert-error .alert.alert-error
%ul %ul
...@@ -27,20 +28,21 @@ ...@@ -27,20 +28,21 @@
.controls .controls
= f.check_box :active = f.check_box :active
.control-group - @service.fields.each do |field|
= f.label :project_url, "Project URL", class: "control-label" - name = field[:name]
.controls - type = field[:type]
= f.text_field :project_url, class: "input-xlarge", placeholder: "http://ci.gitlabhq.com/projects/3" - placeholder = field[:placeholder]
.control-group
= f.label :token, class: "control-label" do
CI Project token
.controls
= f.text_field :token, class: "input-xlarge", placeholder: "GitLab CI project specific token"
.control-group
= f.label name, class: "control-label"
.controls
- if type == 'text'
= f.text_field name, class: "input-xlarge", placeholder: placeholder
- elsif type == 'checkbox'
= f.check_box name
.form-actions .form-actions
= f.submit 'Save', class: 'btn btn-save' = f.submit 'Save', class: 'btn btn-save'
&nbsp; &nbsp;
- if @service.valid? && @service.active - if @service.valid? && @service.activated?
= link_to 'Test settings', test_project_service_path(@project), class: 'btn btn-small' = link_to 'Test settings', test_project_service_path(@project, @service.to_param), class: 'btn btn-small'
= render "projects/settings_nav" = render "projects/settings_nav"
= render 'gitlab_ci' = render 'form'
...@@ -3,30 +3,16 @@ ...@@ -3,30 +3,16 @@
%h3.page_title Services %h3.page_title Services
%br %br
%ul.ui-box.well-list %ul.bordered-list
%li - @services.each do |service|
%h4.cgreen %li
= link_to edit_project_service_path(@project, :gitlab_ci) do %h4
GitLab CI - if service.activated?
%small Continuous integration server from GitLab %span.cgreen
.pull-right %i.icon-circle
- if @gitlab_ci_service.try(:active)
%small.cgreen
%i.icon-ok
Enabled
- else - else
%small.cgray %span.cgray
%i.icon-off %i.icon-circle-blank
Disabled = link_to edit_project_service_path(@project, service.to_param) do
%li.disabled = service.title
%h4 %p= service.description
Jenkins CI
%small An extendable open source continuous integration server
.pull-right
%small Not implemented yet
%li.disabled
%h4
Campfire
%small Web-based group chat tool
.pull-right
%small Not implemented yet
class AddMoreFieldsToService < ActiveRecord::Migration
def change
add_column :services, :subdomain, :string
add_column :services, :room, :string
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20130506095501) do ActiveRecord::Schema.define(:version => 20130522141856) do
create_table "deploy_keys_projects", :force => true do |t| create_table "deploy_keys_projects", :force => true do |t|
t.integer "deploy_key_id", :null => false t.integer "deploy_key_id", :null => false
...@@ -194,6 +194,8 @@ ActiveRecord::Schema.define(:version => 20130506095501) do ...@@ -194,6 +194,8 @@ ActiveRecord::Schema.define(:version => 20130506095501) do
t.datetime "updated_at", :null => false t.datetime "updated_at", :null => false
t.boolean "active", :default => false, :null => false t.boolean "active", :default => false, :null => false
t.string "project_url" t.string "project_url"
t.string "subdomain"
t.string "room"
end end
add_index "services", ["project_id"], :name => "index_services_on_project_id" add_index "services", ["project_id"], :name => "index_services_on_project_id"
......
...@@ -9,7 +9,7 @@ class ProjectServices < Spinach::FeatureSteps ...@@ -9,7 +9,7 @@ class ProjectServices < Spinach::FeatureSteps
Then 'I should see list of available services' do Then 'I should see list of available services' do
page.should have_content 'Services' page.should have_content 'Services'
page.should have_content 'Jenkins' page.should have_content 'Campfire'
page.should have_content 'GitLab CI' page.should have_content 'GitLab CI'
end end
...@@ -19,12 +19,12 @@ class ProjectServices < Spinach::FeatureSteps ...@@ -19,12 +19,12 @@ class ProjectServices < Spinach::FeatureSteps
And 'I fill gitlab-ci settings' do And 'I fill gitlab-ci settings' do
check 'Active' check 'Active'
fill_in 'Project URL', with: 'http://ci.gitlab.org/projects/3' fill_in 'Project url', with: 'http://ci.gitlab.org/projects/3'
fill_in 'CI Project token', with: 'verySecret' fill_in 'Token', with: 'verySecret'
click_button 'Save' click_button 'Save'
end end
Then 'I should see service settings saved' do Then 'I should see service settings saved' do
find_field('Project URL').value.should == 'http://ci.gitlab.org/projects/3' find_field('Project url').value.should == 'http://ci.gitlab.org/projects/3'
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment