Class: TeamcityService

Inherits:
CiService show all
Includes:
HTTParty
Defined in:
app/models/project_services/teamcity_service.rb

Overview

Schema Information

Table name: services

id                    :integer          not null, primary key
type                  :string
title                 :string
project_id            :integer
created_at            :datetime         not null
updated_at            :datetime         not null
active                :boolean          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)
note_events           :boolean          default(TRUE), not null
build_events          :boolean          default(FALSE), not null
category              :string           default("common"), not null
default               :boolean          default(FALSE)
wiki_page_events      :boolean          default(TRUE)

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from CiService

#commit_page, #merge_request_page, #merge_request_status, #valid_token?

Methods inherited from Service

#activated?, #async_execute, available_services_names, boolean_accessor, #can_test?, #category, create_from_template, #initialize_properties, #issue_tracker?, prop_accessor, #reset_updated_properties, #template?, #test, #updated_properties

Instance Attribute Details

#responseObject

Returns the value of attribute response


39
40
41
# File 'app/models/project_services/teamcity_service.rb', line 39

def response
  @response
end

Instance Method Details

#build_info(sha) ⇒ Object


90
91
92
93
94
95
96
97
98
99
100
# File 'app/models/project_services/teamcity_service.rb', line 90

def build_info(sha)
  url = URI.join(
    teamcity_url,
    "/httpAuth/app/rest/builds/branch:unspecified:any,number:#{sha}"
  ).to_s
  auth = {
    username: username,
    password: password
  }
  @response = HTTParty.get(url, verify: false, basic_auth: auth)
end

#build_page(sha, ref) ⇒ Object


102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'app/models/project_services/teamcity_service.rb', line 102

def build_page(sha, ref)
  build_info(sha) if @response.nil? || !@response.code

  if @response.code != 200
    # If actual build link can't be determined,
    # send user to build summary page.
    URI.join(teamcity_url, "/viewLog.html?buildTypeId=#{build_type}").to_s
  else
    # If actual build link is available, go to build result page.
    built_id = @response['build']['id']
    URI.join(
      teamcity_url,
      "/viewLog.html?buildId=#{built_id}&buildTypeId=#{build_type}"
    ).to_s
  end
end

#commit_status(sha, ref) ⇒ Object


119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'app/models/project_services/teamcity_service.rb', line 119

def commit_status(sha, ref)
  build_info(sha) if @response.nil? || !@response.code
  return :error unless @response.code == 200 || @response.code == 404

  status = if @response.code == 404
             'Pending'
           else
             @response['build']['status']
           end

  if status.include?('SUCCESS')
    'success'
  elsif status.include?('FAILURE')
    'failed'
  elsif status.include?('Pending')
    'pending'
  else
    :error
  end
end

#compose_service_hookObject


44
45
46
47
# File 'app/models/project_services/teamcity_service.rb', line 44

def compose_service_hook
  hook = service_hook || build_service_hook
  hook.save
end

#descriptionObject


59
60
61
# File 'app/models/project_services/teamcity_service.rb', line 59

def description
  'A continuous integration and build server'
end

#execute(data) ⇒ Object


140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'app/models/project_services/teamcity_service.rb', line 140

def execute(data)
  return unless supported_events.include?(data[:object_kind])

  auth = {
    username: username,
    password: password,
  }

  branch = Gitlab::Git.ref_name(data[:ref])

  self.class.post(
    URI.join(teamcity_url, '/httpAuth/app/rest/buildQueue').to_s,
    body: "<build branchName=\"#{branch}\">"\
          "<buildType id=\"#{build_type}\"/>"\
          '</build>',
    headers: { 'Content-type' => 'application/xml' },
    basic_auth: auth
  )
end

#fieldsObject


78
79
80
81
82
83
84
85
86
87
88
# File 'app/models/project_services/teamcity_service.rb', line 78

def fields
  [
    { type: 'text', name: 'teamcity_url',
      placeholder: 'TeamCity root URL like https://teamcity.example.com' },
    { type: 'text', name: 'build_type',
      placeholder: 'Build configuration ID' },
    { type: 'text', name: 'username',
      placeholder: 'A user with permissions to trigger a manual build' },
    { type: 'password', name: 'password' },
  ]
end

#helpObject


63
64
65
66
67
68
# File 'app/models/project_services/teamcity_service.rb', line 63

def help
  'The build configuration in Teamcity must use the build format '\
  'number %build.vcs.number% '\
  'you will also want to configure monitoring of all branches so merge '\
  'requests build, that setting is in the vsc root advanced settings.'
end

#reset_passwordObject


49
50
51
52
53
# File 'app/models/project_services/teamcity_service.rb', line 49

def reset_password
  if teamcity_url_changed? && !password_touched?
    self.password = nil
  end
end

#supported_eventsObject


74
75
76
# File 'app/models/project_services/teamcity_service.rb', line 74

def supported_events
  %w(push)
end

#titleObject


55
56
57
# File 'app/models/project_services/teamcity_service.rb', line 55

def title
  'JetBrains TeamCity CI'
end

#to_paramObject


70
71
72
# File 'app/models/project_services/teamcity_service.rb', line 70

def to_param
  'teamcity'
end