bestool 1.10.0

BES Deployment tooling
Documentation
# bestool

All-in-one tool for BES ops and dev tasks.

It manifests as a single binary that can be easily uploaded to Windows machines, or downloaded from the internet, and also works cross-platform on Linux and Mac for many tasks.

See `bestool <subcommand> --help` for extensive help.

## Download

| Platform | Variant | Download |
| -------- | ------- | -------- |
| Windows | x86 | [bestool.exe](https://tools.ops.tamanu.io/bestool/latest/x86_64-pc-windows-msvc/bestool.exe) |
| Linux | x86 | [bestool](https://tools.ops.tamanu.io/bestool/latest/x86_64-unknown-linux-gnu/bestool) |
| Linux | x86 static | [bestool](https://tools.ops.tamanu.io/bestool/latest/x86_64-unknown-linux-musl/bestool) |
| Linux | ARM64 | [bestool](https://tools.ops.tamanu.io/bestool/latest/aarch64-unknown-linux-musl/bestool) |
| Mac | Intel | [bestool](https://tools.ops.tamanu.io/bestool/latest/x86_64-apple-darwin/bestool) |
| Mac | ARM64 | [bestool](https://tools.ops.tamanu.io/bestool/latest/aarch64-apple-darwin/bestool) |

These URLs always point to the latest release. Pin to a specific version with `https://tools.ops.tamanu.io/bestool/<version>/<target>/bestool`.

### Self-update

If you already have bestool, it can self-update to the latest version:

```console
$ bestool self-update
```

### APT repository

If you're on Debian or a derivative, you can use our APT repo:

```bash
curl -fsSL https://tools.ops.tamanu.io/apt/bes-tools.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/bes-tools.gpg
echo "deb [signed-by=/etc/apt/keyrings/bes-tools.gpg] https://tools.ops.tamanu.io/apt stable main" | sudo tee /etc/apt/sources.list.d/bes-tools.list
sudo apt-get update
sudo apt-get install bestool
```

### In GitHub Actions

```yaml
- name: Download bestool
  shell: bash
  run: |
    curl -Lo ${{ runner.os == 'Windows' && 'bestool.exe' || 'bestool' }} https://tools.ops.tamanu.io/bestool/gha/${{ runner.os }}-${{ runner.arch }}?bust=${{ github.run_id }}
    [[ -f bestool ]] && chmod +x bestool

- name: Use bestool
  shell: bash
  run: |
    bestool=bestool
    [[ ${{ runner.os }} == "Windows" ]] && bestool=bestool.exe
    ./$bestool --version # or something more useful
```

Or combined:

```yaml
- name: Download bestool
  shell: bash
  run: |
    bestool=bestool
    [[ ${{ runner.os }} == "Windows" ]] && bestool=bestool.exe
    curl -Lo $bestool https://tools.ops.tamanu.io/bestool/gha/${{ runner.os }}-${{ runner.arch }}?bust=${{ github.run_id }}
    [[ -f bestool ]] && chmod +x bestool
    ./$bestool --version # or something more useful
```

### With [Binstall](https://github.com/cargo-bins/cargo-binstall)

```console
$ cargo binstall bestool
```

### With cargo (compiling)

```console
$ cargo install bestool
```

## Development

Install [rust](https://rustup.rs), clone the repo, then run:

```console
$ cargo check
```

To run the tool:

```console
$ cargo run -- --help
```

To build the tool like for production:

```console
$ cargo build --release
```

Commits should follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format.

### Releasing

Releases are automated by [release-plz](https://release-plz.dev). Pushing to `main` opens a `repo: release` PR with per-crate version bumps determined from conventional commits and `cargo-semver-checks`; merging that PR (auto-merge is enabled once CI is green) publishes the affected crates to crates.io, pushes per-crate tags, and triggers the binary-build workflows.

#### Holding a release

To bundle several features or fixes into one release, add the `release-hold` label to the open `repo: release` PR. The CI turns auto-merge off when the label is added and won't turn it back on while the label is present, so subsequent merges to `main` keep updating the PR without shipping it. When you're ready to ship, remove the label and either queue the PR manually or push another commit to `main` to let the workflow re-enable auto-merge. (Don't rely on removing the `autorelease` label; release-plz re-adds it whenever it updates the PR.)