buildkite_service.rb 3.06 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
Keith Pitt's avatar
Keith Pitt committed
19
#
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
20

21 22
require "addressable/uri"

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

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

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

  after_save :compose_service_hook, if: :activated?

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

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

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

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

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

Valery Sizov's avatar
Valery Sizov committed
54
  def commit_status(sha, ref)
Keith Pitt's avatar
Keith Pitt committed
55 56 57 58 59 60 61 62 63 64
    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)
65
    "#{buildkite_endpoint('gitlab')}/status/#{status_token}.json?commit=#{sha}"
Keith Pitt's avatar
Keith Pitt committed
66 67
  end

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

  def builds_path
    "#{project_url}/builds?branch=#{project.default_branch}"
  end

  def status_img_path
77
    "#{buildkite_endpoint('badge')}/#{status_token}.svg"
Keith Pitt's avatar
Keith Pitt committed
78 79 80
  end

  def title
81
    'Buildkite'
Keith Pitt's avatar
Keith Pitt committed
82 83 84 85 86 87 88
  end

  def description
    'Continuous integration and deployments'
  end

  def to_param
89
    'buildkite'
Keith Pitt's avatar
Keith Pitt committed
90 91 92 93 94 95
  end

  def fields
    [
      { type: 'text',
        name: 'token',
96
        placeholder: 'Buildkite project GitLab token' },
Keith Pitt's avatar
Keith Pitt committed
97 98 99

      { type: 'text',
        name: 'project_url',
100 101 102 103 104
        placeholder: "#{ENDPOINT}/example/project" },
      
      { type: 'checkbox',
        name: 'enable_ssl_verification',
        title: "Enable SSL verification" }
Keith Pitt's avatar
Keith Pitt committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
    ]
  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

126
  def buildkite_endpoint(subdomain = nil)
Keith Pitt's avatar
Keith Pitt committed
127
    if subdomain.present?
128
      uri = Addressable::URI.parse(ENDPOINT)
Keith Pitt's avatar
Keith Pitt committed
129 130 131 132 133 134 135 136
      new_endpoint = "#{uri.scheme || 'http'}://#{subdomain}.#{uri.host}"

      if uri.port.present?
        "#{new_endpoint}:#{uri.port}"
      else
        new_endpoint
      end
    else
137
      ENDPOINT
Keith Pitt's avatar
Keith Pitt committed
138 139 140
    end
  end
end