Skip to content

Commit 4da7bb8

Browse files
committed
add simple "deployment pending" marker 20 minutes after a build
1 parent ca1f1dd commit 4da7bb8

File tree

5 files changed

+60
-2
lines changed

5 files changed

+60
-2
lines changed

src/cdn.rs

+24
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use aws_sdk_cloudfront::{
44
model::{InvalidationBatch, Paths},
55
Client, RetryConfig,
66
};
7+
use chrono::{DateTime, Utc};
78
use std::sync::{Arc, Mutex};
89
use strum::EnumString;
910
use tokio::runtime::Runtime;
@@ -129,15 +130,38 @@ pub(crate) fn invalidate_crate(config: &Config, cdn: &CdnBackend, name: &str) ->
129130
Ok(())
130131
}
131132

133+
/// Return if we count the deploy as pending based on the build-time.
134+
/// CloudFront invalidations can take up to 15 minutes. Until we have
135+
/// live queries of the invalidation status we just assume it's fine
136+
/// latest 20 minutes after the build.
137+
/// TODO: should be replaced be keeping track or querying the active invalidation from CloudFront
138+
pub(crate) fn crate_invalidation_pending(build_time: &DateTime<Utc>) -> bool {
139+
Utc::now().signed_duration_since(*build_time) <= chrono::Duration::minutes(20)
140+
}
141+
132142
#[cfg(test)]
133143
mod tests {
134144
use super::*;
135145
use crate::test::wrapper;
146+
use chrono::Duration;
147+
use test_case::test_case;
136148

137149
use aws_sdk_cloudfront::{Client, Config, Credentials, Region};
138150
use aws_smithy_client::{erase::DynConnector, test_connection::TestConnection};
139151
use aws_smithy_http::body::SdkBody;
140152

153+
#[test_case(10, true)]
154+
#[test_case(19, true)]
155+
#[test_case(21, false)]
156+
#[test_case(9999, false)]
157+
fn get_invalidation_pending(minutes: i64, expected: bool) {
158+
let now = Utc::now();
159+
assert_eq!(
160+
crate_invalidation_pending(&(now - Duration::minutes(minutes))),
161+
expected
162+
);
163+
}
164+
141165
#[test]
142166
fn create_cloudfront() {
143167
wrapper(|env| {

src/web/releases.rs

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use crate::{
44
build_queue::QueuedCrate,
5+
cdn::crate_invalidation_pending,
56
db::{Pool, PoolClient},
67
impl_webpage,
78
utils::report_error,
@@ -38,6 +39,7 @@ pub struct Release {
3839
description: Option<String>,
3940
target_name: Option<String>,
4041
rustdoc_status: bool,
42+
deployment_pending: bool,
4143
pub(crate) build_time: DateTime<Utc>,
4244
stars: i32,
4345
}
@@ -109,6 +111,7 @@ pub(crate) fn get_releases(
109111
target_name: row.get(3),
110112
rustdoc_status: row.get(4),
111113
build_time: row.get(5),
114+
deployment_pending: crate_invalidation_pending(&row.get(5)),
112115
stars: row.get::<_, Option<i32>>(6).unwrap_or(0),
113116
})
114117
.collect()
@@ -222,6 +225,7 @@ fn get_search_results(
222225
version: row.get("version"),
223226
description: row.get("description"),
224227
build_time: row.get("build_time"),
228+
deployment_pending: crate_invalidation_pending(&row.get("build_time")),
225229
target_name: row.get("target_name"),
226230
rustdoc_status: row.get("rustdoc_status"),
227231
stars: stars.unwrap_or(0),

templates/core/home.html

+12-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ <h1 class="brand">{{ "cubes" | fas(fw=true) }} Docs.rs</h1>
4747
<div class="pure-u-1 pure-u-sm-6-24 pure-u-md-5-24 name">
4848
{{ release.name }}-{{ release.version }}
4949
</div>
50-
<div class="pure-u-1 pure-u-sm-14-24 pure-u-md-16-24 description">
50+
<div class="pure-u-1 pure-u-sm-13-24 pure-u-md-15-24 description">
5151
{{ release.description }}
5252
</div>
5353

@@ -62,6 +62,17 @@ <h1 class="brand">{{ "cubes" | fas(fw=true) }} Docs.rs</h1>
6262
{{ release.build_time | timeformat(relative=true) }}
6363
</div>
6464
{%- endif -%}
65+
{% if release.deployment_pending -%}
66+
<div class="pure-u-1 pure-u-sm-1-24 pure-u-md-1-24 deploymentstatus"
67+
title="deployment pending, some pages might be outdated">
68+
{{ "spinner" | fas }}
69+
</div>
70+
{%- else -%}
71+
<div class="pure-u-1 pure-u-sm-1-24 pure-u-md-1-24 deploymentstatus"
72+
title="deployment finished">
73+
{{ "check" | fas }}
74+
</div>
75+
{%- endif -%}
6576
</div>
6677
</a>
6778
</li>

templates/releases/releases.html

+12-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
{{ release.name }}-{{ release.version }}
3535
</div>
3636

37-
<div class="pure-u-1 pure-u-sm-14-24 pure-u-md-16-24 description">
37+
<div class="pure-u-1 pure-u-sm-13-24 pure-u-md-15-24 description">
3838
{{ release.description }}
3939
</div>
4040

@@ -50,6 +50,17 @@
5050
{{ release.build_time | timeformat(relative=true) }}
5151
</div>
5252
{%- endif %}
53+
{% if release.deployment_pending -%}
54+
<div class="pure-u-1 pure-u-sm-1-24 pure-u-md-1-24 deploymentstatus"
55+
title="deployment pending, some pages might be outdated">
56+
{{ "spinner" | fas }}
57+
</div>
58+
{%- else -%}
59+
<div class="pure-u-1 pure-u-sm-1-24 pure-u-md-1-24 deploymentstatus"
60+
title="deployment finished">
61+
{{ "check" | fas }}
62+
</div>
63+
{%- endif -%}
5364
</div>
5465
</a>
5566
</li>

templates/style/style.scss

+8
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,14 @@ div.recent-releases-container {
364364
}
365365
}
366366

367+
.deploymentstatus {
368+
font-weight: normal;
369+
370+
@media #{$media-sm} {
371+
text-align: right;
372+
}
373+
}
374+
367375
div.pagination {
368376
text-align: center;
369377
margin: 1em;

0 commit comments

Comments
 (0)