mirror of
https://github.com/Noratrieb/does-it-build.git
synced 2026-01-14 10:25:01 +01:00
make it blazingly fast with caching of css and js
This commit is contained in:
parent
f539a3c45c
commit
d15a746558
8 changed files with 77 additions and 18 deletions
11
Cargo.lock
generated
11
Cargo.lock
generated
|
|
@ -238,6 +238,15 @@ dependencies = [
|
||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bs58"
|
||||||
|
version = "0.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4"
|
||||||
|
dependencies = [
|
||||||
|
"tinyvec",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bumpalo"
|
name = "bumpalo"
|
||||||
version = "3.19.0"
|
version = "3.19.0"
|
||||||
|
|
@ -448,6 +457,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"askama",
|
"askama",
|
||||||
"axum",
|
"axum",
|
||||||
|
"bs58",
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
"futures",
|
"futures",
|
||||||
"jiff",
|
"jiff",
|
||||||
|
|
@ -456,6 +466,7 @@ dependencies = [
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"rootcause",
|
"rootcause",
|
||||||
"serde",
|
"serde",
|
||||||
|
"sha2",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
|
|
||||||
|
|
@ -31,4 +31,6 @@ tracing = { version = "0.1.40", features = ["attributes"] }
|
||||||
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
bs58 = "0.5.1"
|
||||||
color-eyre = "0.6.3"
|
color-eyre = "0.6.3"
|
||||||
|
sha2 = "0.10.9"
|
||||||
|
|
|
||||||
32
build.rs
32
build.rs
|
|
@ -1,6 +1,29 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use sha2::Digest;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// Always rerun.
|
// Always rerun.
|
||||||
|
|
||||||
|
let index_css = include_str!("static/index.css");
|
||||||
|
let index_js = include_str!("static/index.js");
|
||||||
|
|
||||||
|
let index_css_name = get_file_ref("css", index_css);
|
||||||
|
let index_js_name = get_file_ref("js", index_js);
|
||||||
|
|
||||||
|
let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap());
|
||||||
|
|
||||||
|
std::fs::write(
|
||||||
|
out_dir.join("revs.rs"),
|
||||||
|
format!(
|
||||||
|
r#"
|
||||||
|
pub const INDEX_CSS_NAME: &str = "{index_css_name}";
|
||||||
|
pub const INDEX_JS_NAME: &str = "{index_js_name}";
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let version = if let Ok(commit) = try_get_commit() {
|
let version = if let Ok(commit) = try_get_commit() {
|
||||||
match has_no_changes() {
|
match has_no_changes() {
|
||||||
Ok(true) => commit,
|
Ok(true) => commit,
|
||||||
|
|
@ -20,6 +43,15 @@ fn main() {
|
||||||
println!("cargo:rustc-env=GIT_COMMIT_SHORT={version_short}");
|
println!("cargo:rustc-env=GIT_COMMIT_SHORT={version_short}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_file_ref(ext: &str, content: &str) -> String {
|
||||||
|
let mut hash = sha2::Sha256::new();
|
||||||
|
hash.update(content);
|
||||||
|
let digest = hash.finalize();
|
||||||
|
let rev = bs58::encode(digest).into_string();
|
||||||
|
let rev = &rev[..16];
|
||||||
|
format!("/{rev}.{ext}")
|
||||||
|
}
|
||||||
|
|
||||||
fn try_get_commit() -> color_eyre::Result<String> {
|
fn try_get_commit() -> color_eyre::Result<String> {
|
||||||
if let Ok(overridden) = std::env::var("DOES_IT_BUILD_OVERRIDE_VERSION") {
|
if let Ok(overridden) = std::env::var("DOES_IT_BUILD_OVERRIDE_VERSION") {
|
||||||
return Ok(overridden);
|
return Ok(overridden);
|
||||||
|
|
|
||||||
36
src/web.rs
36
src/web.rs
|
|
@ -16,6 +16,10 @@ use crate::{
|
||||||
notification, Result,
|
notification, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mod revs {
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/revs.rs"));
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
pub db: Db,
|
pub db: Db,
|
||||||
|
|
@ -28,8 +32,8 @@ pub async fn webserver(db: Db, notification_repo: String) -> Result<()> {
|
||||||
.route("/build", get(web_build))
|
.route("/build", get(web_build))
|
||||||
.route("/target", get(web_target))
|
.route("/target", get(web_target))
|
||||||
.route("/nightly", get(web_nightly))
|
.route("/nightly", get(web_nightly))
|
||||||
.route("/index.css", get(index_css))
|
.route(revs::INDEX_CSS_NAME, get(index_css))
|
||||||
.route("/index.js", get(index_js))
|
.route(revs::INDEX_JS_NAME, get(index_js))
|
||||||
.with_state(AppState {
|
.with_state(AppState {
|
||||||
db,
|
db,
|
||||||
notification_repo,
|
notification_repo,
|
||||||
|
|
@ -334,23 +338,33 @@ async fn web_root(State(state): State<AppState>) -> impl IntoResponse {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn index_css() -> impl IntoResponse {
|
fn reply_static(body: &'static str, content_type: &'static str) -> impl IntoResponse {
|
||||||
|
(
|
||||||
|
[
|
||||||
(
|
(
|
||||||
[(
|
|
||||||
axum::http::header::CONTENT_TYPE,
|
axum::http::header::CONTENT_TYPE,
|
||||||
axum::http::HeaderValue::from_static("text/css; charset=utf-8"),
|
axum::http::HeaderValue::from_static(content_type),
|
||||||
)],
|
),
|
||||||
|
(
|
||||||
|
axum::http::header::CACHE_CONTROL,
|
||||||
|
axum::http::HeaderValue::from_static("public, max-age=31556952, immutable"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
body,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn index_css() -> impl IntoResponse {
|
||||||
|
reply_static(
|
||||||
include_str!("../static/index.css"),
|
include_str!("../static/index.css"),
|
||||||
|
"text/css; charset=utf-8",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn index_js() -> impl IntoResponse {
|
async fn index_js() -> impl IntoResponse {
|
||||||
(
|
reply_static(
|
||||||
[(
|
|
||||||
axum::http::header::CONTENT_TYPE,
|
|
||||||
axum::http::HeaderValue::from_static("application/javascript; charset=utf-8"),
|
|
||||||
)],
|
|
||||||
include_str!("../static/index.js"),
|
include_str!("../static/index.js"),
|
||||||
|
"application/javascript; charset=utf-8",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Build {{nightly}} {{target}}</title>
|
<title>Build {{nightly}} {{target}}</title>
|
||||||
<link rel="stylesheet" href="/index.css" />
|
<link rel="stylesheet" href="{{ revs::INDEX_CSS_NAME }}" />
|
||||||
<script type="module" defer src="index.js"></script>
|
<script type="module" defer src="{{ revs::INDEX_JS_NAME }}"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>
|
<h1>
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Does it build?</title>
|
<title>Does it build?</title>
|
||||||
<link rel="stylesheet" href="index.css" />
|
<link rel="stylesheet" href="{{ revs::INDEX_CSS_NAME }}" />
|
||||||
<script type="module" defer src="index.js"></script>
|
<script type="module" defer src="{{ revs::INDEX_JS_NAME }}"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Does it build?</h1>
|
<h1>Does it build?</h1>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>{{nightly}} build history</title>
|
<title>{{nightly}} build history</title>
|
||||||
<link rel="stylesheet" href="/index.css" />
|
<link rel="stylesheet" href="{{ revs::INDEX_CSS_NAME }}" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Nightly build state for {{nightly}}</h1>
|
<h1>Nightly build state for {{nightly}}</h1>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>{{target}} build history</title>
|
<title>{{target}} build history</title>
|
||||||
<link rel="stylesheet" href="/index.css" />
|
<link rel="stylesheet" href="{{ revs::INDEX_CSS_NAME }}" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Target build history for {{target}}</h1>
|
<h1>Target build history for {{target}}</h1>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue