
GHActions
is a Rust based library for helping users write amazing GitHub Actions in Rust!
📦 Install
Run the following command to add the library to your Cargo.toml
file:
cargo add ghactions
📚 Features
- Easy to use
- Validate GitHub Actions files
- Automatic input and output parsing
- Generate
action.yml
file automatically from code
- Octocrab support
- Actions ToolCache support
- Locating tools in the toolcache
- feature:
toolcache
🚀 Usage
Here is a simple example of how to use the library:
use ghactions::prelude::*;
#[derive(Actions)]
struct MyAction {}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let action = MyAction::init()?;
group!("Main Workflow");
Ok(())
}
Using Template (cargo-generate)
You can use the cargo-generate tool to create a new GitHub Action project with the library.
cargo generate --git https://github.com/42ByteLabs/ghactions
Advance Usage
Another feature of ghactions
is the ability to automatically parse inputs and outputs from the action.
use ghactions::prelude::*;
#[derive(Actions, Debug, Clone)]
#[action(
// Action Name
name = "My Action",
// Action Description
description = "My Action Description",
)]
struct MyAction {
#[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,
#[input(
// Input Description
description = "My Input Description",
default = "42",
)]
my_int: i32,
#[input(
// Input Description
description = "My Second Input Description",
// Automatically split the input by `,`
split = ",",
)]
mutiple: Vec<String>,
#[output(
// Output Description
description = "My Output Description",
)]
version: String,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
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!();
group!("ToolCache");
let toolcache = ToolCache::from("examples/toolcache");
let tool = toolcache.find("node", "18.4.0").await?;
info!("Tool :: {:?}", tool);
groupend!();
group!("Set Outputs");
action.output_version("1.0.0");
MyAction::set_output("version", "1.0.0")?;
setoutput!("version", "1.0.0");
groupend!();
Ok(())
}
Generating the action.yml
file
The generate
feature will allow you to generate the action.yml
file from the code.
There are 3 ways to generate the action.yml
file:
image
mode:
- This will generate the
action.yml
file with a container image
.
entrypoint
mode:
- This will generate a composite Action with an entrypoint script.
installer
mode:
- This will generate a composite Action with an installer script.
use ghactions::prelude::*;
#[derive(Actions, Debug, Clone)]
#[action(
// Container / Docker file to supply the Action
image = "./examples/advanced/Dockerfile",
// [Optional] Supply a entrypoint for the container image
entrypoint = "./examples/entrypoint/entrypoint.sh",
)]
struct ContainerAction {
}
#[derive(Actions, Debug, Clone)]
#[action(
// Entrypoint is a Composite Action with an entrypoint script
entrypoint = "./examples/entrypoint/entrypoint.sh",
)]
struct EntrypointAction {
}
#[derive(Actions, Debug, Clone)]
#[action(
// Composite Action with an installer script
installer
)]
struct InstallerAction {
}
At build time, the action.yml
file will be generated with the following content.
Using Octocrab
Enabling the octocrab
feature will allow you to use the Octocrab library.
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");
let octocrab = action.octocrab()?;
Ok(())
}
🦸 Support
Please create GitHub Issues if there are bugs or feature requests.
This project uses Semantic Versioning (v2) and with major releases, breaking changes will occur.
📓 License
This project is licensed under the terms of the MIT open source license.
Please refer to MIT for the full terms.