class Jenkins

Public Class Methods

new(settings, client, project, data) click to toggle source
# File lib/tutter/action/jenkins.rb, line 2
def initialize(settings, client, project, data)
  @settings = settings || {}
  @client = client
  @project = project
  @data = data
  @merge_request_comment = @settings['merge_request_comment']
  @merge_request_comment ||= 'merge, my change is covered by tests'
end

Public Instance Methods

run() click to toggle source
# File lib/tutter/action/jenkins.rb, line 11
def run
  pull_request_id = @data['issue']['number']
  puts "pull request id: #{pull_request_id}"

  if @data['issue']['state'] != 'open'
    puts "The issue state is #{@data['issue']['state']}"
    return false
  end

  comments = @client.issue_comments(@project, pull_request_id)
  last_comment = comments.last

  asked_to_merge = last_comment && last_comment.body.strip.downcase == @merge_request_comment.strip.downcase
  unless asked_to_merge
    puts "not asked to merge"
    return false
  end

  pr = @client.pull_request @project, pull_request_id

  unless pr.mergeable
    @client.add_comment(@project, pull_request_id, "Please rebase your change, pull request is not mergeable")
    return false
  end

  last_commit = @client.pull_request_commits(@project, pull_request_id).last
  last_commit_date = last_commit.commit.committer.date

  if last_comment.created_at < last_commit_date
    @client.add_comment(@project, pull_request_id, "Please reopen pull request, found a new commit")
    return false
  end

  jenkins_last_comment = @client.issue_comments(@project, pull_request_id).select{|c| c.attrs[:user].attrs[:login] == 'dnsjenkins-bot'}.last
  jenkins_allows_merge = jenkins_last_comment && jenkins_last_comment.body =~ /PASS/

  if jenkins_allows_merge
    puts "merging #{pull_request_id} #{@project}"
    @client.merge_pull_request(@project, pull_request_id, 'ok, shipping!')
  else
    @client.add_comment(@project, pull_request_id, "Please make sure tests pass")
  end
end