{"id":13542545,"url":"https://github.com/cloud66-oss/trackman","last_synced_at":"2026-03-12T06:39:08.305Z","repository":{"id":83705809,"uuid":"179584237","full_name":"cloud66-oss/trackman","owner":"cloud66-oss","description":"Execute commands as a workflow.","archived":false,"fork":false,"pushed_at":"2024-03-01T09:59:28.000Z","size":1928,"stargazers_count":199,"open_issues_count":2,"forks_count":9,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-12-16T03:10:11.947Z","etag":null,"topics":["golang","internal","tools"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cloud66-oss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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}},"created_at":"2019-04-04T22:07:53.000Z","updated_at":"2025-11-23T06:40:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"3968d4d5-07e6-4abb-8f24-242d4247b806","html_url":"https://github.com/cloud66-oss/trackman","commit_stats":null,"previous_names":["cloud66/trackman"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/cloud66-oss/trackman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud66-oss%2Ftrackman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud66-oss%2Ftrackman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud66-oss%2Ftrackman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud66-oss%2Ftrackman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloud66-oss","download_url":"https://codeload.github.com/cloud66-oss/trackman/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud66-oss%2Ftrackman/sbom","scorecard":{"id":292287,"data":{"date":"2025-08-11","repo":{"name":"github.com/cloud66-oss/trackman","commit":"d2e7f1381995c6699850d97a77313fc65b8360e2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 2/23 approved changesets -- score normalized to 0","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":"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":"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":"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":"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":"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":"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":"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":"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: Apache License 2.0: 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 1.0.4 not signed: https://api.github.com/repos/cloud66-oss/trackman/releases/23562717","Warn: release artifact 1.0.3 not signed: https://api.github.com/repos/cloud66-oss/trackman/releases/23549456","Warn: release artifact 1.0.2 not signed: https://api.github.com/repos/cloud66-oss/trackman/releases/22390712","Warn: release artifact 1.0.1 not signed: https://api.github.com/repos/cloud66-oss/trackman/releases/21016842","Warn: release artifact 1.0.0 not signed: https://api.github.com/repos/cloud66-oss/trackman/releases/20957336","Warn: release artifact 1.0.4 does not have provenance: https://api.github.com/repos/cloud66-oss/trackman/releases/23562717","Warn: release artifact 1.0.3 does not have provenance: https://api.github.com/repos/cloud66-oss/trackman/releases/23549456","Warn: release artifact 1.0.2 does not have provenance: https://api.github.com/repos/cloud66-oss/trackman/releases/22390712","Warn: release artifact 1.0.1 does not have provenance: https://api.github.com/repos/cloud66-oss/trackman/releases/21016842","Warn: release artifact 1.0.0 does not have provenance: https://api.github.com/repos/cloud66-oss/trackman/releases/20957336"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: goCommand not pinned by hash: vendor/github.com/pelletier/go-toml/benchmark.sh:10","Warn: goCommand not pinned by hash: vendor/github.com/pelletier/go-toml/benchmark.sh:11","Info:   0 out of   2 goCommand 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 10 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"}},{"name":"Vulnerabilities","score":0,"reason":"18 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8","Warn: Project is vulnerable to: GO-2021-0061 / GHSA-r88r-gmrh-7j83","Warn: Project is vulnerable to: GO-2022-0956 / GHSA-6q6q-88xp-6f2r","Warn: Project is vulnerable to: GO-2020-0036 / GHSA-wxc4-f4m6-wwqv","Warn: Project is vulnerable to: GO-2020-0015 / GHSA-5rcv-m4m3-hfh7","Warn: Project is vulnerable to: GO-2021-0113 / GHSA-ppp9-7jff-5vj2","Warn: Project is vulnerable to: GO-2022-1059 / GHSA-69ch-w2m2-3vjp","Warn: Project is vulnerable to: GO-2022-0209 / GHSA-r5c5-pr8j-pfp7","Warn: Project is vulnerable to: GO-2023-1992 / GHSA-x3jr-pf6g-c48f","Warn: Project is vulnerable to: GO-2022-0229 / GHSA-cjjc-xp8v-855w","Warn: Project is vulnerable to: GO-2020-0012 / GHSA-ffhg-7mh4-33c4","Warn: Project is vulnerable to: GO-2021-0227 / GHSA-3vm4-22fp-5rfm","Warn: Project is vulnerable to: GO-2022-0968 / GHSA-gwc9-m7rh-j2ww","Warn: Project is vulnerable to: GO-2021-0356 / GHSA-8c26-wmh5-6g9v","Warn: Project is vulnerable to: GO-2024-2961","Warn: Project is vulnerable to: GO-2023-2402 / GHSA-45x7-px36-x8w8","Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T18:34:28.439Z","repository_id":83705809,"created_at":"2025-08-17T18:34:28.439Z","updated_at":"2025-08-17T18:34:28.439Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30417521,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T04:41:02.746Z","status":"ssl_error","status_checked_at":"2026-03-12T04:40:12.571Z","response_time":114,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["golang","internal","tools"],"created_at":"2024-08-01T10:01:10.235Z","updated_at":"2026-03-12T06:39:08.288Z","avatar_url":"https://github.com/cloud66-oss.png","language":"Go","funding_links":[],"categories":["Go","golang"],"sub_categories":[],"readme":"\u003cimg src=\"http://cdn2-cloud66-com.s3.amazonaws.com/images/oss-sponsorship.png\" width=150/\u003e\n\n# Trackman\n\nTrackman is a command line tool and Go library that runs multiple commands in a workflow. It support parallel steps, step dependencies, async steps and success checkers.\n\n## Install\n\nHead to [Trackman's releases](https://github.com/cloud66-oss/trackman/releases/latest) and install download the executable for your OS / Architecture. Your version will be updated to the latest version after the first run, so don't worry about the version you pickup first.\n\n## Use\n\nUsing Trackman is simple. It uses a YAML file to describe the steps to run and runs them. Here is an example `workflow.yml` file:\n\n```yaml\nversion: 1\nsteps:\n  - name: list\n    command: ls -la\n  - name: env\n    command: echo $USER\n```\n\nSave this file as `workflow.yml` and run it:\n\n```bash\n$ trackman run -f workflow.yml\n```\n\nAlternatively you can pipe in the workflow into Trackman:\n\n```bash\n$ cat workflow.yml | trackman apply -f -\n```\n\nThis will run both steps in parallel.\n\n### Dependency\n\nSteps can be made dependent to each other:\n\n```yaml\nversion: 1\nsteps:\n  - name: list\n    command: ls -la\n  - name: env\n    command: echo $USER\n    depends_on:\n      - list\n```\n\nIn the example above, `env` will only run once `list` is finished successfully.\n\nYou can make a step dependent on more than one step. Such step will only run once all of the dependee steps have finished successfully.\n\n### Success and Failure\n\nBy default a step is considered successfully finished when it's done with an exit status of 0.\n\nSometimes however, there are tasks that run asynchronously and return with 0 immediately but their success will be known later. For example when `kubectl` applies a new configuration to a cluster, its success cannot be determined by the exit status. Trackman supports this by running **probes**.\n\n```yaml\nversion: 1\nsteps:\n  - name: deploy\n    command: kubectl apply -f manifest.yml\n    probe:\n      command: kubectl wait --for=condition=complete job/myjob\n```\n\nThis workflow will run `kubectl apply -f manifest.yml` first. If it returns with exit status 0 (it ran successfully), will then run `kubectl wait --for=condition=complete job/myjob` until it returns with exit status 0 and considers the step successful.\n\nTrackman can continue running if a step fails if the step has a `continue_on_fail: true`.\n\n### Timeouts\n\nBy default Trackman waits for 10 seconds for each step to complete. If the step fails to complete within 10 seconds, it will consider it failed. This is the same for probes: all probes should return within 10 seconds.\n\nYou can change the timeout per step using the `timeout` attribute:\n\n```yaml\nversion: 1\nsteps:\n  - name: dopy\n    command: sleep 60\n    timeout: 30s\n```\n\nProbes share their step's timeout.\n\n### Metadata\n\nYou can add metadata to the workflow file as well as each step. Metadata can be used in step arguments.\n\n```yaml\nversion: 1\nmetadata:\n    foo: bar\nsteps:\n  - name: list\n    metadata:\n      fuzz: buzz\n    command: ls -la\n```\n\nYou can use the metadata as arguments of a step:\n\n```yaml\n  - name: dump\n    metadata:\n      foo: bar\n    command: \"echo {{ index .Metadata \\\"foo\\\" }}\"\n```\n\nTrackman can use Golang template language.\n\n`Metadata` is an attribute on both Step and the entire workflow. You can use `MergedMetadata` instead of `Metadata` to gain access to a merged list of meta data from the step and the workflow. If any value is defined in both places, step will override workflow.\n\n### Work directory\n\nTo set the working directory of a step, use `workdir` attribute on a step.\n\n### Environment Variables\n\nAll environment variables in commands and their arguments are replaced with `$` values. For example `$HOME` will be replaced with the right home directory address. This is the same for all environment variables available to Trackman at the time it starts.\n\nAll environment variables available to Trackman when it starts will be passed on to the step commands.\n\nTo specify environment variables that are applies only to a single step, use the `env` attribute:\n\n```yaml\n  - name: dump\n    env: [\"FOO=BAR\"]\n```\n\nIf the assigned environment variable already exists, it will overwrite the OS environment variable for this step.\n\n### Preflight Checks\n\nYou can run some checks before the workflow starts. These could be checking for certain binaries or packages to be installed on the machine before the workflow starts.\nEach step can have one or more preflight checks. The workflow will run all preflight checks before starting to run the steps. If any of the preflight checks fail, the workflow will not start.\n\nSuccess of a preflight check is based on the exit status. You can also assign an optional friendly message to each preflight check to be displayed in the event of a failure.\n\n```yaml\nsteps:\n  - name: list\n    command: ls -la\n    preflights:\n      - command: true\n        message: \"Oh nose!\"\n```\n\n## Workflow Attributes\n\nThe following attributes can be set for the workflow:\n\n| Attribute  | Description  | Default  |\n|---|---|---|\n| version  | Workflow format version | `1` |\n| version  | Any metadata for the workflow | None |\n| steps  | List of all workflow steps (See below) | [] |\n| logger | Workflow Logger | Default Logger (see below) |\n| SessionID | Auto generated 8 digit value for each run of the workflow | Generated |\n\n## Step Attributes\n\nThe following attributes can be set for each step:\n\n| Attribute  | Description  | Default  |\n|---|---|---|\n| metadata  | Any metadata for the step  | None |\n| name  | Given name for the step  | `''` |\n| command  | Command to run, including arguments  | `''` |\n| continue_on_fail  | Continue to the next step even after failure  | `false` |\n| timeout  | Timeout after which the step will be stopped. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".   | Never |\n| workdir  | Work directory for the step | None |\n| probe  | Health probe definition. See above | None |\n| depends_on  | List of the steps this one depends on (should run after all of them have successfully finished) | [] |\n| preflights  | List of pre-flight checks (see above) | None |\n| ask_to_proceed  | Stops the execution of the workflow and asks the user for a confirmation to continue | `false` |\n| show_command  | Shows the command and arguments for this step before running it | `false` |\n| disabled | Disables the step (doesn't run it). This can be used for debugging or other selective workflow manipulations | `false` |\n| env | Environment variables specific to this step | [] |\n| logger | Step logger | Workflow logger (see below) |\n| SessionID | Auto generated 8 digit value for each run of the workflow | Same as Workflow |\n\n## Trackman CLI\n\n### Global Options\n\nThe CLI supports the following global options:\n\n| Option  | Description  | Default  |\n|---|---|---|\n| config  | Config file | $HOME/.trackman.yaml |\n| log-level  | Log level | `info` |\n| log-type  | Log Type. Valid options are `stdout`, `stderr`, `discard`, `file` | `stdout` |\n| log-format  | Log Format. Valid options are `text` and `json` | `text` |\n| log-file  | Log File. If `file` is used as `log-type` then this is used as the filename (path can be included) |  |\n| no-update  | Don't update trackman CLI automatically | `false` |\n\n### Run\n\nRuns the given workflow. Use `--help` for more details.\n\n```bash\n$ trackman run -f file.yml\n\n$ trackman run -f file.yml -m key1=value -m key2=value\n```\n\n### Params\n\nRun command supports the following options\n\n| Option  | Description  | Default  |\n|---|---|---|\n| file, f  | Workflow file | None |\n| timeout | Timeout after which the step will be stopped. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\". | 10 seconds |\n| concurrency  | Number of concurrent steps to run | Number of CPUs - 1 |\n| yes, y  | Answer Yes to all `ask_to_proceed` questions | false |\n| metadata, m  | Inline global metadata | None |\n\n### Logging\n\nBy default, trackman logs all output to `stdout` and at the `info` level. All logs from all steps are also combined and shown together as they are produced.\n\nYou can specify log configuration at the workflow level or for each individual step. If a step has no specific log configuration, it will inherit the configuration of the workflow. Preflight and Probes use the same log configuration as their step.\n\nLog configuration can be defined with the following options:\n\n| Option  | Description  | Default  |\n|---|---|---|\n| type  | Logger Type. Valid options are `stdout`, `stderr`, `discard` and `file` | `stdout` |\n| level  | Log level. Valid values are `error`, `warn`, `info` and `debug` | `info` |\n| format  | Log Format. Valid options are `text` and `json` | `text` |\n| destination  | Log file (can include path). If type is `file` this is used as the file name. If no path is provided, the current directory is used. | |\n\nHere is an example:\n\n```yaml\nversion: 1\nlogger:\n  type: \"file\"\n  format: \"json\"\n  destination: \"workflow.json\"\nsteps:\n  - name: step1\n    logger:\n      type: \"stdout\"\n  - name: step2\n```\n\nIn the example above, the workflow and step2 share a file called `workflow.json` for logging. Step1 however will log text to `stdout`.\n\nYou can use any attribute from Workflow and Step in naming your log file. Here is an example:\n\n```yaml\nversion: 1\nlogger:\n  type: \"file\"\n  format: \"json\"\n  destination: \"logs/{{ if .Step }}{{.Step.Name}}{{ else }}workflow{{ end }}.json\"\n```\n\nThe example above, will use `workflow.json` for workflow logs but a file named after the step name for each step. You can use Golang templates for this feature. The template is rendered with a context of `Workflow` and `Step` (in the example above, `.Step` is used)\n\nAnother example is to use the Workflow SessionID as log file name:\n\n```yaml\nversion: 1\nlogger:\n  type: \"file\"\n  destination: \"logs/{{.Workflow.SessionID}}.log\"\n```\n\n### Parse\n\nYou can use the `parse` command to see how the workflow input yaml file is parsed and what the placeholders (like environment variables) are replaced with before running them. Use `parse` like `run` but without any `timeout` or `concurrency` options:\n\n```bash\n$ trackman parse -f workflow.yml\n```\n\n### Update\n\nManually checks for updates. It can also switch the current release channel.\n\n```bash\n$ trackman update [--channel name]\n```\n\n### Version\n\nShows the channel and the version\n\n```bash\n$ trackman version\n```\n\n### Help\n\nShows help.\n\n```bash\n$ trackman help\n```\n\n## Update\n\nTrackman updates automatically to the latest available version after each run (except for the `version` command). By default it runs the **stable** channel but you can switch the channel:\n\n```bash\n$ trackman update --channel dev\n```\n\nThis will switch trackman to the **dev** (development) channel and will update it to the latest version of that channel after each run. You can check for updates manually using the `update` command as well. **dev** channel doesn't get automatically updated.\n\n## Release\n\n### Automatic Release\n\nAll commits into `master` are built, tested and released on the `edge` channel.\nAll tags are build, tested and released on the `stable` channel and the binaries are automatically uploaded to Github.\n`dev` branch is not automatically built or released.\n\n### Manual Release\n\nIf you want to release a new version of Trackman manually, follow these steps:\n\n1. Start a new Release in git flow. Make sure the release name is a valid SemVer text like `1.0.0-rc1` or `2.0.4`.\n2. Run `./build.sh CHANNEL`, replacing `CHANNEL` with `dev` or `stable` or `edge`\n3. Run `./publish.sh`. This will upload the compiled binaries (previous step) to s3.\n4. Create a Github release from the tag and upload the binaries to it.\n\nThe last step assumes you have a configured **AWS CLI** installed on your machine with the right permissions to push to `downloads.cloud66.com` bucket.\n\n### Rollback\n\n### Automatic Rollback\n\nOn Builtkite, run the needed release again with `FORCE` environment variable equal to `force`.\n\n### Manual Rollback\n\nIf you need to rollback a release, switch to the right tag and repeat the build / publish steps but run the build step with the `--force` flag:\n\n```bash\n$ ./build.sh CHANNEL --force\n```\n\nHaving the force flag on a release will force all clients to update all the time which is not desired. You will need to take this flag off when the issue is resolved and push a new version out with a higher version.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloud66-oss%2Ftrackman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloud66-oss%2Ftrackman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloud66-oss%2Ftrackman/lists"}