Files
cuddle-rust-cli-plan/crates/cuddle-rust-cli-plan/src/main.rs
kjuulh c0e7190f65
All checks were successful
continuous-integration/drone/push Build is passing
feat: add rust cli plan
2025-08-29 14:56:26 +02:00

123 lines
3.8 KiB
Rust

use cuddle_ci::cuddle_file::CuddleFile;
use cuddle_ci::rust_service::architecture::{Architecture, Os};
use cuddle_ci::rust_service::extensions::*;
use cuddle_ci::rust_service::RustService;
use cuddle_ci::{cuddle_please, CuddleCI};
use dagger_sdk::HostDirectoryOptsBuilder;
use eyre::Context;
#[tokio::main]
async fn main() -> eyre::Result<()> {
tracing_subscriber::fmt::init();
dagger_sdk::connect(|client| async move {
let cuddle_file = CuddleFile::from_cuddle_file().await?;
let service = &RustService::from(client.clone())
.with_arch(Architecture::Amd64)
.with_os(Os::Linux)
.with_apt(&[
"libssl-dev",
"libz-dev",
"libpq-dev",
"protobuf-compiler",
"cmake",
])
.with_apt_release(&["libssl-dev", "libz-dev", "libpq-dev"])
.with_cuddle_file(&cuddle_file)
.with_apt_ca_certificates()
.with_workspace_crates()
.await
.with_mold("2.3.3")
.to_owned();
let cuddle_please = &cuddle_please::CuddlePlease::new(client.clone());
let rust_releaser = &RustReleaser::new(client.clone());
CuddleCI::default()
.with_pull_request(service)
.with_main(service)
.with_main(cuddle_please)
.with_release(service)
.with_release(rust_releaser)
.execute(std::env::args())
.await?;
Ok(())
})
.await?;
Ok(())
}
#[derive(Clone)]
pub struct RustReleaser {
client: dagger_sdk::Query,
}
impl RustReleaser {
pub fn new(client: dagger_sdk::Query) -> Self {
Self { client }
}
}
#[async_trait::async_trait]
impl cuddle_ci::ReleaseAction for RustReleaser {
async fn execute_release(&self, _ctx: &mut cuddle_ci::Context) -> eyre::Result<()> {
let cuddle_file = CuddleFile::from_cuddle_file().await?;
let crates_token = std::env::var("CRATES_IO_TOKEN")
.context("failed to find crates.io token (env: CRATES_IO_TOKEN)")?;
if let Some(cuddle_publish) = &cuddle_file.vars.rust {
if cuddle_publish.publish.is_some() {
let rust_image = self.client.container().from("rustlang/rust:nightly");
let src = self.client.host().directory_opts(
".",
HostDirectoryOptsBuilder::default()
.exclude([".git/", ".cuddle/", "target/"])
.build()?,
);
let service = &cuddle_file.vars.service;
rust_image
.with_workdir("/mnt/src")
.with_exec(vec!["apt", "update"])
.with_exec(vec![
"apt",
"install",
"-y",
"libssl-dev",
"libz-dev",
"libpq-dev",
"protobuf-compiler",
"cmake",
])
.with_directory("/mnt/src", src)
.with_new_file(
"/root/.cargo/credentials",
format!(
r#"
[registry]
token = "{}"
"#,
crates_token
),
)
.with_secret_variable(
"CARGO_REGISTRY_TOKEN",
self.client.set_secret("CARGO_REGISTRY_TOKEN", crates_token),
)
.with_exec(vec!["cargo", "publish", "-p", service, "--allow-dirty"])
.sync()
.await?;
} else {
tracing::info!("publish disabled");
}
}
Ok(())
}
}