Generate opam compare links only for successful builds
This commit is contained in:
parent
fb2515e713
commit
a45a584831
7 changed files with 40 additions and 25 deletions
|
@ -395,7 +395,7 @@ module Build = struct
|
||||||
|}
|
|}
|
||||||
|
|
||||||
let get_latest_successful_uuid =
|
let get_latest_successful_uuid =
|
||||||
Caqti_request.find
|
Caqti_request.find_opt
|
||||||
id
|
id
|
||||||
Rep.uuid
|
Rep.uuid
|
||||||
{| SELECT b.uuid
|
{| SELECT b.uuid
|
||||||
|
@ -405,7 +405,7 @@ module Build = struct
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
|}
|
|}
|
||||||
|
|
||||||
let get_previous =
|
let get_previous_successful =
|
||||||
Caqti_request.find_opt
|
Caqti_request.find_opt
|
||||||
id
|
id
|
||||||
Caqti_type.(tup2 id Meta.t)
|
Caqti_type.(tup2 id Meta.t)
|
||||||
|
@ -415,6 +415,7 @@ module Build = struct
|
||||||
b.main_binary, b.job
|
b.main_binary, b.job
|
||||||
FROM build b, build b0
|
FROM build b, build b0
|
||||||
WHERE b0.id = ? AND b0.job = b.job AND
|
WHERE b0.id = ? AND b0.job = b.job AND
|
||||||
|
b.result_kind = 0 AND b.result_code = 0 AND
|
||||||
(b0.start_d > b.start_d OR b0.start_d = b.start_d AND b0.start_ps > b.start_ps)
|
(b0.start_d > b.start_d OR b0.start_d = b.start_d AND b0.start_ps > b.start_ps)
|
||||||
ORDER BY b.start_d DESC, b.start_ps DESC
|
ORDER BY b.start_d DESC, b.start_ps DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
|
|
|
@ -150,9 +150,9 @@ sig
|
||||||
(id, id * Uuidm.t, [< `Many | `One | `Zero > `One `Zero ])
|
(id, id * Uuidm.t, [< `Many | `One | `Zero > `One `Zero ])
|
||||||
Caqti_request.t
|
Caqti_request.t
|
||||||
val get_latest_successful_uuid :
|
val get_latest_successful_uuid :
|
||||||
(id, Uuidm.t, [< `Many | `One | `Zero > `One ])
|
(id, Uuidm.t, [< `Many | `One | `Zero > `One `Zero ])
|
||||||
Caqti_request.t
|
Caqti_request.t
|
||||||
val get_previous :
|
val get_previous_successful :
|
||||||
(id, id * Meta.t, [< `Many | `One | `Zero > `One `Zero ])
|
(id, id * Meta.t, [< `Many | `One | `Zero > `One `Zero ])
|
||||||
Caqti_request.t
|
Caqti_request.t
|
||||||
val add : (t, unit, [< `Many | `One | `Zero > `Zero ]) Caqti_request.t
|
val add : (t, unit, [< `Many | `One | `Zero > `Zero ]) Caqti_request.t
|
||||||
|
|
|
@ -142,7 +142,11 @@ let add_routes datadir =
|
||||||
let redirect_latest req =
|
let redirect_latest req =
|
||||||
let job_name = Dream.param "job" req in
|
let job_name = Dream.param "job" req in
|
||||||
let path = Dream.path req |> String.concat "/" in
|
let path = Dream.path req |> String.concat "/" in
|
||||||
let* build = Dream.sql req (Model.latest_successful_build_uuid job_name) in
|
let* build =
|
||||||
|
Dream.sql req (Model.job_id job_name) >>= fun job_id ->
|
||||||
|
Dream.sql req (Model.latest_successful_build_uuid job_id)
|
||||||
|
>>= Model.not_found
|
||||||
|
in
|
||||||
match build with
|
match build with
|
||||||
| Error e ->
|
| Error e ->
|
||||||
Log.warn (fun m -> m "Error getting job: %a" pp_error e);
|
Log.warn (fun m -> m "Error getting job: %a" pp_error e);
|
||||||
|
@ -162,8 +166,8 @@ let add_routes datadir =
|
||||||
let* data =
|
let* data =
|
||||||
Dream.sql req (Model.build uuid) >>= fun (build_id, build) ->
|
Dream.sql req (Model.build uuid) >>= fun (build_id, build) ->
|
||||||
Dream.sql req (Model.build_artifacts build_id) >>= fun artifacts ->
|
Dream.sql req (Model.build_artifacts build_id) >>= fun artifacts ->
|
||||||
Dream.sql req (Model.latest_build_uuid build.job_id) >>= fun latest_uuid ->
|
Dream.sql req (Model.latest_successful_build_uuid build.job_id) >>= fun latest_uuid ->
|
||||||
Dream.sql req (Model.build_previous build_id) >|= fun previous_build ->
|
Dream.sql req (Model.previous_successful_build build_id) >|= fun previous_build ->
|
||||||
(build, artifacts, latest_uuid, previous_build)
|
(build, artifacts, latest_uuid, previous_build)
|
||||||
in
|
in
|
||||||
match data with
|
match data with
|
||||||
|
|
12
lib/model.ml
12
lib/model.ml
|
@ -64,12 +64,11 @@ let latest_build_uuid job_id (module Db : CONN) =
|
||||||
(* We know there's at least one job when this is called, probably. *)
|
(* We know there's at least one job when this is called, probably. *)
|
||||||
not_found >|= snd
|
not_found >|= snd
|
||||||
|
|
||||||
let latest_successful_build_uuid job_name (module Db : CONN) =
|
let latest_successful_build_uuid job_id (module Db : CONN) =
|
||||||
Db.find Builder_db.Job.get_id_by_name job_name >>= fun job_id ->
|
Db.find_opt Builder_db.Build.get_latest_successful_uuid job_id
|
||||||
Db.find Builder_db.Build.get_latest_successful_uuid job_id
|
|
||||||
|
|
||||||
let build_previous id (module Db : CONN) =
|
let previous_successful_build id (module Db : CONN) =
|
||||||
Db.find_opt Builder_db.Build.get_previous id >|=
|
Db.find_opt Builder_db.Build.get_previous_successful id >|=
|
||||||
Option.map (fun (_id, meta) -> meta)
|
Option.map (fun (_id, meta) -> meta)
|
||||||
|
|
||||||
let main_binary id main_binary (module Db : CONN) =
|
let main_binary id main_binary (module Db : CONN) =
|
||||||
|
@ -83,6 +82,9 @@ let job job (module Db : CONN) =
|
||||||
Db.collect_list Builder_db.Build.get_all_meta_by_name job >|=
|
Db.collect_list Builder_db.Build.get_all_meta_by_name job >|=
|
||||||
List.map (fun (_id, meta, main_binary) -> (meta, main_binary))
|
List.map (fun (_id, meta, main_binary) -> (meta, main_binary))
|
||||||
|
|
||||||
|
let job_id job_name (module Db : CONN) =
|
||||||
|
Db.find Builder_db.Job.get_id_by_name job_name
|
||||||
|
|
||||||
let jobs (module Db : CONN) =
|
let jobs (module Db : CONN) =
|
||||||
Db.collect_list Builder_db.Job.get_all ()
|
Db.collect_list Builder_db.Job.get_all ()
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@ type error = [ Caqti_error.call_or_retrieve | `Not_found | `File_error of Fpath.
|
||||||
|
|
||||||
val pp_error : Format.formatter -> error -> unit
|
val pp_error : Format.formatter -> error -> unit
|
||||||
|
|
||||||
|
val not_found : 'a option -> ('a, [> error ]) result Lwt.t
|
||||||
|
|
||||||
val staging : Fpath.t -> Fpath.t
|
val staging : Fpath.t -> Fpath.t
|
||||||
|
|
||||||
val cleanup_staging : Fpath.t -> Caqti_lwt.connection ->
|
val cleanup_staging : Fpath.t -> Caqti_lwt.connection ->
|
||||||
|
@ -28,10 +30,10 @@ val build_exists : Uuidm.t -> Caqti_lwt.connection ->
|
||||||
val latest_build_uuid : Builder_db.id -> Caqti_lwt.connection ->
|
val latest_build_uuid : Builder_db.id -> Caqti_lwt.connection ->
|
||||||
(Uuidm.t, [> error ]) result Lwt.t
|
(Uuidm.t, [> error ]) result Lwt.t
|
||||||
|
|
||||||
val latest_successful_build_uuid : string -> Caqti_lwt.connection ->
|
val latest_successful_build_uuid : Builder_db.id -> Caqti_lwt.connection ->
|
||||||
(Uuidm.t, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
(Uuidm.t option, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
||||||
|
|
||||||
val build_previous : Builder_db.id -> Caqti_lwt.connection ->
|
val previous_successful_build : Builder_db.id -> Caqti_lwt.connection ->
|
||||||
(Builder_db.Build.Meta.t option, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
(Builder_db.Build.Meta.t option, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
||||||
|
|
||||||
val main_binary : Builder_db.id -> Fpath.t option -> Caqti_lwt.connection ->
|
val main_binary : Builder_db.id -> Fpath.t option -> Caqti_lwt.connection ->
|
||||||
|
@ -40,6 +42,9 @@ val main_binary : Builder_db.id -> Fpath.t option -> Caqti_lwt.connection ->
|
||||||
val job : string -> Caqti_lwt.connection ->
|
val job : string -> Caqti_lwt.connection ->
|
||||||
((Builder_db.Build.Meta.t * Builder_db.file option) list, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
((Builder_db.Build.Meta.t * Builder_db.file option) list, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
||||||
|
|
||||||
|
val job_id : string -> Caqti_lwt.connection ->
|
||||||
|
(Builder_db.id, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
||||||
|
|
||||||
val jobs : Caqti_lwt.connection ->
|
val jobs : Caqti_lwt.connection ->
|
||||||
((Builder_db.id * string) list, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
((Builder_db.id * string) list, [> Caqti_error.call_or_retrieve ]) result Lwt.t
|
||||||
|
|
||||||
|
|
11
lib/views.ml
11
lib/views.ml
|
@ -174,24 +174,27 @@ let job_build
|
||||||
previous_build
|
previous_build
|
||||||
=
|
=
|
||||||
let delta = Ptime.diff finish start in
|
let delta = Ptime.diff finish start in
|
||||||
|
let successful_build = match result with Builder.Exited 0 -> true | _ -> false in
|
||||||
layout ~title:(Fmt.strf "Job build %s %a" name pp_ptime start)
|
layout ~title:(Fmt.strf "Job build %s %a" name pp_ptime start)
|
||||||
[ h1 [txtf "Job build %s %a" name pp_ptime start];
|
[ h1 [txtf "Job build %s %a" name pp_ptime start];
|
||||||
p [txtf "Build took %a." Ptime.Span.pp delta ];
|
p [txtf "Build took %a." Ptime.Span.pp delta ];
|
||||||
p [txtf "Execution result: %a." Builder.pp_execution_result result];
|
p [txtf "Execution result: %a." Builder.pp_execution_result result];
|
||||||
|
(match latest_uuid with
|
||||||
|
| Some latest_uuid when successful_build && not (Uuidm.equal latest_uuid uuid) ->
|
||||||
p [
|
p [
|
||||||
a ~a:[Fmt.kstr a_href "/compare/%a/%a/opam-switch"
|
a ~a:[Fmt.kstr a_href "/compare/%a/%a/opam-switch"
|
||||||
Uuidm.pp uuid Uuidm.pp latest_uuid]
|
Uuidm.pp uuid Uuidm.pp latest_uuid]
|
||||||
[txt "Compare opam-switch with latest build"];
|
[txt "Compare opam-switch with latest build"];
|
||||||
];
|
]
|
||||||
|
| _ -> txt "");
|
||||||
(match previous_build with
|
(match previous_build with
|
||||||
| Some previous_build ->
|
| Some previous_build when successful_build ->
|
||||||
p [
|
p [
|
||||||
a ~a:[Fmt.kstr a_href "/compare/%a/%a/opam-switch"
|
a ~a:[Fmt.kstr a_href "/compare/%a/%a/opam-switch"
|
||||||
Uuidm.pp uuid Uuidm.pp previous_build.Builder_db.Build.Meta.uuid]
|
Uuidm.pp uuid Uuidm.pp previous_build.Builder_db.Build.Meta.uuid]
|
||||||
[txt "Compare opam-switch with previous build"];
|
[txt "Compare opam-switch with previous build"];
|
||||||
]
|
]
|
||||||
| None ->
|
| _ -> txt "");
|
||||||
txt "");
|
|
||||||
h3 [txt "Digests of build artifacts"];
|
h3 [txt "Digests of build artifacts"];
|
||||||
dl (List.concat_map
|
dl (List.concat_map
|
||||||
(fun { Builder_db.filepath; localpath=_; sha256; size } ->
|
(fun { Builder_db.filepath; localpath=_; sha256; size } ->
|
||||||
|
|
|
@ -249,14 +249,14 @@ let test_build_get_previous (module Db : CONN) =
|
||||||
add_second_build (module Db) >>= fun () ->
|
add_second_build (module Db) >>= fun () ->
|
||||||
Db.find_opt Builder_db.Build.get_by_uuid uuid'
|
Db.find_opt Builder_db.Build.get_by_uuid uuid'
|
||||||
>>| get_opt "no build" >>= fun (id, _build) ->
|
>>| get_opt "no build" >>= fun (id, _build) ->
|
||||||
Db.find_opt Builder_db.Build.get_previous id
|
Db.find_opt Builder_db.Build.get_previous_successful id
|
||||||
>>| get_opt "no previous build" >>| fun (_id, meta) ->
|
>>| get_opt "no previous build" >>| fun (_id, meta) ->
|
||||||
Alcotest.(check Testable.uuid) "same uuid" meta.uuid uuid
|
Alcotest.(check Testable.uuid) "same uuid" meta.uuid uuid
|
||||||
|
|
||||||
let test_build_get_previous_none (module Db : CONN) =
|
let test_build_get_previous_none (module Db : CONN) =
|
||||||
Db.find_opt Builder_db.Build.get_by_uuid uuid
|
Db.find_opt Builder_db.Build.get_by_uuid uuid
|
||||||
>>| get_opt "no build" >>= fun (id, _build) ->
|
>>| get_opt "no build" >>= fun (id, _build) ->
|
||||||
Db.find_opt Builder_db.Build.get_previous id >>| function
|
Db.find_opt Builder_db.Build.get_previous_successful id >>| function
|
||||||
| None -> ()
|
| None -> ()
|
||||||
| Some (_id, meta) ->
|
| Some (_id, meta) ->
|
||||||
Alcotest.failf "Got unexpected result %a" Uuidm.pp meta.uuid
|
Alcotest.failf "Got unexpected result %a" Uuidm.pp meta.uuid
|
||||||
|
|
Loading…
Reference in a new issue