Skip to content

Commit 56ff62a

Browse files
authored
Merge pull request #16 from kozakura913/main
healthcheck追加
2 parents 61d148f + f81d330 commit 56ff62a

File tree

5 files changed

+89
-3
lines changed

5 files changed

+89
-3
lines changed

.github/workflows/docker-publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
fail-fast: false
3737
matrix:
3838
platform:
39-
- linux/686
39+
- linux/386
4040
- linux/amd64
4141
- linux/arm64
4242
- linux/arm/v6

Dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@ COPY build /app/build
88
WORKDIR /app
99
RUN sh /app/build/install.sh
1010
COPY src ./src
11+
COPY examples ./examples
1112
COPY Cargo.toml ./Cargo.toml
1213
RUN --mount=type=cache,target=/var/cache/cargo --mount=type=cache,target=/app/target sh /app/build/build.sh
1314

14-
FROM scratch
15+
FROM alpine:latest
1516
COPY --from=0 /app/summaly-rs /
17+
COPY --from=0 /app/healthcheck ./healthcheck
18+
RUN sh -c "./summaly-rs&" && ./healthcheck 5555 http://127.0.0.1:12267/
19+
HEALTHCHECK --interval=30s --timeout=3s CMD ./healthcheck 5555 http://127.0.0.1:12267/ || exit 1
1620
EXPOSE 12267
1721
CMD ["/summaly-rs"]

build/build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ set -eu
22
source build/env.sh
33
ls /app/target/
44
cargo build --release --target ${RUST_TARGET}
5+
cargo build --release --target ${RUST_TARGET} --example healthcheck
56
cp /app/target/${RUST_TARGET}/release/summaly-rs /app/summaly-rs
7+
cp /app/target/${RUST_TARGET}/release/examples/healthcheck /app/healthcheck

build/env.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ if [ ${TARGETARCH} = "amd64" ]; then
44
export CC=x86_64-linux-musl-gcc
55
export RUST_TARGET="x86_64-unknown-linux-musl"
66
export RUSTFLAGS="-C linker=${CC}"
7-
elif [ ${TARGETARCH} = "686" ]; then
7+
elif [ ${TARGETARCH} = "386" ]; then
88
export MUSL_NAME="i686-linux-musl-cross"
99
export CC=i686-linux-musl-gcc
1010
export RUST_TARGET="i686-unknown-linux-musl"

examples/healthcheck.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
use std::{net::SocketAddr, str::FromStr};
2+
3+
use axum::{response::IntoResponse, Router};
4+
const TEST_HTML:&'static str=r#"""
5+
<html><head>
6+
<meta property="og:description" content="description text">
7+
<title>TEST_HTML_FILE</title>
8+
</head></html>
9+
"""#;
10+
11+
#[derive(Debug,serde::Serialize,serde::Deserialize)]
12+
pub struct SummalyResult{
13+
title:String,
14+
description:String,
15+
}
16+
fn main() {
17+
let args:Vec<String>=std::env::args().collect();
18+
let bind_port=args.get(1).expect("args[1]=bind_port");
19+
let target_url=args.get(2).expect("args[2]=target_url");
20+
let http_addr:SocketAddr = SocketAddr::new("127.0.0.1".parse().unwrap(),bind_port.parse().expect("bind_port parse"));
21+
let self_url=reqwest::Url::from_str(&format!("http://{}:{}/",http_addr.ip().to_string(),http_addr.port())).unwrap();
22+
let rt=tokio::runtime::Builder::new_multi_thread().enable_all().build().unwrap();
23+
rt.spawn(async move{
24+
let app = Router::new();
25+
let app=app.route("/",axum::routing::get(||async{
26+
(axum::http::StatusCode::OK,TEST_HTML).into_response()
27+
}));
28+
let listener = tokio::net::TcpListener::bind(&http_addr).await.unwrap();
29+
axum::serve(listener,app.into_make_service_with_connect_info::<SocketAddr>()).await.unwrap();
30+
});
31+
let client=reqwest::Client::builder();
32+
let client=client.timeout(std::time::Duration::from_millis(500));
33+
let client=client.build().unwrap();
34+
let mut local_ok=false;
35+
for _ in 0..20{
36+
std::thread::sleep(std::time::Duration::from_millis(50));
37+
let self_url=self_url.clone();
38+
let client=client.clone();
39+
let status=rt.block_on(async move{
40+
if let Ok(s)=client.get(self_url).send().await{
41+
s.status().as_u16()
42+
}else{
43+
504
44+
}
45+
});
46+
if status==200{
47+
local_ok=true;
48+
break;
49+
}
50+
std::thread::sleep(std::time::Duration::from_millis(50));
51+
}
52+
if !local_ok{
53+
println!("test server bind error");
54+
std::process::exit(1);
55+
}
56+
for _ in 0..5{
57+
let self_url=self_url.to_string();
58+
let client=client.clone();
59+
let status=rt.block_on(async move{
60+
if let Ok(s)=client.get(format!("{}?url={}",target_url,self_url)).send().await{
61+
let status_code=s.status().as_u16();
62+
if status_code==200{
63+
let s=s.bytes().await.expect("body load failed");
64+
let sr=serde_json::from_slice::<SummalyResult>(&s).unwrap();
65+
assert_eq!(sr.description,"description text");
66+
assert_eq!(sr.title,"TEST_HTML_FILE");
67+
}
68+
status_code
69+
}else{
70+
504
71+
}
72+
});
73+
if status==200{
74+
println!("ok");
75+
std::process::exit(0);
76+
}
77+
std::thread::sleep(std::time::Duration::from_millis(500));
78+
}
79+
std::process::exit(2);
80+
}

0 commit comments

Comments
 (0)