aboutsummaryrefslogtreecommitdiffstats
path: root/webapp.rb
blob: d90f7ca94c06eee8feb92c41fbdf0e04aa93213a (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
require "sinatra"
require_relative "nyacommon"
require_relative "config"

include ERB::Util

Thread.report_on_exception = true
$queue = Queue.new
Thread.new {
  while item = $queue.pop
    system("ruby", File.expand_path("../nyabuild.rb", __FILE__),
           item[0], item[1])
  end
}

get "/" do
  @projects = NyaConfig.projects.keys
  erb :index
end

get "/robots.txt" do
  <<~END
    User-agent: *
    Disallow: /
  END
end

get "/:project" do |project|
  halt 400 unless NyaUtils.valid_as_id?(project)

  @jobs = NyaUtils.find_jobs_for_project(project).take(20).map { |jobid|
    pats = NyaUtils.find_logs_for_job(project, jobid).map { |name|
      meta = NyaUtils.read_log_meta(project, jobid, name)

      [name, meta]
    }

    [jobid, pats]
  }
  erb :project
end

get "/:project/:jobid" do |project, jobid|
  halt 400 unless NyaUtils.valid_as_id?(project, jobid)

  @patterns = NyaUtils.find_logs_for_job(project, jobid).map { |name|
    meta = NyaUtils.read_log_meta(project, jobid, name)
    [name, meta]
  }

  erb :job
end

get "/:project/:jobid/:pattern" do |project, jobid, pattern|
  halt 400 unless NyaUtils.valid_as_id?(project, jobid, pattern)

  @logid = "#{project}/#{jobid}/#{pattern}"
  @log = NyaUtils.open_log(project, jobid, pattern, &:read).force_encoding("UTF-8").scrub

  erb :log
end

post "/:project" do |project|
  halt 401 unless NyaUtils.equal_str?(NyaConfig.secret, params[:secret])
  halt 400 unless NyaUtils.valid_as_id?(project) && params[:branch]
  halt 404 unless NyaConfig.project(project.intern)

  $queue << [project, params[:branch]]
  "queued"
end

__END__
@@ layout
<!DOCTYPE html>
<meta charset=UTF-8>
<meta name=viewport content="width=device-width,initial-scale=1">
<title>ci.rhe.jp</title>
<style>
.unknown { color: gray; }
.success { color: green; }
.failure { color: red; }
</style>
<!--
   ∧,,,∧
  (     )
-->
<%= yield %>

@@ index
<h1>Projects</h1>
<ul>
  <% @projects.each do |proj| %>
  <li><a href="/<%=h proj %>"><%=h proj %></a>
  <% end %>
</ul>

@@ project
<h1><%=h params[:project] %></h1>
<% @jobs.each do |jobid, pats| %>
<h2><%=h jobid %></h2>
<ul>
<% pats.each do |pat, meta| %>
<li><span class="<%=h meta[:result]&.chomp || "unknown" %>">
      <%=h meta[:result]&.chomp || "unknown" %></span>
    <span><%=h meta[:time] ? "%.2fs" % meta[:time].to_f : "-" %></span>
    <a href="/<%=h params[:project] %>/<%=h jobid %>/<%=h pat %>"><%=h pat %></a>
<% end %>
</ul>
<% end %>

@@ job
<h1><%=h params[:project] %>/<%=h params[:jobid] %></h1>
<ul>
<% @patterns.each do |pat, meta| %>
<li><span class="<%=h meta[:result]&.chomp || "unknown" %>">
      <%=h meta[:result]&.chomp || "unknown" %></span>
    <span><%=h meta[:time] ? "%.2fs" % meta[:time].to_f : "-" %></span>
    <a href="/<%=h params[:project] %>/<%=h params[:jobid] %>/<%=h pat %>"
      ><%=h pat %></a>
<% end %>
</ul>

@@ log
<h1><%=h @logid %></h1>
<pre><%=h @log %></pre>