aboutsummaryrefslogtreecommitdiffstats
path: root/notification.rb
blob: f8dd526adb04f7861466c688b3265ffda7e1bc32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
require "net/smtp"
require "uri"
require "time"

class Notification
  def initialize(email: nil)
    @list = []
    @list << Email.new(email) if email
  end

  def publish(*args)
    # FIXME
    @list.each { |t| t.publish(*args) }
  end

  class Email
    def initialize(smtp_server:, from:, to:)
      @smtp_server = URI.parse(smtp_server)
      @from = from
      @to = to
    end

    def finish(subject, body, id)
      Net::SMTP.start(@smtp_server.host, @smtp_server.port) { |smtp|
        smtp.send_message(<<~EOF, @from, @to)
          From: nyaci <#{@from}>
          To: #{@to}
          Date: #{Time.now.rfc2822}
          Subject: #{subject.delete("\r\n")}
          Message-Id: <nyaci-#{id}@#{@smtp_server.host}>

          #{body.gsub(/(?<!\r)\n/, "\r\n")}
        EOF
      }
    end

    def publish(project, jobid, results)
      prefix = "[NyaCI] [#{project}/#{jobid}]"

      results.sort_by! { |id, result| id }
      failed = results.count { |id, result| !result }
      if failed == 0
        subject = prefix + " success"
        body = <<~EOM
          All test cases passed successfully:

          #{results.map { |id, res| "- #{id}" }.join("\n")}

          #{NyaConfig.webroot + "/" + project + "/" + jobid}
        EOM
      else
        subject = prefix + " #{failed}/#{results.size} failed"
        body = <<~EOM
          The following test cases failed:

          #{results.select { |id, res| !res }
              .map { |id, res| "- #{id}" }.join("\n")}

          The rest cases passed:

          #{results.select { |id, res| res }
              .map { |id, res| "- #{id}" }.join("\n")}

          #{NyaConfig.webroot + "/" + project + "/" + jobid}
        EOM
      end

      finish(subject, body, jobid)
    end
  end
end