| use anyhow::Result; |
| use clap::arg_enum; |
| use std::{path::PathBuf, time::Duration}; |
| use structopt::StructOpt; |
| |
| use bazelci_agent::artifact::upload; |
| |
| arg_enum! { |
| #[allow(non_camel_case_types)] |
| enum UploadMode { |
| // Upload as Buildkite's artifacts |
| buildkite, |
| } |
| } |
| |
| /// Upload/download artifacts from Bazel CI tasks |
| #[derive(StructOpt)] |
| enum ArtifactCommand { |
| /// Upload artifacts (e.g. test logs for failed tests) from Bazel CI tasks |
| #[structopt(rename_all = "snake")] |
| Upload { |
| /// Don't actually upload files for debug purpose |
| #[structopt(long)] |
| dry: bool, |
| /// Upload various files for debug purpose |
| #[structopt(long)] |
| debug: bool, |
| /// The file contains the JSON serialisation of the build event protocol. |
| /// The agent "watches" this file until "last message" encountered |
| #[structopt(long, parse(from_os_str))] |
| build_event_json_file: Option<PathBuf>, |
| /// The desitnation the artifacts should be uploaded to |
| #[structopt(long, possible_values = &UploadMode::variants(), case_insensitive = true)] |
| mode: Option<UploadMode>, |
| /// The seconds to wait before watching the BEP file |
| #[structopt(long)] |
| delay: Option<u64>, |
| /// BEP json file is uploaded if there are flaky tests |
| #[structopt(long)] |
| monitor_flaky_tests: bool, |
| }, |
| } |
| |
| #[derive(StructOpt)] |
| #[structopt(rename_all = "snake")] |
| enum Command { |
| Artifact(ArtifactCommand), |
| } |
| |
| fn main() -> Result<()> { |
| let cmd = Command::from_args(); |
| |
| let subscriber = tracing_subscriber::FmtSubscriber::new(); |
| tracing::subscriber::set_global_default(subscriber).unwrap(); |
| |
| match cmd { |
| Command::Artifact(cmd) => match cmd { |
| ArtifactCommand::Upload { |
| dry, |
| debug, |
| build_event_json_file, |
| mode, |
| delay, |
| monitor_flaky_tests, |
| } => { |
| let mode = match mode { |
| Some(UploadMode::buildkite) => upload::Mode::Buildkite, |
| None => upload::Mode::Buildkite, |
| }; |
| upload::upload( |
| dry, |
| debug, |
| build_event_json_file.as_ref().map(|p| p.as_path()), |
| mode, |
| delay.map(|secs| Duration::from_secs(secs)), |
| monitor_flaky_tests, |
| )?; |
| } |
| }, |
| } |
| |
| Ok(()) |
| } |