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; }
@include border-radius(4px);
border:1px solid #ccc;
}
+
+fieldset legend { font-size: 17px; }
--- /dev/null
+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
--- /dev/null
+# == 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
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
#
class Service < ActiveRecord::Base
- attr_accessible :title, :token, :type
+ attr_accessible :title, :token, :type, :active
belongs_to :project
has_one :service_hook
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
= 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
--- /dev/null
+%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'
--- /dev/null
+= render "projects/project_head"
+= render 'gitlab_ci'
--- /dev/null
+= 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'
+
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]
--- /dev/null
+class AddActiveToService < ActiveRecord::Migration
+ def change
+ add_column :services, :active, :boolean, default: false, null: false
+ end
+end
--- /dev/null
+class AddProjectUrlToService < ActiveRecord::Migration
+ def change
+ add_column :services, :project_url, :string, null: true
+ end
+end
#
# 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"
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|