Skip to content

Commit 008deca

Browse files
authored
feat(front): add project level reports (#311) (#317)
## πŸ“ Description Cherry picked changes from #311 ## βœ… Checklist - [x] I have tested this change - [ ] This change requires documentation update
1 parent 713a02b commit 008deca

File tree

8 files changed

+109
-16
lines changed

8 files changed

+109
-16
lines changed

β€Žfront/assets/js/report/index.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default function ({ config, dom }: { dom: HTMLElement, config: any, }) {
1818
enum ReportContext {
1919
Job = `job`,
2020
Workflow = `workflow`,
21+
Project = `project`,
2122
}
2223

2324
const App = (props: { reportUrl: string, context: ReportContext, }) => {
@@ -77,17 +78,26 @@ const MarkdownBody = (props: { markdown: string, }) => {
7778
};
7879

7980
const ReportInstructions = (props: { context: ReportContext, }) => {
80-
let command = `artifact push workflow -d .semaphore/REPORT.md REPORT.md`;
81-
if (props.context === ReportContext.Job) {
82-
command = `artifact push job -d .semaphore/REPORT.md REPORT.md`;
81+
let command = ``;
82+
83+
switch (props.context) {
84+
case ReportContext.Job:
85+
command = `artifact push job -d .semaphore/REPORT.md REPORT.md`;
86+
break;
87+
case ReportContext.Workflow:
88+
command = `artifact push workflow -d .semaphore/REPORT.md REPORT.md`;
89+
break;
90+
case ReportContext.Project:
91+
command = `artifact push project -d .semaphore/REPORT.md REPORT.md`;
92+
break;
8393
}
8494

8595
return (
8696
<div className="bg-washed-yellow br3 pa3 pa4-m ba b--black-075 w-100">
8797
<div className="pv3-m mw7 center">
8898
<h2 className="f3 mb0">Your Markdown reports will appear here.</h2>
8999
<p className="f4 normal mb4">
90-
These reports help share key details about your job or workflow, like build metrics or custom insights.
100+
These reports help share key details about your {props.context}, like build metrics or custom insights.
91101
</p>
92102
<div className="flex-m">
93103
<div className="flex-shrink-0 dn db-m nl4 ph4">

β€Žfront/lib/front/breadcrumbs/project.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ defmodule Front.Breadcrumbs.Project do
1616
defp construct_crumb(:artifacts), do: "Artifacts"
1717
defp construct_crumb(:scheduler), do: "Scheduler"
1818
defp construct_crumb(:insights), do: "Insights"
19+
defp construct_crumb(:reports), do: "Report"
1920
defp construct_crumb(:deployments), do: "Deployments"
2021
defp construct_crumb(:people), do: "People"
2122
defp construct_crumb(:settings), do: "Settings"

β€Žfront/lib/front_web/controllers/report_controller.ex

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,7 @@ defmodule FrontWeb.ReportController do
44

55
alias Front.Async
66

7-
alias FrontWeb.Plugs.{
8-
FetchPermissions,
9-
Header,
10-
PageAccess,
11-
PutProjectAssigns,
12-
FeatureEnabled
13-
}
7+
alias FrontWeb.Plugs
148

159
alias Front.Models.{
1610
Artifacthub,
@@ -21,11 +15,11 @@ defmodule FrontWeb.ReportController do
2115
Workflow
2216
}
2317

24-
plug(FeatureEnabled, [:ui_reports])
25-
plug(PutProjectAssigns)
26-
plug(FetchPermissions, scope: "project")
27-
plug(PageAccess, permissions: "project.view")
28-
plug(Header when action in [:job, :workflow])
18+
plug(Plugs.FeatureEnabled, [:ui_reports])
19+
plug(Plugs.PutProjectAssigns)
20+
plug(Plugs.FetchPermissions, scope: "project")
21+
plug(Plugs.PageAccess, permissions: "project.view")
22+
plug(Plugs.Header when action in [:job, :workflow, :project])
2923

3024
def job(conn, _params) do
3125
Watchman.benchmark("markdown_report.job", fn ->
@@ -80,6 +74,25 @@ defmodule FrontWeb.ReportController do
8074
end)
8175
end
8276

77+
def project(conn, _params) do
78+
Watchman.benchmark("markdown_report.project", fn ->
79+
project = conn.assigns.project
80+
81+
{assigns, org} =
82+
assign_report_layout(conn, "project", project, %{
83+
base_url: report_url(conn, :project, project.name),
84+
project: project
85+
})
86+
87+
assigns =
88+
assigns
89+
|> project_assigns(org, project)
90+
|> Front.Breadcrumbs.Project.construct(conn, :reports)
91+
92+
render(conn, "markdown.html", assigns)
93+
end)
94+
end
95+
8396
defp assign_report_layout(conn, context, resource, extra_assigns) do
8497
org_id = conn.assigns.organization_id
8598
project = conn.assigns.project
@@ -152,11 +165,31 @@ defmodule FrontWeb.ReportController do
152165
|> Map.put(:title, "Report ・#{project.name}・#{org.name}")
153166
end
154167

168+
defp project_assigns(assigns, org, project) do
169+
user = assigns.user
170+
171+
starred? =
172+
Watchman.benchmark(
173+
"project_page_check_star",
174+
fn ->
175+
Front.Models.User.has_favorite(user.id, org.id, project.id)
176+
end
177+
)
178+
179+
assigns
180+
|> Map.put(:organization, org)
181+
|> Map.put(:starred?, starred?)
182+
end
183+
155184
defp fetch_report_from_context(project, "job", job) do
156185
Artifacthub.signed_url(project.id, "jobs", job.id, ".semaphore/REPORT.md")
157186
end
158187

159188
defp fetch_report_from_context(project, "workflow", workflow) do
160189
Artifacthub.signed_url(project.id, "workflows", workflow.id, ".semaphore/REPORT.md")
161190
end
191+
192+
defp fetch_report_from_context(project, "project", project) do
193+
Artifacthub.signed_url(project.id, "projects", project.id, ".semaphore/REPORT.md")
194+
end
162195
end

β€Žfront/lib/front_web/router.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,8 @@ defmodule FrontWeb.Router do
545545
put("/projects/:name_or_id/settings/pre_flight_checks", ProjectPFCController, :put)
546546
delete("/projects/:name_or_id/settings/pre_flight_checks", ProjectPFCController, :delete)
547547

548+
get("/projects/:name_or_id/report", ReportController, :project)
549+
548550
get("/", DashboardController, :index)
549551
get("/workflows", DashboardController, :workflows)
550552
get("/dashboards/:name", DashboardController, :show)

β€Žfront/lib/front_web/templates/layout/project.html.eex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@
5555
'), to: insights_index_path(@conn, :index, @project.name, []),
5656
class: Front.Decorators.Header.Project.tab_class(@conn, insights_index_path(@conn, :index, @project.name, [])) %>
5757
<% end %>
58+
<%= if FeatureProvider.feature_enabled?(:ui_reports, param: @conn.assigns[:organization_id]) do %>
59+
<%= link raw(~s'
60+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.025 2.025A3.5 3.5 0 001 4.5v7A3.5 3.5 0 004.5 15h7a3.5 3.5 0 003.5-3.5v-7A3.5 3.5 0 0011.5 1h-7a3.5 3.5 0 00-2.475 1.025zm.99.99A2.1 2.1 0 014.5 2.4h7a2.1 2.1 0 012.1 2.1v7a2.1 2.1 0 01-2.1 2.1h-7a2.1 2.1 0 01-2.1-2.1v-7a2.1 2.1 0 01.615-1.485zM4.7 4a.7.7 0 100 1.4h3.194a.7.7 0 100-1.4H4.7zM4 8a.7.7 0 01.7-.7h4.975a.7.7 0 110 1.4H4.7A.7.7 0 014 8zm4.731 2.594a.7.7 0 100 1.4h2.788a.7.7 0 000-1.4H8.73zm-4.731.7a.7.7 0 01.7-.7h1.787a.7.7 0 110 1.4H4.7a.7.7 0 01-.7-.7zM10.512 4a.7.7 0 100 1.4h1.007a.7.7 0 000-1.4h-1.007z"/></svg>
61+
<span>Report</span>
62+
'),
63+
to: report_path(@conn, :project, @project.name),
64+
class: Front.Decorators.Header.Project.tab_class(@conn, report_path(@conn, :project, @project.name)) %>
65+
<% end %>
5866
<%= if FeatureProvider.feature_enabled?(:artifacts, param: @conn.assigns[:organization_id]) do %>
5967
<%= link raw(~s'
6068
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg">
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Project Report
2+
3+
This is a test project report.

β€Žfront/test/browser/report_page_test.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ defmodule Front.Browser.ReportPageTest do
4545
|> visit("/jobs/#{job_id}")
4646
|> refute_has(Query.text("Report"))
4747
end
48+
49+
test "does not display a report tab on a project page", %{
50+
session: session
51+
} do
52+
project_name =
53+
DB.first(:projects)
54+
|> Map.get(:name)
55+
56+
session
57+
|> visit("/projects/#{project_name}")
58+
|> refute_has(Query.text("Report"))
59+
end
4860
end
4961

5062
describe "when ui_reports feature is enabled" do
@@ -81,5 +93,17 @@ defmodule Front.Browser.ReportPageTest do
8193
|> visit("/jobs/#{job_id}")
8294
|> assert_has(Query.text("Report"))
8395
end
96+
97+
test "displays a report tab on a project page", %{
98+
session: session
99+
} do
100+
project_name =
101+
DB.first(:projects)
102+
|> Map.get(:name)
103+
104+
session
105+
|> visit("/projects/#{project_name}")
106+
|> assert_has(Query.text("Report"))
107+
end
84108
end
85109
end

β€Žfront/test/support/stubs/project.ex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ defmodule Support.Stubs.Project do
8181
Artifacthub.create(workflow.id, params)
8282
end
8383

84+
def add_report(project_id, filename \\ "reports/project_report.md") do
85+
Artifacthub.create(project_id,
86+
path: ".semaphore/REPORT.md",
87+
scope: "projects",
88+
url:
89+
Path.join(
90+
Application.get_env(:front, :artifact_host),
91+
filename
92+
)
93+
)
94+
end
95+
8496
@spec set_project_state(project_stub_t(), InternalApi.Projecthub.Project.Status.State.t()) ::
8597
any()
8698
def set_project_state(project, state) do

0 commit comments

Comments
Β (0)