123 lines
3.8 KiB
Rust
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(())
|
|
}
|
|
}
|