Add dockerhub support
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Aode (lion) 2021-12-21 12:42:37 -06:00
parent 33d71f98e4
commit c43c731a6d
4 changed files with 87 additions and 0 deletions

12
Cargo.lock generated
View file

@ -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",

View file

@ -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"] }

View 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"

View file

@ -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(&regex)?;
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),
}
}