feat: add cli releaser

Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
2024-12-22 12:28:47 +01:00
parent c5faf1055b
commit 66c70f6ca7
3 changed files with 225 additions and 167 deletions

View File

@@ -3,6 +3,8 @@ 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<()> {
@@ -22,11 +24,13 @@ async fn main() -> eyre::Result<()> {
.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(rust_releaser)
.execute(std::env::args())
.await?;
@@ -35,3 +39,48 @@ async fn main() -> eyre::Result<()> {
.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)")?;
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_directory("/mnt/src", src)
.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?;
Ok(())
}
}