{"id":14563534,"url":"https://github.com/fluentci-io/fluentci-engine","last_synced_at":"2025-04-12T21:20:16.772Z","repository":{"id":227953768,"uuid":"768032322","full_name":"fluentci-io/fluentci-engine","owner":"fluentci-io","description":"Programmable CI/CD engine without Containers, written in Rust, built on top of Wasm and Nix ❄️","archived":false,"fork":false,"pushed_at":"2025-01-30T12:59:23.000Z","size":2604,"stargazers_count":90,"open_issues_count":2,"forks_count":5,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-04T01:05:19.268Z","etag":null,"topics":["cicd","continuous-delivery","continuous-integration","devbox","developer-tools","devenv","devenvironments","devops","flox","hacktoberfest","nix","nix-flake","pkgx","rust","wasm","webassembly"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fluentci-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["fluentci-io"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":null}},"created_at":"2024-03-06T10:48:29.000Z","updated_at":"2025-03-20T20:43:28.000Z","dependencies_parsed_at":"2024-03-23T07:45:36.413Z","dependency_job_id":"57e87e83-e2fa-48a4-aef7-45b7abfa4c18","html_url":"https://github.com/fluentci-io/fluentci-engine","commit_stats":{"total_commits":302,"total_committers":1,"mean_commits":302.0,"dds":0.0,"last_synced_commit":"a6e2e9a91f6e69b795323ebdca9ff924c8cbd129"},"previous_names":["fluentci-io/fluentci-engine"],"tags_count":26,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluentci-io%2Ffluentci-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluentci-io%2Ffluentci-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluentci-io%2Ffluentci-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluentci-io%2Ffluentci-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fluentci-io","download_url":"https://codeload.github.com/fluentci-io/fluentci-engine/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248632214,"owners_count":21136645,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cicd","continuous-delivery","continuous-integration","devbox","developer-tools","devenv","devenvironments","devops","flox","hacktoberfest","nix","nix-flake","pkgx","rust","wasm","webassembly"],"created_at":"2024-09-07T02:02:07.377Z","updated_at":"2025-04-12T21:20:16.742Z","avatar_url":"https://github.com/fluentci-io.png","language":"TypeScript","readme":"\n![Cover](https://github.com/fluentci-io/fluentci-engine/raw/HEAD/.github/assets/ui.png)\n\n# FluentCI Engine\n\n[![FlakeHub](https://img.shields.io/endpoint?url=https://flakehub.com/f/fluentci-io/fluentci-engine/badge)](https://flakehub.com/flake/fluentci-io/fluentci-engine)\n[![built with nix](https://img.shields.io/badge/Built_With-Nix-5277C3.svg?logo=nixos\u0026labelColor=73C3D5)](https://builtwithnix.org)\n[![flakestry.dev](https://flakestry.dev/api/badge/flake/github/fluentci-io/fluentci-engine)](https://flakestry.dev/flake/github/fluentci-io/fluentci-engine)\n[![downloads](https://img.shields.io/crates/dr/fluentci-engine)](https://crates.io/crates/fluentci-engine)\n[![crates](https://img.shields.io/crates/v/fluentci-engine.svg)](https://crates.io/crates/fluentci-engine)\n![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/fluentci-io/fluentci-engine/total?label=gh%20downloads)\n[![ci](https://github.com/fluentci-io/fluentci-engine/actions/workflows/ci.yml/badge.svg)](https://github.com/fluentci-io/fluentci-engine/actions/workflows/ci.yml)\n[![discord](https://img.shields.io/discord/1132020671262773358?label=discord\u0026logo=discord\u0026color=5865F2)](https://discord.gg/V4U6dPskKc)\n\n_If you love FluentCI, please ★ star this repository to show your support 💚. Looking for support? Join our [Discord](https://discord.gg/V4U6dPskKc)._\n\nFluentCI Engine is a programmable CI/CD engine (used by [FluentCI](https://github.com/fluentci-io/fluentci)) that is designed to be simple, flexible, and easy to use. It is supposed to run on the host machine without containerization or virtualization, and it is designed to be used with [Nix](https://nixos.org), [Pkgx](https://pkgx.sh), [Devbox](https://www.jetpack.io/devbox/), [Flox](https://flox.dev), [Devenv](https://devenv.sh), [Hermit](https://github.com/cashapp/hermit), [EnvHub](https://github.com/tsirysndr/envhub), [Pixi](https://pixi.sh/) and [Mise](https://mise.jdx.dev/).\n\n![Made with VHS](https://vhs.charm.sh/vhs-o1fkvlKvsyAPUbKUXTyyS.gif)\n\n\u003e [!NOTE]\n\u003e **Project Status: 🐲 Unstable, alpha-ish quality.**\n\u003e This project is still in the early stages of development,\n\u003e and it is not yet ready for production use.\n\u003e It is not feature-complete, and it is not yet stable. Use at your own risk.\n\n![Cover](https://github.com/fluentci-io/fluentci-engine/raw/HEAD/.github/assets/api.png)\n\n## ✨ Features\n\n- [x] Simple and easy to use\n- [x] Flexible\n- [x] No containerization or virtualization\n- [x] Built-in support for Nix, Hermit, Pkgx, Devbox, Flox, Devenv, Envhub, Mise and Pixi\n- [x] Built-in support for Secrets (backends: [Google Secret Manager](https://cloud.google.com/secret-manager), [AWS Secrets Manager](https://aws.amazon.com/fr/secrets-manager/), [Azure Key Vault](https://azure.microsoft.com/fr-fr/products/key-vault) and [HashiCorp Vault](https://www.vaultproject.io/))\n- [x] Built-in support for Services\n- [x] Cache support (backends: local, S3, GCS, R2)\n- [x] SDK for writing pipelines in TypeScript, Gleam, Rescript and Purescript, see [@fluentci/sdk](./sdk)\n- [x] GraphQL API, see [API Documentation](./docs/api.md)\n- [x] [OpenTelemetry](https://opentelemetry.io/) tracing\n- [x] Plugin system in WebAssembly, see [examples](./examples)\n\n## 🚀 Quick Start\n\n```bash\n# Clone the repository\ngit clone https://github.com/fluentci-io/fluentci-engine.git\n# Go to the project directory\ncd fluentci-engine\n# Install dependencies\nnix develop\ncd ./fixtures\ncargo run -p fluentci-engine -- serve\n# Open the browser and go to http://localhost:6880/graphiql\n# See ./fixtures for some GraphQL queries examples\n```\n\n\u003e [!TIP]\n\u003e Quickly setup Nix on your machine with [DeterminateSystems Nix installer](https://github.com/DeterminateSystems/nix-installer)\n\n## 📦 Downloads\n\n- `Mac`: arm64: [fluentci-engine_v0.4.11_aarch64-apple-darwin.tar.gz](https://github.com/fluentci-io/fluentci-engine/releases/download/v0.4.11/fluentci-engine_v0.4.11_aarch64-apple-darwin.tar.gz) intel: [fluentci-engine_v0.4.11_x86_64-apple-darwin.tar.gz](https://github.com/fluentci-io/fluentci-engine/releases/download/v0.4.11/fluentci-engine_v0.4.11_x86_64-apple-darwin.tar.gz)\n- `Linux`: intel: [fluentci-engine_v0.4.11_x86_64-unknown-linux-gnu.tar.gz](https://github.com/fluentci-io/fluentci-engine/releases/download/v0.4.11/fluentci-engine_v0.4.11_x86_64-unknown-linux-gnu.tar.gz) arm64: [fluentci-engine_v0.4.11_aarch64-unknown-linux-gnu.tar.gz](https://github.com/fluentci-io/fluentci-engine/releases/download/v0.4.11/fluentci-engine_v0.4.11_aarch64-unknown-linux-gnu.tar.gz)\n\n## 📚 Documentation\n\n- [API Documentation](./docs/api.md)\n\n## 🧩 Plugins\n\nFluentCI Engine supports plugins in WebAssembly. You can write your own plugins in Rust or any other language that can compile to WebAssembly. See [examples](./examples) for more information.\n\n### 🦀 Rust Plugin Example\n\nCreate a new Rust project:\n\n```bash\ncargo new nix --lib\n```\n\nInstall the `extism_pdk`, `fluentci_types` and `fluentci_pdk` crates:\n\n```bash\ncargo add extism_pdk fluentci_types fluentci_pdk\n```\n\nSave the following code to `src/lib.rs`:\n\n```rust\nuse extism_pdk::*;\nuse fluentci_pdk::dag;\nuse fluentci_types::nix::NixArgs;\n\n#[plugin_fn]\npub fn exec(command: String) -\u003e FnResult\u003cString\u003e {\n    let stdout = dag()\n        .nix(NixArgs {\n            impure: true\n        })?\n        .with_exec(command.split_whitespace().collect())?\n        .stdout()?;\n    Ok(stdout)\n}\n```\n\nSet the following in your `Cargo.toml`:\n\n```toml\n[lib]\ncrate-type = [\"cdylib\"]\n```\n\nCompile the plugin to WebAssembly:\n\n```bash\ncargo build --release --target wasm32-unknown-unknown\n```\n\nRun the plugin:\n\n```bash\nfluentci-engine call -m ./target/wasm32-unknown-unknown/release/nix.wasm -- exec nix --version\n```\n\n### 📑 Available Plugins\n\n- [android](https://github.com/fluent-ci-templates/android-pipeline/tree/main/plugin)\n- [ansible-lint](https://github.com/tsirysndr/daggerverse/tree/main/ansible-lint/plugin)\n- [ansible](https://github.com/tsirysndr/daggerverse/tree/main/ansible/plugin)\n- [apko](https://github.com/fluentci-io/apko-plugin)\n- [atlas](https://github.com/fluent-ci-templates/atlas-pipeline/tree/main/plugin)\n- [base](https://github.com/fluent-ci-templates/base-pipeline/tree/main/plugin)\n- [bazel](https://github.com/fluent-ci-templates/bazel-pipeline/tree/main/plugin)\n- [biome](https://github.com/fluentci-io/biome-plugin)\n- [black](https://github.com/tsirysndr/daggerverse/tree/main/black/plugin)\n- [buf](https://github.com/fluent-ci-templates/buf-pipeline/tree/main/plugin)\n- [buildx](https://github.com/tsirysndr/daggerverse/tree/main/buildx/plugin)\n- [bun](https://github.com/fluent-ci-templates/bun-pipeline/tree/main/plugin)\n- [checkmake](https://github.com/tsirysndr/daggerverse/tree/main/checkmake/plugin)\n- [chromatic](https://github.com/fluent-ci-templates/chromatic-pipeline/tree/main/plugin)\n- [clojure](https://github.com/fluent-ci-templates/clojure-pipeline/tree/main/plugin)\n- [cloudflare](https://github.com/fluent-ci-templates/cloudflare-pipeline/tree/main/plugin)\n- [codecov](https://github.com/fluent-ci-templates/codecov-pipeline/tree/main/plugin)\n- [cue](https://github.com/fluentci-io/cue-plugin)\n- [cypress](https://github.com/fluentci-io/cypress-plugin)\n- [dagger](https://github.com/fluentci-io/dagger-plugin)\n- [deno](https://github.com/fluent-ci-templates/deno-pipeline/tree/main/plugin)\n- [depot](https://github.com/fluentci-io/depot-plugin)\n- [dotnet](https://github.com/fluent-ci-templates/dotnet-pipeline/tree/main/plugin)\n- [elixir](https://github.com/fluent-ci-templates/elixir-pipeline/tree/main/plugin)\n- [fastlane](https://github.com/fluent-ci-templates/fastlane-pipeline/tree/main/plugin)\n- [firebase](https://github.com/fluent-ci-templates/firebase-pipeline/tree/main/plugin)\n- [flakestry](https://github.com/tsirysndr/daggerverse/tree/main/flakestry/plugin)\n- [flipt](https://github.com/fluentci-io/flipt-plugin)\n- [fly](https://github.com/fluent-ci-templates/fly-pipeline/tree/main/plugin)\n- [flutter](https://github.com/fluent-ci-templates/flutter-pipeline/tree/main/plugin)\n- [github](https://github.com/fluent-ci-templates/github-pipeline/tree/main/plugin)\n- [gleam](https://github.com/fluent-ci-templates/gleam-pipeline/tree/main/plugin)\n- [go](https://github.com/fluent-ci-templates/go-pipeline/tree/main/plugin)\n- [gradle](https://github.com/fluent-ci-templates/gradle-pipeline/tree/main/plugin)\n- [grype](https://github.com/fluent-ci-templates/grype-pipeline/tree/main/plugin)\n- [heroku](https://github.com/fluent-ci-templates/heroku-pipeline/tree/main/plugin)\n- [microcks](https://github.com/fluent-ci-templates/microcks-pipeline/tree/main/plugin)\n- [netlify](https://github.com/fluent-ci-templates/netlify-pipeline/tree/main/plugin)\n- [nixpacks](https://github.com/tsirysndr/daggerverse/tree/main/nixpacks/plugin)\n- [nodejs](https://github.com/fluent-ci-templates/nodejs-pipeline/tree/main/plugin)\n- [pkl](https://github.com/fluentci-io/pkl-plugin)\n- [playwright](https://github.com/fluentci-io/playwright-plugin)\n- [pulumi](https://github.com/fluent-ci-templates/pulumi-pipeline/tree/main/plugin)\n- [oxc](https://github.com/fluentci-io/oxc-plugin)\n- [railway](https://github.com/fluent-ci-templates/railway-pipeline/tree/main/plugin)\n- [ruby](https://github.com/fluent-ci-templates/ruby-pipeline/tree/main/plugin)\n- [ruff](https://github.com/fluentci-io/ruff-plugin)\n- [rust](https://github.com/fluent-ci-templates/rust-pipeline/tree/main/plugin)\n- [rye](https://github.com/fluentci-io/rye-plugin)\n- [shuttle](https://github.com/fluent-ci-templates/shuttle-pipeline/tree/main/plugin)\n- [sonar](https://github.com/fluent-ci-templates/sonar-pipeline/tree/main/plugin)\n- [spin](https://github.com/fluent-ci-templates/spin-pipeline/tree/main/plugin)\n- [ssh](https://github.com/fluentci-io/ssh-plugin)\n- [supabase](https://github.com/fluent-ci-templates/supabase-pipeline/tree/main/plugin)\n- [syft](https://github.com/fluent-ci-templates/syft-pipeline/tree/main/plugin)\n- [symfony](https://github.com/fluent-ci-templates/symfony-pipeline/tree/main/plugin)\n- [terraform](https://github.com/fluent-ci-templates/terraform-pipeline/tree/main/plugin)\n- [zig](https://github.com/fluent-ci-templates/zig-pipeline/tree/main/plugin)\n- [wasmer](https://github.com/fluent-ci-templates/wasmer-pipeline/tree/main/plugin)\n\n### 🌈 Builtin functions\n\nFluentCI Plugin Development Kit ([fluentci_pdk](https://docs.rs/fluentci-pdk/latest/fluentci_pdk)) provides some builtin functions from that you can use in your plugins:\n\n#### devbox\n\nSetup a Devbox Environment.\n\nExample:\n\n```rust\ndag()\n  .devbox()?\n  .with_exec(vec![\"devbox\", \"version\"])?\n  .stdout()?;\n```\n\n#### devenv\n\nSetup a Devenv Environment.\n\nExample:\n\n```rust\ndag()\n  .devenv()?\n  .with_exec(vec![\"devenv\", \"version\"])?\n  .stdout()?;\n```\n\n#### directory\n\nLoad a directory at the given path.\n\nExample:\n\n```rust\ndag()\n  .directory(\".\")?\n  .with_exec(vec![\"ls\", \"-la\"])?\n  .stdout()?;\n```\n\n#### envhub\n\nSetup an EnvHub Environment.\n\nExample:\n\n```rust\ndag()\n  .envhub()?\n  .with_exec(vec![\"envhub\", \"--version\"])?\n  .stdout()?;\n```\n\n#### file\n\nLoad a file at the given path.\n\nExample:\n\n```rust\ndag()\n  .file(\"Cargo.toml\")?\n  .path()?;\n```\n\n#### flox\n\nSetup a Flox Environment.\n\nExample:\n\n```rust\ndag()\n  .flox()?\n  .with_exec(vec![\"flox\", \"--version\"])?\n  .stdout()?;\n```\n\n#### git\n\nLoad a Git repository at the given URL.\n\nExample:\n\n```rust\ndag()\n  .git(\"https://github.com/tsirysndr/me\")?\n  .branch(\"main\")?\n  .tree()?\n  .entries()?;\n```\n\n#### http\n\nLoad a HTTP resource at the given URL.\n\nExample:\n\n```rust\ndag()\n  .http(\"https://example.com\")?\n  .path()?;\n```\n\n#### mise\n\nSetup a Mise Environment.\n\nExample:\n\n```rust\ndag()\n  .mise()?\n  .with_exec(vec![\"mise\", \"--version\"])?\n  .stdout()?;\n```\n\n#### nix\n\nSetup a Nix Environment.\n\nExample:\n\n```rust\ndag()\n  .nix(NixArgs {\n    impure: true\n  })?\n  .with_exec(vec![\"nix\", \"--version\"])?\n  .stdout()?;\n```\n\n#### pipeline\n\nCreate a new pipeline.\n\nExample:\n\n```rust\ndag()\n  .pipeline(\"example\")?\n  .with_exec(vec![\"echo\", \"Hello, World!\"])?\n  .stdout()?;\n```\n\n#### pixi\n\nSetup a Pixi Environment.\n\nExample:\n\n```rust\ndag()\n  .pixi()?\n  .with_exec(vec![\"pixi\", \"--version\"])?\n  .stdout()?;\n```\n\n#### pkgx\n\nSetup a Pkgx Environment.\n\nExample:\n\n```rust\ndag()\n  .pkgx()?\n  .with_exec(vec![\"pkgx\", \"--version\"])?\n  .stdout()?;\n```\n\n## 🌱 Github Actions\n\nFluentCI Engine is designed to be used with Github Actions. You can use the `fluentci-io/setup-fluentci@v5` action to run your pipelines. See [fluentci-io/setup-fluentci](https://github.com/marketplace/actions/setup-fluentci) for more information.\n\n```yaml\nname: Hello\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  setup-fluentci:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - name: Setup FluentCI\n        uses: fluentci-io/setup-fluentci@v5\n        with:\n          wasm: true # set to true so WebAssembly plugins can be used\n          plugin: base # Name of the Wasm Plugin to use without the .wasm extension,\n          # will be downloaded from the registry https://pkg.fluentci.io\n\n          # Arguments to pass to the plugin: function_name args\n          args: |\n            hello Hello, World!\n```\n\n## ⚡ Caching\n\nFluentCI Engine supports caching. To enable it, set the following environment variables:\n\n- `FLUENTCI_CACHE_GCS_BUCKET` - GCS bucket name, if you are using Google Cloud Storage\n- `FLUENTCI_CACHE_S3_ENDPOINT` - S3 endpoint, if you are using S3-compatible storage\n- `FLUENTCI_CACHE_S3_BUCKET` - S3 bucket name, if you are using S3-compatible storage\n- `FLUENTCI_CACHE_CDN_ENDPOINT` - CDN endpoint, if you are using CDN (optional) for downloading cache\n\n\u003e [!NOTE]\n\u003e You need to set `GOOGLE_APPLICATION_CREDENTIALS` or `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables to use GCS or S3 cache.\n\n## 🔭 OpenTelemetry Tracing\n\nFluentCI Engine supports OpenTelemetry tracing. To enable it, set the `OTEL_EXPORTER_OTLP_ENDPOINT` or `OTEL_EXPORTER_ZIPKIN_ENDPOINT` (if you want to use Zipkin) environment variable to the desired endpoint.\n\n![jaeger](https://github.com/fluentci-io/fluentci-engine/raw/HEAD/.github/assets/jaeger.png)\n![zipkin](https://github.com/fluentci-io/fluentci-engine/raw/HEAD/.github/assets/zipkin.png)\n![honeycomb](https://github.com/fluentci-io/fluentci-engine/raw/HEAD/.github/assets/honeycomb.png)\n\n## 📑 Logging\n\nFluentCI Engine supports sending logs to [Baselime](https://baselime.io). To enable it, set the `BASELIME_API_KEY` environment variable to the desired API key.\n\n![baselime](https://github.com/fluentci-io/fluentci-engine/raw/HEAD/.github/assets/baselime.png)\n","funding_links":["https://github.com/sponsors/fluentci-io"],"categories":["TypeScript","webassembly"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluentci-io%2Ffluentci-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffluentci-io%2Ffluentci-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluentci-io%2Ffluentci-engine/lists"}