{"id":16672250,"url":"https://github.com/egordm/nauman","last_synced_at":"2025-07-16T08:35:33.085Z","repository":{"id":43467804,"uuid":"434761424","full_name":"egordm/nauman","owner":"egordm","description":"A CI inspired approach for local job automation.","archived":false,"fork":false,"pushed_at":"2022-09-06T11:13:49.000Z","size":120,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-09T19:54:59.390Z","etag":null,"topics":["automation","command","command-line-tool","cron","runner-script","rust","task","task-runner","yaml"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/egordm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-12-03T23:35:11.000Z","updated_at":"2023-11-20T15:22:15.000Z","dependencies_parsed_at":"2022-08-23T18:21:22.806Z","dependency_job_id":null,"html_url":"https://github.com/egordm/nauman","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/egordm/nauman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/egordm%2Fnauman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/egordm%2Fnauman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/egordm%2Fnauman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/egordm%2Fnauman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/egordm","download_url":"https://codeload.github.com/egordm/nauman/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/egordm%2Fnauman/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265497864,"owners_count":23777082,"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":["automation","command","command-line-tool","cron","runner-script","rust","task","task-runner","yaml"],"created_at":"2024-10-12T12:05:43.211Z","updated_at":"2025-07-16T08:35:33.063Z","avatar_url":"https://github.com/egordm.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable --\u003e\n\u003cdiv id=\"top\"\u003e\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003enauman\u003c/h1\u003e\n    \u003cp\u003e\n       \u003cimg alt=\"Crates.io\" src=\"https://img.shields.io/crates/v/nauman\"\u003e\n       \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/EgorDm/nauman\" alt=\"License\"\u003e\u003c/a\u003e\n \u003ca href=\"https://github.com/EgorDm/nauman/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/EgorDm/nauman/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n    \u003c/p\u003e\n    \u003cp\u003e\n        \u003cb\u003eA CI inspired approach for local job automation.\u003c/b\u003e\n    \u003c/p\u003e\n\u003c/div\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e •\n  \u003ca href=\"#faq\"\u003eFAQ\u003c/a\u003e •\n  \u003ca href=\"#examples\"\u003eExamples\u003c/a\u003e •\n  \u003ca href=\"https://github.com/EgorDm/nauman/blob/master/JOB_SYNTAX.md\"\u003eJob Syntax\u003c/a\u003e\n\u003c/p\u003e\n\u003c!-- markdownlint-enable --\u003e\n\n\n## About\n`nauman` is an easy-to-use job automation tool. It arose from a necessity to automate complex task flows while still preserving the ability to monitor and debug them.\n\nIt is heavily inspired by simplicity of [Github Actions](https://docs.github.com/en/actions), flexibility of [Fastlane](https://github.com/fastlane/fastlane) and extensibility of [Apache Airflow](https://airflow.apache.org/). This tool aims to bring the best of both to local job automation.\n\n## Quick Start\nSee [Installation](#installation) for how to install just on your computer. Try running `nauman --version` to make sure that it’s installed correctly.\n\nOnce `nauman` is installed and working, create a job file named `hello-world.yml` in the root of your project with the following contents:\n\n```yaml\nname: Hello World!\n\ntasks:\n  - name: Hello World!\n    run: echo \"Hello World!\"\n  - name: Greeting\n    run: echo \"Greetings ${USER}!\"\n```\n\nWhen you invoke `nauman hello-world.yml` it runs the job tasks in the order they are listed in the file. The output should be as follows:\n\n\u003cpre\u003e\n\u003cspan style=\"color: #50FA7B\"\u003e--------------------------\n--- Task: Hello World! ---\n--------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo \"Hello World!\"\u003c/span\u003e\nHello World!\n\u003cspan style=\"color: #50FA7B\"\u003e----------------------\n--- Task: Greeting ---\n----------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo \"Greetings ${USER}!\"\u003c/span\u003e\nGreetings egordm!\n\n\u003c/pre\u003e\n\n`nauman` prints the output of each task to the console. The defined tasks run within your default shell and capture all of their output.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Examples\nFor more examples, see the [examples](examples) directory.\n* [Using Hooks](#using-hooks)\n* [Logging](#logging)\n* [Using Environment Variables](#using-environment-variables)\n* [More](https://github.com/EgorDm/nauman/tree/master/examples)\n\n### Using Hooks\n[Hooks](#hooks) are first class citizens in `nauman`. They represent various events and callbacks that can occur during the execution of a job.\n\nLet's take a look at a simple use case of hooks to add health checks to a job and its tasks. Create a file named `health-checks.yml` in the root of your project with the following contents:\n\n```yaml\nname: Example Job Using Health Checks\npolicy: always\n\ntasks:\n  - name: Run a successful program\n    run: sleep 2 \u0026\u0026 echo \"Success!\"\n    hooks:\n      on_success:\n        - run: curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/fb4c4863-a7f1-44f1-8298-3baabec653d4\n  - name: Run a failing program\n    run: sleep 2 \u0026\u0026 exit 1\n    hooks:\n      on_success:\n        - run: curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/0178d446-9b50-4158-b50d-7df098945c81\n      on_failure:\n        - name: Send failing status code to Health Check\n          run: curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/0178d446-9b50-4158-b50d-7df098945c81/$NAUMAN_PREV_CODE\n\nhooks:\n  after_job:\n    - name: On completion of the job, ping a health check\n      run: curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/fb4c4863-a7f1-44f1-8298-3baabec653d4\n```\n\nWhen you invoke `nauman health-checks.yml` it runs all the tasks withing the job file despite the fact that the second task fails (see [Execution Policy: always](#execution-policies)). See the output below:\n\n\u003cpre\u003e\n\u003cspan style=\"color: #50FA7B\"\u003e--------------------------------------\n--- Task: Run a successful program ---\n--------------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ sleep 2 \u0026amp;\u0026amp; echo \"Success!\"\u003c/span\u003e\nSuccess!\n\u003cspan style=\"color: #F1FA8C\"\u003e-------------------------------------------------------------------------------------------------------------\n--- Hook: curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/fb4c4863-a7f1-44f1-8298-3baabec653d4 ---\n-------------------------------------------------------------------------------------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/fb4c4863-a7f1-44f1-8298-3baabec653d4\u003c/span\u003e\n\u003cspan style=\"color: #50FA7B\"\u003e-----------------------------------\n--- Task: Run a failing program ---\n-----------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ sleep 2 \u0026amp;\u0026amp; exit 1\u003c/span\u003e\n\u003cspan style=\"color: #FF5555\"\u003eTask \"Run a failing program\" completed in 2s with a non-zero exit status: 1. This indicates a failure\u003c/span\u003e\n\u003cspan style=\"color: #F1FA8C\"\u003e------------------------------------------------------\n--- Hook: Send failing status code to Health Check ---\n------------------------------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/0178d446-9b50-4158-b50d-7df098945c81/$NAUMAN_PREV_CODE\u003c/span\u003e\n\u003cspan style=\"color: #F1FA8C\"\u003e-----------------------------------------------------------\n--- Hook: On completion of the job, ping a health check ---\n-----------------------------------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/fb4c4863-a7f1-44f1-8298-3baabec653d4\u003c/span\u003e\n\u003c/pre\u003e\n\nOn success of the first task, a success hook is executed which sends a health-check. On failure of the second task, a fail hook is executed sending a failure health-check. Finally, an after job hook is executed sending a job completion health-check.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Logging\n[Logging](#logging) is a powerful feature of `nauman` that allows you to log the output of your tasks and hooks to different output streams.\n\nCreate a file named `logging.yml` in the root of your project with the following contents:\n\n```yaml\nname: Example Job Using Logs\noptions:\n  log_dir: ./logs\n\ntasks:\n  - name: Print Hello World to stdout\n    run: echo \"Hello World!\"\n  - name: Print Hello World to stderr\n    run: echo \"Hello World!\" \u003e\u00262\n\nlogging:\n  - type: file\n    name: Print stdout to a file\n    stdout: true\n    stderr: false\n    output: ./stdout.log\n  - type: file\n    name: Print stderr to a file\n    stdout: false\n    stderr: true\n    output: ./stderr.log\n  - type: file\n    name: Print both stdout and stderr to separate files per task\n    split: true\n    output: ./separate_logs\n  - type: console\n```\n\nRun `nauman logging.yml` and see the output below:\n\n\u003cpre\u003e\n\u003cspan style=\"color: #50FA7B\"\u003e-----------------------------------------\n--- Task: Print Hello World to stdout ---\n-----------------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo \"Hello World!\"\u003c/span\u003e\nHello World!\n\u003cspan style=\"color: #50FA7B\"\u003e-----------------------------------------\n--- Task: Print Hello World to stderr ---\n-----------------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo \"Hello World!\" \u0026gt;\u0026amp;2\u003c/span\u003e\nHello World!\n\u003c/pre\u003e\n\nAdditionally, the following files are created:\n* `logs/logging_2021-12-05T18:11:14/`\n  * `separate_logs/`\n    * `000_print-hello-world-to-stdout.log`\n    * `001_print-hello-world-to-stderr.log`\n  * `stderr.log`\n  * `stdout.log`\n\nWhere the logs if the specified root directory for the logs (See `log_dir` in [Logging](#logging) for more details). All the logs are placed in an `logging_` subdirectory with the current date and time of the job run.\n`stdout.log` and `stderr.log` are created for each log stream. \n`separate_logs/` is created for each task and contains the stdout and stderr logs for that task.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Using Environment Variables\n[Environment Variables](#environment-variables) allow you to set environment variables for your job. There are multiple ways to set environment variables:\n\n* As system environment variables: `KEY=VALUE nauman`\n* As cli arguments: `nauman -e KEY=VALUE`\n* As job configuration: `\u003cjob_file\u003e.env.KEY: VALUE`\n* As task configuration: `\u003cjob_file\u003e.tasks.\u003ctask\u003e.env.KEY: VALUE`\n\nBy creating `env-vars.yml` in the root of your project with the following content you can test them all:\n\n```yaml\nname: Example Environment variables\n\nenv:\n  PING_CMD: curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/\n  CHECK_1: fb4c4863-a7f1-44f1-8298-3baabec653d4\n\ntasks:\n  - name: Job env var\n    run: echo $PING_CMD$CHECK_1\n  - name: Task env var\n    run: echo $PING_CMD$CHECK_1\n    env:\n      CHECK_1: fb4c4863-a7f1-44f1-8298-3baabec653d4\n  - name: System env var\n    run: echo $PING_CMD$CHECK_2\n  - name: Built-in env vars\n    run: echo \"Previous task \\\"$NAUMAN_PREV_NAME\\\" finished with status $NAUMAN_PREV_CODE\"\n```\n\nWhen you run `nauman env-vars.yml -e CHECK_2=0178d446-9b50-4158-b50d-7df098945c81` you will see the following output:\n\n\u003cpre\u003e\n\u003cspan style=\"color: #50FA7B\"\u003e-------------------------\n--- Task: Job env var ---\n-------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo $PING_CMD$CHECK_1\u003c/span\u003e\ncurl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/fb4c4863-a7f1-44f1-8298-3baabec653d4\n\u003cspan style=\"color: #50FA7B\"\u003e--------------------------\n--- Task: Task env var ---\n--------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo $PING_CMD$CHECK_1\u003c/span\u003e\ncurl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/fb4c4863-a7f1-44f1-8298-3baabec653d4\n\u003cspan style=\"color: #50FA7B\"\u003e----------------------------\n--- Task: System env var ---\n----------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo $PING_CMD$CHECK_2\u003c/span\u003e\ncurl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/0178d446-9b50-4158-b50d-7df098945c81\n\u003cspan style=\"color: #50FA7B\"\u003e-------------------------------\n--- Task: Built-in env vars ---\n-------------------------------\u003c/span\u003e\n\u003cspan style=\"color: #8BE9FD\"\u003e$ echo \"Previous task \\\"$NAUMAN_PREV_NAME\\\" finished with status $NAUMAN_PREV_CODE\"\u003c/span\u003e\nPrevious task \"System env var\" finished with status 0\n\u003c/pre\u003e\n\nIn the last task we can see that the `NAUMAN_PREV_NAME` and `NAUMAN_PREV_CODE` environment variables are used. These variables are set by the `nauman` based on the previous task. See [Environment Variables](#environment-variables) for more context specific environment variables.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Features\n* [Hook everything](#hook-everything)\n* [Flexible Logging](#flexible-logging)\n* [Context variables](#context-variables)\n* [Configurable task plan](#configurable-task-plan)\n* [Different shell types](#different-shell-types)\n* [Dry run](#dry-run)\n* [Task Outputs](#task-outputs)\n* [Multiline commands](#multiline-commands)\n* [Dotenv files](#dotenv-files)\n* [Change your working directory](#change-your-working-directory)\n\n### Hook everything\nYou can create hooks for all the possible outcomes and events of your job or your task. Create job or task-local hooks like this:\n\n```yaml\ntasks:\n  ...\n  - name: My Task\n    hooks:\n      on_failure:\n        ...\n      on_success:\n        ...\n      before_task:\n        ...\n      after_task:\n        ...\n\nhooks:\n  before_job:\n    ...\n  after_job:\n    ...\n  on_failure:\n    ...\n  on_success:\n    ...\n  before_task:\n    ...\n  after_task:\n    ...\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Flexible Logging\nYou can log to single or multiple files, to console and even choose which log streams to used (stdout, stderr, or both).\n\n```yaml\nlogging:\n  - name: Log only stdout\n    type: file\n    stdout: true\n    stderr: false\n    output: ./stdout.log\n  - name: Logs split in files per task\n    type: file\n    stdout: true\n    stderr: true\n    split: true\n    output: ./per_task_logs\n  - name: Logs to console\n    type: console\n    stdout: true\n    stderr: true\n  - name: Append output to a shared file\n    type: file\n    stdout: true\n    stderr: true\n    output: /var/log/nauman/my_job.log\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Context variables\nDefine more flexible tasks by using context variables.\n\nCurrently, following context variables are supported:\n* `NAUMAN_JOB_NAME` - Name of the job\n* `NAUMAN_JOB_ID` - ID of the job\n* `NAUMAN_TASK_NAME` - Name of the current task\n* `NAUMAN_TASK_ID` - ID of the current task\n* `NAUMAN_PREV_NAME` - Name of the previous task\n* `NAUMAN_PREV_ID` - ID of the previous task\n* `NAUMAN_PREV_CODE` - Exit code of the previous task\n\n```yaml\ntasks:\n  ...\n  - name: Use context vars as env vars\n    run: echo $NAUMAN_TASK_NAME\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Configurable task plan\nWhen one task fails it does not stop the whole job. You can configure the task execution plan to decide how to proceed.\n\nYou can choose between the following options:\n* `always` - Always execute the task regardless of prior task status.\n* `prior_success` - Execute the task only if prior task has succeeded.\n* `no_prior_failed` - Execute the task only if no other task has failed.\n\n```yaml\n# Policy can be defined at job level\npolicy: no_prior_failed\n\ntasks:\n  ...\n  - name: Always run this task\n    # And overridden at task level\n    policy: always\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Different shell types\nAside from the default `sh` shell you can use `bash`, `python`, `ruby`, `php` or specify path to your own desired shell.\n\n```yaml\n# Specify a default shell\nshell: bash\nshell_path: /bin/bash\n\ntasks:\n  ...\n  - name: Python task\n    shell: python\n    run: print('Hello World!')\n  - name: Virtual env python\n    shell: python\n    shell_path: '/app/venv/bin/python'\n    run: print('Hello World!')\n  - name: Ruby task\n    shell: ruby\n    run: print('Hello World!')\n  - name: PHP task\n    shell: php\n    run: echo 'Hello World!';\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Dry run\nWant to make sure that your job is configured correctly? You can run your job in dry run mode. This will verify that all tasks are syntactically correct, all shells are usable and warn you about any potential issues (such as missing directories).\n\n```shell\nnauman --dry-run my_job.yml\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Task Outputs\nDuring the execution of every task, a temporary file is created where you can store the output variables. These files are automatically deleted after the task is finished. The variables specified in the output files will be loaded into the global context as environment variables.\n\nThe output file accepts dotenv style syntax.\n\n```yaml\ntasks:\n  ...\n  - name: Append output to the output file\n    run: echo \"foo=bar\"  \u003e\u003e \"$NAUMAN_OUTPUT_FILE\"\n  - name: Use the output variable\n    run: echo $foo\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Multiline commands\nSometimes commands can take up more space than a single line. You can use multiline strings to define your commands.\n\n```yaml\ntasks:\n  ...\n  - name: Multiline\n    shell: python\n    run: |\n      import os\n      print(os.environ['NAUMAN_TASK_NAME'])\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Dotenv files\nYou can use dotenv files to define variables for your tasks.\n\n```yaml\noptions:\n  dotenv: /path/to/my_env.env\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Change your working directory\nYou can change your working directory by using the `cwd` option.\n\n```yaml\ncwd: /my/project/dir\n\ntasks:\n  ...\n  - name: Change working directory to /my/project/dir/task1\n    cwd: ./task1\n    run: pwd\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## FAQ\n\n### Why use nauman?\nPicture this: you want to periodically run your tool that syncs your favorite movies between services. This can be done with a cron job, but what if you want, to add more dependent tasks (like, also syncing your movie collections)? Easy, create a shell script that runs them both.\n\nNow you want to keep track of their output (for debugging), you want to add health-checks, single process locking, etc. Shell scripts are not the best way to do this and can easily get very messy.\n\nWith `nauman` you can create and run a job file that covers it all in a readable and maintainable way.\n\nAdditionally `nauman` is written in Rust and can be installed bloat free onto any system as a simple binary. (See [Installation](#installation) for more details).\n\n### When not to use nauman?\nYou should not use `nauman` for tasks where you need:\n\n* A makefile:\n  * `nauman` is not meant to be a replacement for makefiles.\n  * It is meant to run a job to automate one single chain of tasks.\n  * It does not support task parallelism, recursion or other complex workflows.\n* A data automation tool:\n  * `nauman` is not meant to be a replacement for data automation tools.\n  * It can be used to chain multiple data processing tasks together.\n  * But it does not provide anything for data loading, data processing or visualization.\n* A CI tool:\n  * `nauman` is not meant to be a replacement for CI tools.\n  * It does not include any CI-specific features such as caching, build uploads or integrations with build tools.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Installation\nThe binary name for nauman is `nauman`.\n\n[Archives of precompiled binaries for nauman are available for Windows, macOS and Linux. Linux and Windows binaries are static executables.](https://github.com/EgorDm/nauman/releases) Users of platforms not explicitly mentioned below are advised to download one of these archives.\n\nIf you're a Rust programmer, nauman can be installed with cargo.\n\n* Note that numane is tested with Rust 1.57.0, although nauman may work with older versions.\n* Note that the binary may be bigger than expected because it contains debug symbols. This is intentional. To remove debug symbols and therefore reduce the file size, run strip on the binary.\n\n```shell\n$ cargo install nauman\n```\n\n### Building from source\nnauman is written in Rust, so you'll need to grab a [Rust installation](https://www.rust-lang.org/) in order to compile it. nauman compiles with Rust 1.57.0 (stable) or newer. In general, nauman tracks the latest stable release of the Rust compiler.\n\nTo build nauman:\n```shell\n$ git clone https://github.com/EgorDm/nauman\n$ cd nauman\n$ cargo build --release\n$ ./target/release/nauman --version\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Usage\nThe usual way to invoke `nauman` is to use the `nauman \u003cjob_file\u003e` command. If you want to specify more options or to override some job settings, refer to the below full usage:\n\n\u003cpre\u003e\n\u003cspan style=\"color: #F1FA8C\"\u003eUSAGE:\u003c/span\u003e\n    nauman [OPTIONS] \u0026lt;JOB\u0026gt;\n\n\u003cspan style=\"color: #F1FA8C\"\u003eARGS:\u003c/span\u003e\n    \u003cspan style=\"color: #50FA7B\"\u003e\u0026lt;JOB\u0026gt;\u003c/span\u003e    Path to job yaml file\n\n\u003cspan style=\"color: #F1FA8C\"\u003eOPTIONS:\u003c/span\u003e\n        \u003cspan style=\"color: #50FA7B\"\u003e--ansi\u003c/span\u003e \u003cspan style=\"color: #50FA7B\"\u003e\u0026lt;ANSI\u0026gt;\u003c/span\u003e                Include ansi colors in output (default: true)\n        \u003cspan style=\"color: #50FA7B\"\u003e--dry-run\u003c/span\u003e \u003cspan style=\"color: #50FA7B\"\u003e\u0026lt;DRY_RUN\u0026gt;\u003c/span\u003e          Dry run to check job configuration (default: false)\n    \u003cspan style=\"color: #50FA7B\"\u003e-e\u003c/span\u003e \u003cspan style=\"color: #50FA7B\"\u003e\u0026lt;ENV\u0026gt;\u003c/span\u003e                         List of env variable overrides\n    \u003cspan style=\"color: #50FA7B\"\u003e-h\u003c/span\u003e, \u003cspan style=\"color: #50FA7B\"\u003e--help\u003c/span\u003e                       Print help information\n    \u003cspan style=\"color: #50FA7B\"\u003e-l\u003c/span\u003e, \u003cspan style=\"color: #50FA7B\"\u003e--level\u003c/span\u003e \u003cspan style=\"color: #50FA7B\"\u003e\u0026lt;LEVEL\u0026gt;\u003c/span\u003e              A level of verbosity, and can be used multiple times (default:\n                                     info) [possible values: debug, info, warn, error]\n        \u003cspan style=\"color: #50FA7B\"\u003e--log-dir\u003c/span\u003e \u003cspan style=\"color: #50FA7B\"\u003e\u0026lt;LOG_DIR\u0026gt;\u003c/span\u003e          Directory to store logs in (default: current directory)\n        \u003cspan style=\"color: #50FA7B\"\u003e--system-env\u003c/span\u003e \u003cspan style=\"color: #50FA7B\"\u003e\u0026lt;SYSTEM_ENV\u0026gt;\u003c/span\u003e    Whether to use system environment variables (default: true)\n    \u003cspan style=\"color: #50FA7B\"\u003e-V\u003c/span\u003e, \u003cspan style=\"color: #50FA7B\"\u003e--version\u003c/span\u003e                    Print version information\n\u003c/pre\u003e\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## [Job Syntax](https://github.com/EgorDm/nauman/blob/master/JOB_SYNTAX.md)\n\n## Alternatives\nIf this is not what you are looking for, check out these cool alternatives:\n* Bash or Makefile\n* [just](https://github.com/casey/just) - is a handy way to save and run project-specific commands\n* [fastlane](https://github.com/fastlane/fastlane) - is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application\n* [Apache Airflow](https://airflow.apache.org/) - is a platform created by the community to programmatically author, schedule and monitor workflows.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## TODO\n* [x] Add support for .env files\n* [ ] Add more tests\n* [ ] Add a way to natively run web requests\n* [x] Add a way to write outputs of different tasks\n* [ ] Add a templating system\n* [ ] Add a way to specify per log whether ansi is enabled or not\n* [ ] Add flock support\n* [ ] Always add console logging (only specify whether stdout and stderr should be logged)\n\n## Contributing\n\nAs this is a hobby project, contributions are very welcome!\n\nThe easiest way for you to contribute right now is to use nauman, and see where it's lacking. \n\nIf you have a use case nauman does not cover, please file an issue. This is immensely useful to me, to anyone wanting to contribute to the project, and to you as well if the feature is implemented.\n\nIf you're interested in helping fix an [existing issue](https://github.com/EgorDm/nauman/issues), or an issue you just filed, help is appreciated.\n\nSee [CONTRIBUTING](./CONTRIBUTING.md) for technical information on contributing.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## License\n\nThis project is licensed under the terms of the MIT license. See the [LICENSE](LICENSE) file.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fegordm%2Fnauman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fegordm%2Fnauman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fegordm%2Fnauman/lists"}