buildkite_service.rb 2.96 KB
Newer Older
Keith Pitt's avatar
Keith Pitt committed
1 2 3 4
# == Schema Information
#
# Table name: services
#
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
5 6 7 8 9 10 11 12 13
#  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)
14 15 16 17
#  push_events           :boolean          default(TRUE)
#  issues_events         :boolean          default(TRUE)
#  merge_requests_events :boolean          default(TRUE)
#  tag_push_events       :boolean          default(TRUE)
18
#  note_events           :boolean          default(TRUE), not null
Stan Hu's avatar
Stan Hu committed
19
#  build_events          :boolean          default(FALSE), not null
Keith Pitt's avatar
Keith Pitt committed
20
#
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
21

22 23
require "addressable/uri"

24
class BuildkiteService < CiService
25 26
  ENDPOINT = "https://buildkite.com"

27
  prop_accessor :project_url, :token, :enable_ssl_verification
Keith Pitt's avatar
Keith Pitt committed
28 29 30 31 32 33 34

  validates :project_url, presence: true, if: :activated?
  validates :token, presence: true, if: :activated?

  after_save :compose_service_hook, if: :activated?

  def webhook_url
35
    "#{buildkite_endpoint('webhook')}/deliver/#{webhook_token}"
Keith Pitt's avatar
Keith Pitt committed
36 37 38 39 40
  end

  def compose_service_hook
    hook = service_hook || build_service_hook
    hook.url = webhook_url
41
    hook.enable_ssl_verification = !!enable_ssl_verification
Keith Pitt's avatar
Keith Pitt committed
42 43 44
    hook.save
  end

45 46 47 48
  def supported_events
    %w(push)
  end

Keith Pitt's avatar
Keith Pitt committed
49
  def execute(data)
50
    return unless supported_events.include?(data[:object_kind])
51

Keith Pitt's avatar
Keith Pitt committed
52 53 54
    service_hook.execute(data)
  end

Valery Sizov's avatar
Valery Sizov committed
55
  def commit_status(sha, ref)
Keith Pitt's avatar
Keith Pitt committed
56 57 58 59 60 61 62 63 64 65
    response = HTTParty.get(commit_status_path(sha), verify: false)

    if response.code == 200 && response['status']
      response['status']
    else
      :error
    end
  end

  def commit_status_path(sha)
66
    "#{buildkite_endpoint('gitlab')}/status/#{status_token}.json?commit=#{sha}"
Keith Pitt's avatar
Keith Pitt committed
67 68
  end

Valery Sizov's avatar
Valery Sizov committed
69
  def build_page(sha, ref)
Keith Pitt's avatar
Keith Pitt committed
70 71 72 73
    "#{project_url}/builds?commit=#{sha}"
  end

  def title
74
    'Buildkite'
Keith Pitt's avatar
Keith Pitt committed
75 76 77 78 79 80 81
  end

  def description
    'Continuous integration and deployments'
  end

  def to_param
82
    'buildkite'
Keith Pitt's avatar
Keith Pitt committed
83 84 85 86 87 88
  end

  def fields
    [
      { type: 'text',
        name: 'token',
89
        placeholder: 'Buildkite project GitLab token' },
Keith Pitt's avatar
Keith Pitt committed
90 91 92

      { type: 'text',
        name: 'project_url',
93 94 95 96 97
        placeholder: "#{ENDPOINT}/example/project" },
      
      { type: 'checkbox',
        name: 'enable_ssl_verification',
        title: "Enable SSL verification" }
Keith Pitt's avatar
Keith Pitt committed
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
    ]
  end

  private

  def webhook_token
    token_parts.first
  end

  def status_token
    token_parts.second
  end

  def token_parts
    if token.present?
      token.split(':')
    else
      []
    end
  end

119
  def buildkite_endpoint(subdomain = nil)
Keith Pitt's avatar
Keith Pitt committed
120
    if subdomain.present?
121
      uri = Addressable::URI.parse(ENDPOINT)
Keith Pitt's avatar
Keith Pitt committed
122 123 124 125 126 127 128 129
      new_endpoint = "#{uri.scheme || 'http'}://#{subdomain}.#{uri.host}"

      if uri.port.present?
        "#{new_endpoint}:#{uri.port}"
      else
        new_endpoint
      end
    else
130
      ENDPOINT
Keith Pitt's avatar
Keith Pitt committed
131 132 133
    end
  end
end