- Ruby 3.2+
- Docker
bundle install
macOS signing additionally requires a macOS host with Xcode command line tools.
| Task | Purpose |
|---|---|
bundle exec rake release |
Download, sign, and build repo metadata |
bundle exec rake deploy |
Push staged packages and metadata to S3 |
bundle exec rake verify |
Verify released packages are accessible in the deployed repos |
bundle exec rake rollback |
Restore repo state from a prior git commit |
bundle exec rake cleanup |
Remove orphaned packages from S3 |
bundle exec rake backup |
Sync S3 repos to GCS backup bucket |
bundle exec rake restore |
Restore S3 repos from GCS backup |
bundle exec rake restore:gcs |
Roll back GCS backup bucket to a point in time |
bundle exec rake reset_test |
Sync test buckets from production (with --delete) and clear local staging |
bundle exec rake reset |
Remove cached container, image, and Docker build cache |
bundle exec rake repo_packages:build |
Build and sign repo RPM/DEB packages and repo/list files |
bundle exec rake repo_packages:upload |
Upload repo package artifacts to S3 |
bundle exec rake repo_packages:add_platform |
Add a platform to a repo package definition |
rake release downloads packages from the artifacts bucket, signs them, builds repo metadata in staging/, and commits the updated metadata to state/ in git. rake deploy uploads from staging/ to S3 in two phases: packages first (invisible to clients until metadata points to them), then metadata. Do not modify staging/ between release and deploy.
state/ is the source of truth for what metadata is currently live in production. git log state/ shows every change. Each release and rollback creates a signed commit.
rake rollback only changes the state/ directory to match what it looked like at the given commit. It does not roll back other files in the repo, push to GitHub, or deploy to S3. Those are separate steps. Because rollback only changes metadata, orphaned packages may exist in the repos afterward. This is harmless (package managers won't see them since the metadata no longer references them), but cleaning them up with rake cleanup is recommended.
| Variable | Purpose |
|---|---|
PROJECT |
Package name (e.g. openvox-agent, openbolt). Prompted interactively if unset. |
VERSION |
Package version (e.g. 8.28.0). Prompted interactively if unset. |
GPG_PRIVATE_KEY_B64 |
Base64-encoded GPG private key for signing |
AWS_ACCESS_KEY_ID |
S3 access key |
AWS_SECRET_ACCESS_KEY |
S3 secret key |
rake verify requires PROJECT, VERSION, AWS_ACCESS_KEY_ID, and AWS_SECRET_ACCESS_KEY (no GPG key needed; it uses the committed public key).
| Variable | Default | Purpose |
|---|---|---|
COMPONENT |
openvox8 |
Repo component (e.g. openvox7, openvox8) |
PLATFORMS |
all | Comma-separated platform filter (e.g. el-9-x86_64,debian-13-amd64) |
PRODUCTION |
false |
Deploy to production S3 buckets and commit state/ |
FORCE_OVERWRITE |
false |
Allow overwriting existing packages in metadata |
ARTIFACTS_BUCKET |
openvox-artifacts |
S3 bucket for build artifacts |
APT_BUCKET |
production: s3://openvox-apt, test: s3://openvox-artifacts/repo_test/apt |
S3 Apt bucket |
YUM_BUCKET |
production: s3://openvox-yum, test: s3://openvox-artifacts/repo_test/yum |
S3 Yum bucket |
DOWNLOADS_BUCKET |
production: s3://openvox-artifacts/downloads, test: s3://openvox-artifacts/repo_test/downloads |
S3 downloads bucket |
GCS_BUCKET |
production: gs://openvox-backup, test: gs://openvox-backup-test |
GCS backup bucket (contains apt/, yum/, downloads/) |
| Variable | Purpose |
|---|---|
WINDOWS_SM_API_KEY |
DigiCert KeyLocker API key |
WINDOWS_SM_HOST |
DigiCert KeyLocker host |
WINDOWS_SM_CLIENT_CERT_B64 |
Base64-encoded .p12 client certificate |
WINDOWS_SM_CLIENT_CERT_PASSWORD |
Client certificate password |
WINDOWS_CERT_ALIAS |
Certificate alias |
| Variable | Purpose |
|---|---|
MACOS_APP_CERT_B64 |
Base64-encoded Developer ID Application .p12 |
MACOS_INSTALLER_CERT_B64 |
Base64-encoded Developer ID Installer .p12 |
MACOS_CERT_PASSWORD |
Password for the .p12 files |
MACOS_APP_SIGNING_IDENTITY |
Code signing identity name |
MACOS_INSTALLER_SIGNING_IDENTITY |
Installer signing identity name |
MACOS_NOTARY_APPLE_ID |
Apple ID email for notarization |
MACOS_NOTARY_TEAM_ID |
Apple Developer team ID |
MACOS_NOTARY_APP_TOKEN |
App-specific password for notarization |
| Variable | Default | Purpose |
|---|---|---|
COMPONENT |
openvox8 |
Repo component for add_platform only (e.g. openvox7, openvox8). Not used by build or upload. |
PLATFORM |
all | Comma-separated platforms (e.g. el-9,debian13,sles-15). No arch suffix needed. Required for add_platform. |
FORCE_OVERWRITE |
false |
Allow overwriting existing artifacts in S3 during upload |
| Variable | Purpose |
|---|---|
COMMIT |
Git SHA for rake rollback |
TARGET |
apt, yum, downloads, or all for rake restore |
GCS_SOURCE |
GCS bucket URI for rake restore (read source) and rake restore:gcs (bucket to destructively roll back). Defaults to PRODUCTION-appropriate bucket. |
TIMESTAMP |
RFC 3339 timestamp for rake restore:gcs point-in-time recovery |
CONFIRM_CLEANUP |
Set to true to skip interactive confirmation in rake cleanup |
CONFIRM_RESTORE |
Set to true to skip interactive confirmation in rake restore |
CONFIRM_RESET |
Set to true to skip interactive confirmation in rake reset_test |
The PLATFORMS variable uses <os>-<version>-<arch> triples:
el-9-x86_64 -> matches .el9.x86_64.rpm
redhatfips-9-x86_64 -> matches .redhatfips9.noarch.rpm
debian-13-amd64 -> matches +debian13_amd64.deb
ubuntu-24.04-arm64 -> matches +ubuntu24.04_arm64.deb
fedora-42-x86_64 -> matches .fc42.x86_64.rpm
macos-all-arm64 -> matches arm64 DMGs
windows-all-x64 -> matches all openvox 8.x MSIs
windows-msys2-x64 -> matches all openvox 9.x MSIs
Each entry must be a full triple. When set, only matching platforms are processed.
A single Docker image (Debian 13) is built on first run and cached. It includes: createrepo-c, rpm, debsigs, dpkg-dev, apt-utils, gnupg, jsign, osslsigncode, ruby, fpm, and jq.
The image contains no secrets. GPG keys are imported fresh each run. Run bundle exec rake reset to remove the cached image and force a rebuild.
Backup and restore use gcloud storage rsync to sync between S3 (s3.osuosl.org) and GCS. The GCS buckets use soft delete so each backup preserves prior state for 90 days. See gcs-setup.md for bucket creation, Workload Identity Federation, and cost estimation.
Point-in-time recovery works by restoring soft-deleted objects: rake restore:gcs finds objects that existed at the given timestamp and were subsequently overwritten or deleted, then restores them. The timestamp should fall between the last known-good backup and the bad one. Timestamps are RFC 3339 format with timezone offsets (e.g. 2026-04-15T13:30:00-07:00 or 2026-04-15T20:30:00Z). This only works within the 90-day soft-delete retention window.
All env vars with a _B64 suffix contain base64-encoded binary or multiline data. Everything else is plain text. See secrets.md for how to generate each secret, GitHub Actions configuration, and a local secrets file template.
When running locally, PROJECT and VERSION can be omitted and will be prompted interactively. COMPONENT defaults to openvox8.
The bootstrap tasks were used during the initial migration from the previous repo management tooling. See bootstrap.md for details. They are kept in the repo for historical reference.