This commit is contained in:
parent
33d71f98e4
commit
c43c731a6d
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -17,6 +17,15 @@ version = "1.0.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.12.1"
|
||||
|
@ -875,6 +884,8 @@ version = "1.5.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
|
@ -898,6 +909,7 @@ name = "release-checker"
|
|||
version = "0.1.3"
|
||||
dependencies = [
|
||||
"color-eyre",
|
||||
"regex",
|
||||
"reqwest",
|
||||
"scraper",
|
||||
"serde",
|
||||
|
|
|
@ -10,6 +10,7 @@ color-eyre = "0.5.11"
|
|||
reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "json"] }
|
||||
scraper = "0.12"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
regex = "1.5.4"
|
||||
tracing = "0.1"
|
||||
tracing-error = { version = "0.1.2", features = ["traced-error"] }
|
||||
tracing-subscriber = { version = "0.2", features = ["env-filter"] }
|
||||
|
|
10
examples/dockerhub/Check.toml
Normal file
10
examples/dockerhub/Check.toml
Normal file
|
@ -0,0 +1,10 @@
|
|||
[project]
|
||||
kind = "dockerhub"
|
||||
namespace = "vectorim"
|
||||
repository = "element-web"
|
||||
regex = "v\\d\\.\\d\\.\\d"
|
||||
|
||||
[gitea]
|
||||
domain = "git.asonix.dog"
|
||||
owner = "asonix"
|
||||
repo = "docker-element"
|
64
src/main.rs
64
src/main.rs
|
@ -24,6 +24,14 @@ struct CheckConfig {
|
|||
enum ProjectConfig {
|
||||
None,
|
||||
|
||||
#[serde(rename = "dockerhub")]
|
||||
DockerHub {
|
||||
namespace: String,
|
||||
repository: String,
|
||||
regex: String,
|
||||
},
|
||||
|
||||
#[serde(rename = "alpine")]
|
||||
Alpine {
|
||||
package: String,
|
||||
branch: String,
|
||||
|
@ -197,6 +205,19 @@ impl Display for AlpineError {
|
|||
}
|
||||
impl std::error::Error for AlpineError {}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum DockerError {
|
||||
NoTag,
|
||||
}
|
||||
impl Display for DockerError {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
Self::NoTag => write!(f, "No tag found for query"),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl std::error::Error for DockerError {}
|
||||
|
||||
#[tracing::instrument]
|
||||
async fn check_git_project(
|
||||
repository: String,
|
||||
|
@ -280,6 +301,42 @@ async fn check_alpine_package(
|
|||
Ok(versions.into_iter().next())
|
||||
}
|
||||
|
||||
#[tracing::instrument]
|
||||
async fn check_dockerhub_image(
|
||||
namespace: String,
|
||||
repository: String,
|
||||
regex: String,
|
||||
) -> color_eyre::eyre::Result<String> {
|
||||
let regex = regex::Regex::new(®ex)?;
|
||||
|
||||
let client = reqwest::Client::builder()
|
||||
.user_agent("release-checker (+https://git.asonix.dog/asonix/release-checker)")
|
||||
.build()?;
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct TagResult {
|
||||
name: String,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct TagsResponse {
|
||||
results: Vec<TagResult>,
|
||||
}
|
||||
|
||||
let images_url = format!("https://registry.hub.docker.com/v2/repositories/{}/{}/tags?currently_tagged=true,ordering=last_updated,page_size=30,status=active", namespace, repository);
|
||||
let tags: TagsResponse = client.get(images_url).send().await?.json().await?;
|
||||
|
||||
for result in tags.results {
|
||||
if let Some(matched) = regex.find(&result.name) {
|
||||
if matched.as_str() == result.name {
|
||||
return Ok(result.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Err(DockerError::NoTag.into())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip_all)]
|
||||
fn build_client(gitea_token: &str) -> color_eyre::eyre::Result<Client> {
|
||||
let mut headers = HeaderMap::new();
|
||||
|
@ -369,6 +426,13 @@ async fn check_project(project: ProjectConfig) -> color_eyre::eyre::Result<Optio
|
|||
branch,
|
||||
architectures,
|
||||
} => check_alpine_package(package, branch, architectures).await,
|
||||
ProjectConfig::DockerHub {
|
||||
namespace,
|
||||
repository,
|
||||
regex,
|
||||
} => check_dockerhub_image(namespace, repository, regex)
|
||||
.await
|
||||
.map(Some),
|
||||
ProjectConfig::None => Ok(None),
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue