diff --git a/docs/assets/images/tasks.gif b/docs/assets/images/tasks.gif new file mode 100644 index 000000000..801add92b Binary files /dev/null and b/docs/assets/images/tasks.gif differ diff --git a/docs/blog/posts/devenv-v1.2-tasks.md b/docs/blog/posts/devenv-v1.2-tasks.md new file mode 100644 index 000000000..cdeb17379 --- /dev/null +++ b/docs/blog/posts/devenv-v1.2-tasks.md @@ -0,0 +1,95 @@ +--- +draft: false +date: 2024-09-24 +authors: + - domenkozar +--- + +# devenv 1.2: Tasks for convergent configuration with Nix + +For devenv, our mission is to make Nix the ultimate tool for managing developer environments. Nix +excels at [congruent configuration](https://constructolution.wordpress.com/2012/07/08/divergent-convergent-and-congruent-infrastructures/), +where the system state is fully described by declarative code. + +However, the real world often throws curveballs. Side-effects like database migrations, one-off +tasks such as data imports, or external API calls don't always fit neatly into this paradigm. +In these cases, we often resort to [convergent configuration](https://constructolution.wordpress.com/2012/07/08/divergent-convergent-and-congruent-infrastructures/), +where we define the desired end-state and let the system figure out how to get there. + +To bridge this gap and make Nix more versatile, we're introducing tasks. These allow you to +handle those pesky real-world scenarios while still leveraging Nix's powerful ecosystem. + +![Tasks interactive example](/assets/images/tasks.gif) + +## Usage + +For example if you'd like to execute python code after virtualenv has been created: + +```nix title="devenv.nix" +{ pkgs, lib, config, ... }: { + languages.python.enable = true; + languages.python.venv.enable = true; + + tasks = { + "python:setup" = { + exec = "python ${pkgs.writeText "setup.py" '' + print("hello world") + ''}"; + after = [ "devenv:python:virtualenv" ]; + }; + "devenv:enterShell".after = [ "python:setup" ]; + }; +} +``` + +`python:setup` task executes before `devenv:enterShell` but after `python:virtualenv` task: + +For all supported use cases see [tasks documentation](/tasks/). + + +## Task Server Protocol for SDKs + +We've talked to many teams that **dropped Nix** after a while and they usually fit into two categories: + +* 1) Maintaining **Nix was too complex** and the team didn't fully onboard, **creating friction inside the teams**. +* 2) Went **all-in Nix** and it took **a big toll on the team productivity**. + +While devenv already addresses (1), bridging **the gap between Nix provided developer environments +and existing devops tooling written in your favorite language is still an unsolved problem until now**. +
+ +We've designed [Task Server Protocol](https://github.com/cachix/devenv/issues/1457) so that you can write tasks +using your existing automation by providing an executable that exposes the tasks to devenv: +
+ +```nix title="devenv.nix" +{ pkgs, ... }: +let + myexecutable = pkgs.rustPlatform.buildRustPackage rec { + pname = "foo-bar"; + version = "0.1"; + cargoLock.lockFile = ./myexecutable/Cargo.lock; + src = pkgs.lib.cleanSource ./myexecutable; + } +in { + task.serverProtocol = [ "${myexecutable}/bin/myexecutable" ]; +} +``` + +In a few weeks we're planning to provide [Rust TSP SDK](https://github.com/cachix/devenv/issues/1457) +with a **full test suite** so you can implement your own abstraction in your language of choice. +
+ +You can now use your **preferred language for automation**, running tasks with a simple `devenv tasks run ` command. This +**flexibility** allows for more **intuitive and maintainable scripts**, tailored to your team's familiarity. + +For devenv itself, we'll slowly **transition from bash to Rust for +internal glue code**, enhancing performance and reliability. This change will make devenv more +**robust and easier to extend**, ultimately providing you with a **smoother development experience**. + +## Upgrading + +If you run `devenv update` on your existing repository you should already be using tasks, +without needing to upgrade to devenv 1.2. + +Domen