cosmicus 0.1.9

Cosmicus Client and Server to make the runner better
Documentation
use cosmicus::{
  run_workflow,
  runner::{CreateWorkflowOptions, Secret, WorkflowAPIEvent, WorkflowEvent, WorkflowMessage},
  CosmicusServer, RunWorkflowConfig, ServerPlugin,
};
use std::{env, fs, sync::Mutex};

const WORKFLOW: &str = r#"
name: test

jobs:
  test-job:
    name: test
    runs-on: ubuntu-latest
    steps:
      - name: test
        secrets:
          - test_secret
        run: |
          echo "test $TEST_SECRET"
"#;

struct MyPlugin {
  server: Mutex<Option<CosmicusServer>>,
}

impl MyPlugin {
  fn new() -> Self {
    MyPlugin {
      server: Mutex::new(None),
    }
  }
}

impl ServerPlugin for MyPlugin {
  fn on_init(&self, server: &CosmicusServer) {
    log::info!("MyPlugin on_init");
    self.server.lock().unwrap().replace(server.clone());
  }

  fn on_event(&self, event: &WorkflowMessage) {
    log::info!("MyPlugin on_event: {:?}", event);
  }

  fn on_runner_registered(&self, _runner: &cosmicus::RegisterRunner) {
    log::info!("MyPlugin on_runner_registered");
    let event = WorkflowEvent::API(WorkflowAPIEvent {
      repo_owner: "panghu-huang".to_string(),
      repo_name: "octocrate".to_string(),
      ref_name: "refs/heads/main".to_string(),
      sha: "95409faeae0e81635075091f56888e4bb5fc1a76".to_string(),
      pr_number: None,
    });

    let server = self.server.lock().unwrap().clone().unwrap();
    let workflow = server
      .parse_workflow(CreateWorkflowOptions {
        config: WORKFLOW.to_string(),
        event: event.clone(),
      })
      .unwrap();

    tokio::spawn(async move {
      log::info!("MyPlugin on_runner_registered: run_workflow");

      run_workflow("1")
        .workflow(workflow)
        .event(event)
        .exec(&server)
        .await
        .unwrap();
      log::info!("MyPlugin on_runner_registered: run_workflow done");
    });
  }

  fn on_run_workflow(&self, _options: &RunWorkflowConfig) {
    log::info!("MyPlugin on_run_workflow");
  }
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
  dotenv::dotenv().ok();

  let _res = env_logger::builder()
    .target(env_logger::Target::Stdout)
    .filter_level(log::LevelFilter::Info)
    .try_init();

  let app_id = env::var("GITHUB_APP_ID").map_err(|e| {
    anyhow::anyhow!(
      "Failed to read Github App ID from environment variable GITHUB_APP_ID: {}",
      e
    )
  })?;

  let private_key_path = env::var("GITHUB_APP_PRIVATE_KEY_PATH")
    .map_err(|e| anyhow::anyhow!("Failed to read Github App private key path: {}", e))?;
  let private_key = fs::read_to_string(&private_key_path).map_err(|e| {
    anyhow::anyhow!(
      "Failed to read Github App private key from {}: {}",
      private_key_path,
      e
    )
  })?;

  let server = CosmicusServer::builder()
    .port(5001 as u32)
    .host("127.0.0.1")
    .github_app_id(app_id.parse::<u64>()?)
    .github_app_private_key(private_key)
    .build()?;

  server
    .register_secret(
      Secret::new("test_secret")
        .value("test_value")
        .owner("panghu-huang")
        .build()?,
    )
    .register_plugin(MyPlugin::new());

  server.run().await.unwrap();

  Ok(())
}