See also CLAUDE.md for the architecture and test commands.
List the available make targets:
makeBuild a single binary:
make singleBuild a snapshot:
make snapshotBuild a snapshot for a vendor:
# Download the config file at internal/config/embedded-config.yaml
make vendor-snapshot VENDOR_NAME='Vendor Name' VENDOR_BINARY='vendorcli'CI builds the CLI for each platform. For pull requests from branches in this repository (not forks), a comment lists the builds, which can be downloaded with a GitHub login for 7 days, e.g.:
gh run download <run-id> -R upsun/cli -n cli-linux-amd64
chmod +x upsun
./upsun --versionOn macOS, if you downloaded a build with a browser, remove the quarantine
attribute first: xattr -d com.apple.quarantine upsun.
The Nightly workflow builds main every day, if it has changed, and replaces the assets of the nightly prerelease in upsun/cli-nightly. It uses a separate repository because releases here are immutable. Its version is the next patch version, e.g. 5.15.3-nightly.20261103+abc1234, and its asset names have nightly in place of the version.
Install it with VERSION=nightly (see install.md), or download it from the release. It only publishes archives and checksums: not packages, Homebrew, Scoop, npm, winget or Docker. Its update check reads stable releases in this repository as usual, so it only shows a notice for a newer stable release.
Run the workflow manually to build again (force), or to build without publishing (dry_run, the assets are kept as a workflow artifact). A run on another branch publishes that branch, until the next scheduled run.
Releases are automated via GitHub Actions. To create a new release:
-
Optionally, write the release notes in a draft release on GitHub. Its title must be exactly the new tag (e.g.
v5.0.0), or the workflow won't find it. Save it as a draft: don't publish it. Releases are immutable, so assets can't be added once a release is published. -
Create and push the tag:
git tag -m 'Release v5.0.0' 'v5.0.0' git push origin v5.0.0
-
The Release workflow will automatically:
- Build binaries for all platforms
- Sign packages (APK, DEB, RPM)
- Upload all artifacts to the draft release (or create one with generated notes), and publish it
- Update package repositories at repositories.upsun.com
- Build and push Docker image to ghcr.io/upsun/cli
- Publish the npm packages
- Submit the winget manifests to microsoft/winget-pkgs
Release notes can still be edited after publishing.