OSDN Git Service

GitLabCi Service imtegration
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Mon, 19 Nov 2012 19:34:05 +0000 (22:34 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Mon, 19 Nov 2012 19:34:05 +0000 (22:34 +0300)
16 files changed:
app/assets/images/service-disabled-gitlab-ci.png [new file with mode: 0644]
app/assets/images/service-gitlab-ci.png
app/assets/stylesheets/gitlab_bootstrap/common.scss
app/controllers/services_controller.rb [new file with mode: 0644]
app/models/gitlab_ci_service.rb [new file with mode: 0644]
app/models/project.rb
app/models/service.rb
app/roles/push_observer.rb
app/views/projects/_project_head.html.haml
app/views/services/_gitlab_ci.html.haml [new file with mode: 0644]
app/views/services/edit.html.haml [new file with mode: 0644]
app/views/services/index.html.haml [new file with mode: 0644]
config/routes.rb
db/migrate/20121120103700_add_active_to_service.rb [new file with mode: 0644]
db/migrate/20121120113838_add_project_url_to_service.rb [new file with mode: 0644]
db/schema.rb

diff --git a/app/assets/images/service-disabled-gitlab-ci.png b/app/assets/images/service-disabled-gitlab-ci.png
new file mode 100644 (file)
index 0000000..8d1f9d0
Binary files /dev/null and b/app/assets/images/service-disabled-gitlab-ci.png differ
index afaa10d..bcb30a3 100644 (file)
Binary files a/app/assets/images/service-gitlab-ci.png and b/app/assets/images/service-gitlab-ci.png differ
index 25c355e..bef0780 100644 (file)
@@ -73,6 +73,7 @@ img.avatar.s16 { width:16px; height:16px; margin-right:6px; }
 img.avatar.s24 { width:24px; height:24px; margin-right:8px; }
 img.avatar.s32 { width:32px; height:32px; margin-right:10px; }
 img.lil_av { padding-left: 4px; padding-right:3px; }
+img.small { width: 80px; }
 
 /** HELPERS **/
 .nothing_here_message { text-align:center; padding:20px; color:#777; }
@@ -87,3 +88,5 @@ input[type='search'].search-text-input {
   @include border-radius(4px);
   border:1px solid #ccc;
 }
+
+fieldset legend { font-size: 17px; }
diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb
new file mode 100644 (file)
index 0000000..b0fd774
--- /dev/null
@@ -0,0 +1,37 @@
+class ServicesController < ProjectResourceController
+  # Authorize
+  before_filter :authorize_admin_project!
+
+  respond_to :html
+
+  def index
+    @gitlab_ci_service = @project.gitlab_ci_service
+  end
+
+  def edit
+    @service = @project.gitlab_ci_service
+
+    # Create if missing
+    @service = @project.create_gitlab_ci_service unless @service
+  end
+
+  def update
+    @service = @project.gitlab_ci_service
+
+    if @service.update_attributes(params[:service])
+      redirect_to :back
+    else
+      render 'edit'
+    end
+  end
+
+  def test
+    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)
+
+    @service = project.gitlab_ci_service
+    @service.execute(data)
+
+    redirect_to :back
+  end
+end
diff --git a/app/models/gitlab_ci_service.rb b/app/models/gitlab_ci_service.rb
new file mode 100644 (file)
index 0000000..f5734dc
--- /dev/null
@@ -0,0 +1,29 @@
+# == 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
+#
+
+class GitlabCiService < Service
+  attr_accessible :project_url
+
+  validates :project_url, presence: true
+  validates :token, presence: true
+
+  delegate :execute, to: :service_hook, prefix: nil
+
+  after_save :compose_service_hook
+
+  def compose_service_hook
+    hook = service_hook || build_service_hook
+    hook.url = [project_url, "/build", "?token=#{token}"].join("")
+    hook.save
+  end
+end
index 30b5343..95a2c6c 100644 (file)
@@ -48,6 +48,7 @@ class Project < ActiveRecord::Base
   has_many :protected_branches, dependent: :destroy
   has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id'
   has_many :services, dependent: :destroy
+  has_one :gitlab_ci_service, dependent: :destroy
 
   delegate :name, to: :owner, allow_nil: true, prefix: true
 
index b29f508..70e2970 100644 (file)
@@ -12,7 +12,7 @@
 #
 
 class Service < ActiveRecord::Base
-  attr_accessible :title, :token, :type
+  attr_accessible :title, :token, :type, :active
 
   belongs_to :project
   has_one :service_hook
index f8a8df2..ea9347d 100644 (file)
@@ -56,8 +56,8 @@ module PushObserver
   def execute_services(data)
     services.each do |service|
 
-      # Call service hook for service if it has one
-      service.service_hook.execute if service.service_hook
+      # Call service hook only if it is active
+      service.execute if service.active
     end
   end
 
index 47a7907..9405265 100644 (file)
       = link_to project_hooks_path(@project) do
         %span
         Hooks
+    = nav_link(controller: :services, html_options: {class: 'right'}) do
+      = link_to project_services_path(@project) do
+        %span
+        Services
     = nav_link(path: 'projects#edit', html_options: {class: 'right'}) do
       = link_to edit_project_path(@project), class: "stat-tab tab " do
         %i.icon-edit
diff --git a/app/views/services/_gitlab_ci.html.haml b/app/views/services/_gitlab_ci.html.haml
new file mode 100644 (file)
index 0000000..b2e2add
--- /dev/null
@@ -0,0 +1,42 @@
+%h3.page_title
+  Services &rarr; GitLab CI Integration
+
+  .right
+    .thumbnail
+      - if @service.active
+        = image_tag 'service-gitlab-ci.png', class: 'small'
+      - else
+        = image_tag 'service-disabled-gitlab-ci.png', class: 'small'
+
+%hr
+
+
+= form_for(@service, :as => :service, :url => project_service_path(@project, @service), :method => :put) do |f|
+  - if @service.errors.any?
+    .alert-message.block-message.error
+      %ul
+        - @service.errors.full_messages.each do |msg|
+          %li= msg
+
+
+  .control-group
+    = f.label :active, "Active", class: "control-label"
+    .controls
+      = f.check_box :active
+
+  .control-group
+    = f.label :active, "Project URL", class: "control-label"
+    .controls
+      = f.text_field :project_url, class: "input-xlarge", placeholder: "http://ci.gitlabhq.com/projects/3"
+
+  .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"
+
+
+  .form-actions
+    = f.submit 'Save', class: 'btn save-btn'
+    &nbsp;
+    = link_to 'Test settings', test_project_service_path(@project), class: 'btn btn-small'
diff --git a/app/views/services/edit.html.haml b/app/views/services/edit.html.haml
new file mode 100644 (file)
index 0000000..d893847
--- /dev/null
@@ -0,0 +1,2 @@
+= render "projects/project_head"
+= render 'gitlab_ci'
diff --git a/app/views/services/index.html.haml b/app/views/services/index.html.haml
new file mode 100644 (file)
index 0000000..3894fce
--- /dev/null
@@ -0,0 +1,15 @@
+= render "projects/project_head"
+%h3.page_title Services
+%hr
+
+.row
+  .span6
+    .padded
+      %p.slead Continuous integration server from GitLab
+      .thumbnail.left
+        = link_to edit_project_service_path(@project, :gitlab_ci) do
+          - if @gitlab_ci_service.try :active
+            = image_tag 'service-gitlab-ci.png'
+          - else
+            = image_tag 'service-disabled-gitlab-ci.png'
+
index bf76286..98cf7e8 100644 (file)
@@ -133,6 +133,12 @@ Gitlab::Application.routes.draw do
       end
     end
 
+    resources :services, constraints: { id: /[^\/]+/ }, only: [:index, :edit, :update] do
+      member do
+        get :test
+      end
+    end
+
     resources :deploy_keys
     resources :protected_branches, only: [:index, :create, :destroy]
 
diff --git a/db/migrate/20121120103700_add_active_to_service.rb b/db/migrate/20121120103700_add_active_to_service.rb
new file mode 100644 (file)
index 0000000..f45ef52
--- /dev/null
@@ -0,0 +1,5 @@
+class AddActiveToService < ActiveRecord::Migration
+  def change
+    add_column :services, :active, :boolean, default: false, null: false
+  end
+end
diff --git a/db/migrate/20121120113838_add_project_url_to_service.rb b/db/migrate/20121120113838_add_project_url_to_service.rb
new file mode 100644 (file)
index 0000000..13ffbdb
--- /dev/null
@@ -0,0 +1,5 @@
+class AddProjectUrlToService < ActiveRecord::Migration
+  def change
+    add_column :services, :project_url, :string, null: true
+  end
+end
index b115427..27b1f4a 100644 (file)
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20121120051432) do
+ActiveRecord::Schema.define(:version => 20121120113838) do
 
   create_table "events", :force => true do |t|
     t.string   "target_type"
@@ -131,9 +131,11 @@ ActiveRecord::Schema.define(:version => 20121120051432) do
     t.string   "type"
     t.string   "title"
     t.string   "token"
-    t.integer  "project_id", :null => false
-    t.datetime "created_at", :null => false
-    t.datetime "updated_at", :null => false
+    t.integer  "project_id",                     :null => false
+    t.datetime "created_at",                     :null => false
+    t.datetime "updated_at",                     :null => false
+    t.boolean  "active",      :default => false, :null => false
+    t.string   "project_url"
   end
 
   create_table "snippets", :force => true do |t|