gitlab-org--gitlab-foss/app/models/project_services/gitlab_ci_service.rb

148 lines
3.5 KiB
Ruby
Raw Normal View History

2012-11-19 14:34:05 -05:00
# == Schema Information
#
# Table name: services
#
2015-03-04 17:14:00 -05:00
# id :integer not null, primary key
# type :string(255)
# title :string(255)
# project_id :integer
# created_at :datetime
# updated_at :datetime
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
# push_events :boolean default(TRUE)
# issues_events :boolean default(TRUE)
# merge_requests_events :boolean default(TRUE)
# tag_push_events :boolean default(TRUE)
2015-05-03 12:05:38 -04:00
# note_events :boolean default(TRUE), not null
2012-11-19 14:34:05 -05:00
#
class GitlabCiService < CiService
2015-04-06 09:36:56 -04:00
API_PREFIX = "api/v1"
2014-09-07 20:54:18 -04:00
prop_accessor :project_url, :token
2012-11-20 07:16:04 -05:00
validates :project_url, presence: true, if: :activated?
validates :token, presence: true, if: :activated?
2012-11-19 14:34:05 -05:00
2012-11-20 07:16:04 -05:00
after_save :compose_service_hook, if: :activated?
2012-11-19 14:34:05 -05:00
def compose_service_hook
hook = service_hook || build_service_hook
hook.url = [project_url, "/build", "?token=#{token}"].join("")
hook.save
end
2012-11-20 12:34:05 -05:00
def supported_events
%w(push tag_push)
end
def execute(data)
return unless supported_events.include?(data[:object_kind])
sha = data[:checkout_sha]
if sha.present?
file = ci_yaml_file(sha)
if file && file.data
data.merge!(ci_yaml_file: file.data)
end
end
service_hook.execute(data)
end
2015-03-05 09:58:04 -05:00
def commit_status_path(sha, ref)
2015-05-05 06:51:25 -04:00
URI::encode(project_url + "/refs/#{ref}/commits/#{sha}/status.json?token=#{token}")
end
2015-03-05 09:58:04 -05:00
def get_ci_build(sha, ref)
@ci_builds ||= {}
2015-03-05 09:58:04 -05:00
@ci_builds[sha] ||= HTTParty.get(commit_status_path(sha, ref), verify: false)
end
2015-03-05 09:58:04 -05:00
def commit_status(sha, ref)
response = get_ci_build(sha, ref)
if response.code == 200 and response["status"]
response["status"]
else
:error
end
end
2015-04-06 09:36:56 -04:00
def fork_registration(new_project, private_token)
2015-04-06 08:20:58 -04:00
params = {
id: new_project.id,
name_with_namespace: new_project.name_with_namespace,
web_url: new_project.web_url,
default_branch: new_project.default_branch,
ssh_url_to_repo: new_project.ssh_url_to_repo
}
HTTParty.post(
2015-04-06 09:36:56 -04:00
fork_registration_path,
2015-04-06 08:20:58 -04:00
body: {
project_id: project.id,
project_token: token,
2015-04-06 09:36:56 -04:00
private_token: private_token,
data: params },
2015-04-06 08:20:58 -04:00
verify: false
)
end
2015-03-05 09:58:04 -05:00
def commit_coverage(sha, ref)
response = get_ci_build(sha, ref)
if response.code == 200 and response["coverage"]
response["coverage"]
end
end
2015-03-05 09:58:04 -05:00
def build_page(sha, ref)
2015-05-05 06:51:25 -04:00
URI::encode(project_url + "/refs/#{ref}/commits/#{sha}")
end
def builds_path
project_url + "?ref=" + project.default_branch
end
def status_img_path
project_url + "/status.png?ref=" + project.default_branch
end
2013-05-22 09:58:44 -04:00
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' }
2013-05-22 09:58:44 -04:00
]
end
2015-04-06 09:36:56 -04:00
private
def ci_yaml_file(sha)
repository.blob_at(sha, '.gitlab-ci.yml')
end
2015-04-06 09:36:56 -04:00
def fork_registration_path
project_url.sub(/projects\/\d*/, "#{API_PREFIX}/forks")
end
def repository
project.repository
end
2012-11-19 14:34:05 -05:00
end