14 个版本

0.11.0 2024 年 8 月 1 日
0.10.3 2024 年 7 月 30 日
0.10.2 2024 年 6 月 27 日
0.9.8 2024 年 6 月 19 日

#36 in #github-actions

Download history 157/week @ 2024-06-02 680/week @ 2024-06-09 597/week @ 2024-06-16 194/week @ 2024-06-23 20/week @ 2024-06-30 34/week @ 2024-07-07 279/week @ 2024-07-28 10/week @ 2024-08-04 9/week @ 2024-08-11

298 每月下载量
3 个库中使用 (2 直接)

MIT 许可

56KB
1K SLoC

用 Rust 编写的 GitHub Actions 库

GitHub Crates.io Version Crates.io Downloads (recent) GitHub Stars Licence

GHActions 是一个基于 Rust 的库,用于帮助用户用 Rust 编写出色的 GitHub Actions!

📦 安装

运行以下命令将库添加到您的 Cargo.toml 文件中

cargo add ghactions

📚 特性

  • 易于使用
  • 验证 GitHub Actions 文件
  • 自动解析输入和输出
  • 从代码自动生成 action.yml 文件
    • 特性: generate
  • Octocrab 支持
    • 特性: octocrab
  • Actions ToolCache 支持
    • 在 toolcache 中定位工具
    • 特性: toolcache

🚀 使用

以下是一个使用此库的简单示例

use ghactions::prelude::*;

#[derive(Actions)]
struct MyAction {}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Initialise the Action
    let action = MyAction::init()?;

    group!("Main Workflow");

    // Do something...

    Ok(())
}

高级使用

ghactions 的另一个特性是能够自动解析动作的输入和输出。

use ghactions::prelude::*;

#[derive(Actions, Debug, Clone)]
#[action(
    // Action Name
    name = "My Action",
    // Action Description
    description = "My Action Description",
)]
struct MyAction {
    /// My Input
    #[input(
        // Change the name of the input from `my_mode` to `mode`
        name = "mode",
        // Input Description
        description = "My Input Description",
        // Default Value
        default = "default"
    )]
    my_mode: String,

    // Automatical type conversion
    #[input(
        // Input Description
        description = "My Input Description",
        default = "42",
    )]
    my_int: i32,

    // Multiple Inputs
    #[input(
        // Input Description
        description = "My Second Input Description",
        // Automatically split the input by `,`
        split = ",",
    )]
    mutiple: Vec<String>,

    // Output called `version`
    #[output(
        // Output Description
        description = "My Output Description",
    )]
    version: String,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Initialise the Action
    let action = MyAction::init()?;

    group!("Main Workflow");
    info!("Action :: {:?}", action);

    info!("My Input Mode :: `{}`", action.my_mode);
    info!("My Multiple Input :: `{:?}`", action.mutiple);
    info!("My Output Version :: `{}`", action.version);

    groupend!();

    // Using the toolcache feature
    group!("ToolCache");
    
    // Load the ToolCache from the `examples/toolcache` folder
    let toolcache = ToolCache::from("examples/toolcache");
    // Find the Node.js 18.4.0 tool
    let tool = toolcache.find("node", "18.4.0").await?;
    info!("Tool :: {:?}", tool);

    groupend!();

    // There are 3 ways to set the output
    group!("Set Outputs");

    // Using the dynamically name Action method
    action.set_version("1.0.0");
    // Using the `set_output` method
    MyAction::set_output("version", "1.0.0")?;
    // Or the Macro `setoutput!` directly
    setoutput!("version", "1.0.0");

    groupend!();

    Ok(())
}

生成 action.yml 文件

使用 generate 特性,您可以从代码中生成 action.yml 文件。

use ghactions::prelude::*;

#[derive(Actions, Debug, Clone)]
#[action(
    // Action Name
    name = "My Action",
    // Action Location (use `generate` feature to generate action.yml file)
    path = "./action.yml",
    // Set the Actions Dockerfile image
    // `ghactions` will check the Dockerfile exists
    image = "./examples/advanced/Dockerfile",
)]
struct MyAction {
    /// My Input
    #[input(
        // Input Description
        description = "My Input Description",
        // Default Value
        default = "default"
    )]
    my_input: String,

    #[output(
        // Output Description
        description = "My Output Description",
    )]
    my_output: String,
}

在构建时,将生成以下内容的 action.yml 文件

name: My Action
inputs:
  my_input:
    description: My Input Description
    default: default
outputs:
  my_output:
    description: My Output Description
runs:
  using: "docker"
  image: "Dockerfile"

使用 Octocrab

启用 octocrab 特性将允许您使用 Octocrab 库。

use ghactions::prelude::*;

#[derive(Actions, Debug, Clone)]
struct MyAction {}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let action = MyAction::init()?;

    group!("Octocrab");
    // Automatically setup Octocrab with the GitHub Instance and Token
    let octocrab = action.octocrab()?;

    // ... Do something...

    Ok(())
}

使用模板 (cargo-generate)

您可以使用 cargo-generate 工具使用此库创建一个新的 GitHub Action 项目。

cargo generate --git https://github.com/42ByteLabs/ghactions

🦸 支持

如果有错误或功能请求,请创建 GitHub Issues

此项目使用 语义版本控制 (v2),在主要版本发布时将发生重大更改。

📓 许可证

此项目根据 MIT 开源许可证的条款进行许可。请参阅 MIT 以获取完整条款。

依赖关系

~13–24MB
~380K SLoC