From: Dmitriy Zaporozhets Date: Mon, 19 Nov 2012 19:34:05 +0000 (+0300) Subject: GitLabCi Service imtegration X-Git-Tag: v3.1.0~28 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=406a0c809b3c10d8fb2754cf626094b98ee78aeb;p=wvm%2Fgitlab.git GitLabCi Service imtegration --- diff --git a/app/assets/images/service-disabled-gitlab-ci.png b/app/assets/images/service-disabled-gitlab-ci.png new file mode 100644 index 000000000..8d1f9d0b5 Binary files /dev/null and b/app/assets/images/service-disabled-gitlab-ci.png differ diff --git a/app/assets/images/service-gitlab-ci.png b/app/assets/images/service-gitlab-ci.png index afaa10d02..bcb30a3fb 100644 Binary files a/app/assets/images/service-gitlab-ci.png and b/app/assets/images/service-gitlab-ci.png differ diff --git a/app/assets/stylesheets/gitlab_bootstrap/common.scss b/app/assets/stylesheets/gitlab_bootstrap/common.scss index 25c355e90..bef0780f3 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/common.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/common.scss @@ -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 index 000000000..b0fd77424 --- /dev/null +++ b/app/controllers/services_controller.rb @@ -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 index 000000000..f5734dc28 --- /dev/null +++ b/app/models/gitlab_ci_service.rb @@ -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 diff --git a/app/models/project.rb b/app/models/project.rb index 30b534315..95a2c6c9f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -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 diff --git a/app/models/service.rb b/app/models/service.rb index b29f5089a..70e297012 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -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 diff --git a/app/roles/push_observer.rb b/app/roles/push_observer.rb index f8a8df237..ea9347d08 100644 --- a/app/roles/push_observer.rb +++ b/app/roles/push_observer.rb @@ -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 diff --git a/app/views/projects/_project_head.html.haml b/app/views/projects/_project_head.html.haml index 47a790735..940526506 100644 --- a/app/views/projects/_project_head.html.haml +++ b/app/views/projects/_project_head.html.haml @@ -21,6 +21,10 @@ = 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 index 000000000..b2e2add3c --- /dev/null +++ b/app/views/services/_gitlab_ci.html.haml @@ -0,0 +1,42 @@ +%h3.page_title + Services → 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' +   + = 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 index 000000000..d893847f1 --- /dev/null +++ b/app/views/services/edit.html.haml @@ -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 index 000000000..3894fcee3 --- /dev/null +++ b/app/views/services/index.html.haml @@ -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' + diff --git a/config/routes.rb b/config/routes.rb index bf7628654..98cf7e812 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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 index 000000000..f45ef52e6 --- /dev/null +++ b/db/migrate/20121120103700_add_active_to_service.rb @@ -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 index 000000000..13ffbdb19 --- /dev/null +++ b/db/migrate/20121120113838_add_project_url_to_service.rb @@ -0,0 +1,5 @@ +class AddProjectUrlToService < ActiveRecord::Migration + def change + add_column :services, :project_url, :string, null: true + end +end diff --git a/db/schema.rb b/db/schema.rb index b11542704..27b1f4aa8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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|