{"id":13764152,"url":"https://github.com/gulien/orbit","last_synced_at":"2026-03-11T00:32:38.686Z","repository":{"id":54978311,"uuid":"91169377","full_name":"gulien/orbit","owner":"gulien","description":":satellite: A cross-platform task runner for executing commands and generating files from templates","archived":false,"fork":false,"pushed_at":"2021-01-18T11:35:49.000Z","size":3995,"stargazers_count":188,"open_issues_count":3,"forks_count":10,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-12-22T11:16:02.229Z","etag":null,"topics":["go","golang","task-runner","template"],"latest_commit_sha":null,"homepage":"","language":"Go","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/gulien.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-13T11:25:00.000Z","updated_at":"2025-08-24T16:28:26.000Z","dependencies_parsed_at":"2022-08-14T08:00:48.841Z","dependency_job_id":null,"html_url":"https://github.com/gulien/orbit","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/gulien/orbit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gulien%2Forbit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gulien%2Forbit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gulien%2Forbit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gulien%2Forbit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gulien","download_url":"https://codeload.github.com/gulien/orbit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gulien%2Forbit/sbom","scorecard":{"id":449036,"data":{"date":"2025-08-11","repo":{"name":"github.com/gulien/orbit","commit":"2fd5fb20605581d22a3049a620c168ab9cbf3279"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":1,"reason":"Found 5/30 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v3.3.0 not signed: https://api.github.com/repos/gulien/orbit/releases/36544565","Warn: release artifact v3.2.0 not signed: https://api.github.com/repos/gulien/orbit/releases/11517576","Warn: release artifact v3.1.0 not signed: https://api.github.com/repos/gulien/orbit/releases/10795466","Warn: release artifact v3.0.2 not signed: https://api.github.com/repos/gulien/orbit/releases/10673122","Warn: release artifact v3.0.1 not signed: https://api.github.com/repos/gulien/orbit/releases/10536700","Warn: release artifact v3.3.0 does not have provenance: https://api.github.com/repos/gulien/orbit/releases/36544565","Warn: release artifact v3.2.0 does not have provenance: https://api.github.com/repos/gulien/orbit/releases/11517576","Warn: release artifact v3.1.0 does not have provenance: https://api.github.com/repos/gulien/orbit/releases/10795466","Warn: release artifact v3.0.2 does not have provenance: https://api.github.com/repos/gulien/orbit/releases/10673122","Warn: release artifact v3.0.1 does not have provenance: https://api.github.com/repos/gulien/orbit/releases/10536700"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating golang:1.10-stretch to golang:1.10-stretch@sha256:38d06fda52c0bb3682c0b373fe056ced88b70e8b297ea4da9fac661f5b13d71b","Warn: goCommand not pinned by hash: Dockerfile:6-7","Warn: downloadThenRun not pinned by hash: Dockerfile:10","Info:   1 out of   2 goCommand dependencies pinned","Info:   0 out of   1 downloadThenRun dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: CVE-2021-28484"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 16 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T07:40:29.755Z","repository_id":54978311,"created_at":"2025-08-19T07:40:29.755Z","updated_at":"2025-08-19T07:40:29.755Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30363916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["go","golang","task-runner","template"],"created_at":"2024-08-03T15:01:16.819Z","updated_at":"2026-03-11T00:32:38.670Z","avatar_url":"https://github.com/gulien.png","language":"Go","readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://user-images.githubusercontent.com/8983173/37715581-ae698ff2-2d1c-11e8-906a-16a84837c964.png\" alt=\"orbit's logo\" width=\"250\" height=\"148\" /\u003e\n\u003c/p\u003e\n\u003ch3 align=\"center\"\u003eOrbit\u003c/h3\u003e\n\u003cp align=\"center\"\u003eA cross-platform task runner for executing commands and generating files from templates\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://travis-ci.org/gulien/orbit\"\u003e\n        \u003cimg src=\"https://travis-ci.org/gulien/orbit.svg?branch=master\" alt=\"Travis CI\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://ci.appveyor.com/project/gulien/orbit\"\u003e\n        \u003cimg src=\"https://ci.appveyor.com/api/projects/status/fj6q6y75vdugn99i/branch/master?svg=true\" alt=\"AppVeyor\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://godoc.org/github.com/gulien/orbit\"\u003e\n        \u003cimg src=\"https://godoc.org/github.com/gulien/orbit?status.svg\" alt=\"GoDoc\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://goreportcard.com/report/gulien/orbit\"\u003e\n        \u003cimg src=\"https://goreportcard.com/badge/github.com/gulien/orbit\" alt=\"Go Report Card\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://codecov.io/gh/gulien/orbit/branch/master\"\u003e\n        \u003cimg src=\"https://codecov.io/gh/gulien/orbit/branch/master/graph/badge.svg\" alt=\"Codecov\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nOrbit started with the need to find a cross-platform alternative of `make`\nand `sed -i` commands. As it does not aim to be as powerful as these two\ncommands, Orbit offers an elegant solution for running tasks and generating\nfiles from templates, whatever the platform you're using.\n\n# Menu\n\n* [Install](#install)\n* [Generating a file from a template](#generating-a-file-from-a-template)\n* [Defining and running tasks](#defining-and-running-tasks)\n\n## Install\n\nDownload the latest release of Orbit from the [releases page](../../releases).\nYou can get Orbit for a large range of OS and architecture.\n\nThe file you downloaded is a compressed archive. You'll need to extract the\nOrbit binary and move it into a folder where you can execute it easily.\n\n**Linux/MacOS:**\n\n```\ntar -xzf orbit*.tar.gz orbit\nsudo mv ./orbit /usr/local/bin \u0026\u0026 chmod +x /usr/local/bin/orbit\n```\n\n**Windows:**\n\nRight click on the file and choose *Extract All*.\n\nMove the binary to a folder like `C:\\Orbit`.\nThen, add it in your Path system environment variables. Click\n*System, Advanced system settings, Environment Variables*... and\nopen *Path* under *System variables*. Edit the *Variable value* by adding\nthe folder with the Orbit binary.\n\nAlright, you're almost done :metal:! Let's check your installation by running:\n\n```\norbit version\n```\n\n## Generating a file from a template\n\nOrbit uses the *Go* package `text/template` under the hood as a template\nengine. It provides a interesting amount of logic for your templates.\n\nThe [Go documentation](https://golang.org/pkg/text/template/) and the\n[Hugo documentation](http://gohugo.io/templates/go-templates/) cover\na lot of features that aren't mentioned here. Don't hesitate to take a look\nat these links to understand the *Go* template engine! :smiley:\n\nAlso, Orbit provides [Sprig](http://masterminds.github.io/sprig/) library\nand three custom functions:\n\n* `os` which returns the current OS name at runtime (you may find all available names in the\n[official documentation](https://golang.org/doc/install/source#environment)).\n* `verbose` which returns `true` if logging is set to info level.\n* `debug` which returns `true` if logging is set to debug level.\n\n### Command description\n\n#### Base\n\n```\norbit generate [flags]\n```\n\n#### Flags\n\n##### `-f --file`\n\nSpecify the path of the template. This flag is **required**.\n\n##### `-o --output`\n\nSpecify the output file which will be generated from the template.\n\n**Good to know:** if no output is specified, Orbit will print the result to *Stdout*.\n\n##### `-p --payload`\n\nThe flag `-p` allows you to specify many data sources which will be applied to your template:\n\n```\norbit generate [...] -p \"key_1,file_1.yml\"\norbit generate [...] -p \"key_1,file_1.yml;key_2,file_2.toml;key_3,file_3.json;key_4,.env;key_5,some raw data\"\n```\n\nAs you can see, Orbit handles 5 types of data sources:\n\n* *YAML* files (`*.yaml`, `*.yml`)\n* *TOML* files (`*.toml`)\n* *JSON* files (`*.json`)\n* *.env* files\n* raw data\n\nThe data will be accessible in your template through `{{ .Orbit.my_key.my_data }}`.\n\nIf you don't want to specify the payload each time your running `orbit generate`,\nyou may also create a file named `orbit-payload.yml` in the folder where your running your command:\n\n```yaml\npayload:\n\n    - key: my_key\n      value: my_file.yml\n      \n    - key: my_other_key\n      value: Some raw data\n```\n\nBy doing so, running `orbit generate [...]` will be equivalent to \nrunning `orbit generate [...] -p \"my_key,my_file.yml;my_other_key,Some raw data\"`.\n\n**Note:** you are able to override a data source from the file `orbit-payload.yml` if\nyou set the same key in the `-p` flag.\n\n##### `-t --templates`\n\nThe flag `-t` allows you to specify additional templates which are used in your template:\n\n```\norbit generate [...] -t \"template_1.txt\"\norbit generate [...] -t \"template_1.txt,template_2.yml\"\norbit generate [...] -t \"template_1.txt,template_2.yml,../../template_3.toml\"\n```\n\nSo, in order to generate a file from this template:\n\n```\n{{ template \"additional_template.txt\" }}\n```\n\nYou should run:\n\n```\norbit generate [...] -t \"path/to/additional_template.txt\"\n```\n\nIf you don't want to specify the templates each time your running `orbit generate`,\nyou may also use the file `orbit-payload.yml` in the folder where your running your command:\n\n```yaml\npayload:\n\n[...]\n\ntemplates:\n\n  - template_1.txt\n  - template_2.yml\n```\n\nBy doing so, running `orbit generate [...]` will be equivalent to \nrunning `orbit generate [...] -t \"template_1.txt,template_2.yml\"`.\n\n##### `--delimiters`\n\nThe flag `--delimiters` allows you to specify an alternative template delimiter pair (left/open, right/close). If unspecified, the Go defaults (`{{` and `}}`) will be used. Note that, if this option is used, _exactly_ two delimiters must be specified.\n\nExamples:\n```\norbit generate [...] --delimiters \"\u003c\u003c,\u003e\u003e\"\norbit generate [...] --delimiters \"\u003c\u003c\" --delimiters \"\u003e\u003e\"\n```\nThe first delimiter (`\u003c\u003c` in the examples above) is used for the left/opening delimiter while the second delimiter (`\u003e\u003e` in the examples above) is used for the right/closing delimiter. This applies regardless of whether the delimiters are specified as a comma-separated pair (first example) or by repeated use of the option (second example).\n\n##### `-v --verbose`\n\nSets logging to info level.\n\n##### `-d --debug`\n\nSets logging to debug level.\n\n### Basic example\n\nLet's create our simple template `template.yml`:\n\n```yaml\ncompanies:\n\n{{- range $company := .Orbit.Values.companies }}\n  - name: {{ $company.name }}\n    launchers:\n  {{- range $launcher := $company.launchers }}\n    - {{ $launcher }}\n  {{ end }}\n{{- end }}\n```\n\nAnd the data provided a *YAML* file named `data-source.yml`:\n\n```yaml\ncompanies:\n\n  - name: SpaceX\n    launchers:\n      - Falcon 9\n      - Falcon Heavy\n      \n  - name: Blue Origin\n    launchers:\n      - New Shepard\n      - New Glenn\n\nagencies:\n\n  - name: ESA\n    launchers:\n      - Ariane 5\n      - Vega\n```\n\nThe command for generating a file from this template is quite simple:\n\n```\norbit generate -f template.yml -p \"Values,data-source.yml\" -o companies.yml\n```\n\nThis command will create the `companies.yml` file with this content:\n\n```yaml\ncompanies:\n\n  - name: SpaceX\n    launchers:\n      - Falcon 9\n      - Falcon Heavy\n      \n  - name: Blue Origin\n    launchers:\n      - New Shepard\n      - New Glenn\n```\n\n## Defining and running tasks\n\n### Command description\n\n#### Base\n\n```\norbit run [tasks] [flags]\n```\n\n#### Flags\n\n##### `-f --file`\n\nLike the `make` command with its `Makefile`, Orbit requires a\nconfiguration file (*YAML*, by default `orbit.yml`) where you define\nyour tasks:\n\n```yaml\ntasks:\n\n  - use: my_first_task\n    short: My first task short description\n    run:\n      - command [args]\n      - command [args]\n      - ...\n      \n  - use: my_second_task\n    private: true\n    run:\n      - command [args]\n      - command [args]\n      - ...\n```\n\n* the `use` attribute is the name of your task.\n* the `short` attribute is optional and is displayed when running `orbit run`.\n* the `private` attribute is optional and hides the considered task when running `orbit run`.\n* the `run` attribute is the stack of commands to run.\n* a command is a binary which is available in your `$PATH`.\n\nOnce you've created your `orbit.yml` file, you're able\nto run your tasks with:\n\n```\norbit run my_first_task\norbit run my_second_task\norbit run my_first_task my_second_task\n```\n\nNotice that you may run nested tasks :metal:!\n\nAlso a cool feature of Orbit is its ability to read its configuration through\na template.\n\nFor example, if you need to execute a platform specific script, you may write:\n\n```yaml\ntasks:\n\n  - use: script\n    run:\n    {{ if ne \"windows\" os }}\n      - my_script.sh\n    {{ else }}\n      - .\\my_script.bat\n    {{ end }}\n```\n\nOrbit will automatically detect the shell you're using (with the `SHELL` environment variable on POSIX system \nand `COMSPEC` on Windows). \n\nRunning the task `script` from the previous example will in fact executes `cmd.exe /c .\\my_script.bat` on\nWindows or `/bin/sh -c my_script.sh` (or `/bin/zsh -c my_script.sh` etc.) on others OS.\n\nOf course, if you want to specify the binary which is calling your commands, there is a `shell` attribute available:\n\n```yaml\ntasks:\n\n  - use: script\n    shell: /bin/bash -c\n    run:\n      - command [args]\n      - ...\n```\n\nLast but not least, a task is able to call others tasks within the same context thanks to the `run` function:\n\n```yaml\ntasks:\n\n  - use: task\n    run:\n      - {{ run \"subtask_1\" \"subtask_2\" }}\n\n  - use: subtask_1\n    run:\n      - command [args]\n      - ...\n     \n  - use: subtask_2\n    run:\n      - command [args]\n      - ...\n```\n\n##### `-p --payload`\n\nThe flag `-p` allows you to specify many data sources which will be applied to your configuration file.\n\nIt works the same as the `-p` flag from the `generate` command.\n\nOf course, you may also create a file named `orbit-payload.yml` in the same folder where you're executing Orbit.\n\n##### `-t --templates`\n\nThe flag `-t` allows you to specify additional templates which are used in your configuration file.\n\nIt works the same as the `-t` flag from the `generate` command.\n\nOf course, you may also create a file named `orbit-payload.yml` in the same folder where you're executing Orbit.\n\n##### `-v --verbose`\n\nSets logging to info level.\n\n##### `-d --debug`\n\nSets logging to debug level.\n\n### Basic example\n\nLet's create our simple configuration file `orbit.yml`:\n\n```yaml\ntasks:\n\n  - use: prepare\n    run:\n     - orbit generate -f configuration.template.yml -o configuration.yml -p \"Data,config.json\"\n     - echo \"configuration.yml has been succesfully created!\"\n```\n\nYou are now able to run the task `prepare` with:\n\n```\norbit run prepare\n```\n\nThis task will:\n\n* create a file named `configuration.yml`\n* print `configuration.yml has been succesfully created!` to *Stdout*\n\n\nVoilà! :smiley:\n\n---\n\nWould you like to update this documentation ? Feel free to open an [issue](../../issues).\n","funding_links":[],"categories":["软件包","Software Packages","Go Tools","Go 工具","Other Software"],"sub_categories":["其他软件库和软件包","其他软件","Other Software"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgulien%2Forbit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgulien%2Forbit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgulien%2Forbit/lists"}