Skip to main content

Create your own plugin

Introduction​

Plugins are the building blocks of Fluent CI. They are the core of the system and are responsible for running the tasks in your pipeline. You can create your own plugins to run custom tasks in your pipeline. There are two formats for creating plugins: Dagger based plugins and Wasm based plugins.

Dagger based plugins​

Dagger based plugins are written in TypeScript, executed by Deno and run in a containerized environment.

Wasm based plugins​

Wasm based plugins are written in Rust, compiled to WebAssembly and run directly in the host environment with isolated dependencies (no need for Docker), thanks to Nix, Pkgx, Devbox, etc and extism.

Creating a plugin​

Run the following command to create a new plugin:

fluentci init --standalone --wasm

This will create a new plugin in the current directory. Feel free to customize the plugin for your needs. You can also specify an existing template to use as a base for your plugin:

fluentci init --standalone --wasm -t <template>

Plugin structure​

The plugin structure is as follows:

.
├── Cargo.lock
├── Cargo.toml
├── fluentci.toml
└── src
└── lib.rs

Plugin entry point​

The plugin entry point is the src/lib.rs file. This file contains the plugin logic and is the main file that will be executed when the plugin is run.

src/lib.rs
use extism_pdk::*;
use fluentci_pdk::dag;

#[plugin_fn]
pub fn hello(args: String) -> FnResult<String> {
let stdout = dag()
.pipeline("hello")?
.with_exec(vec!["echo Hello", &args])?
.stdout()?;

Ok(stdout)
}

This is an example of a simple plugin that prints Hello followed by the arguments passed to the plugin.

Running the plugin​

Run the following command to run the plugin:

cargo build --target wasm32-unknown-unknown --release
fluentci run target/wasm32-unknown-unknown/release/*.wasm hello World!

This will build the plugin and run it with the arguments World!, printing Hello World!.

Publishing the plugin​

Run the following command to publish the plugin:

fluentci login
fluentci publish --wasm

Now your plugin is published and can be used in your pipelines like any other plugin:

fluentci run --wasm <your-plugin> hello World!

Note that fluentci run can run wasm plugin from local path, http(s) url or from any OCI registry that supports Wasm (ghcr.io, azurecr.io, gcr.io).