Install the Go version in go.mod or newer. From the repository root:
make build
export PATH="$PWD/bin:$PATH"
livepeer version
livepeer orchestrator --help
livepeer completion orchestrator bashCI and release metadata use the declared Go version; keep the digest-pinned
builder in docker/Dockerfile aligned with it.
Set the VERSION file to the next MAJOR.MINOR.PATCH number without
a v prefix, leading zeroes, prerelease suffix, or build metadata. Merge it to
main, then run Release from GitHub Actions on main:
gh workflow run release.yml --repo livepeer/node --ref mainThe Release workflow requires repository admin permission and uses the dispatch commit throughout CI, packaging, tagging, GitHub publication, and Docker publication.
If a job fails, choose Re-run failed jobs in that same run within seven days, while the tested bundles and images are retained. Matching tags, incomplete drafts, and published stable releases with identical assets are safe to retry; conflicting tags or published assets fail without replacement. If artifacts have expired, rerun all jobs to rebuild before retrying publication.
For tested snapshot bundles without publication, run Build manually. Eligible PRs also build bundles; main pushes automatically test and publish snapshot Docker images, retained as workflow artifacts for one day.
bash .github/scripts/test-release.sh
go test -race ./...
go vet ./...
go build ./...CI also runs Staticcheck and Govulncheck, provisions
the SDK fixtures below, and saves test artifacts. Import boundaries are checked
by TestImportLattice in cmd/livepeer/imports_test.go.
Integration tests use these pinned revisions:
| SDK | Revision | Environment variable |
|---|---|---|
Go: livepeer/golang-runner |
c3be5a14a91f8a3437133419becaced324d804fe |
GO_RUNNER_SDK_DIR |
Python: livepeer/livepeer-python-gateway |
76a1a1c58656ef2ad0c28542ea5f99086b76db69 |
PYTHON_RUNNER_SDK_DIR |
Tests export the pinned committed trees, leaving development checkouts unchanged,
and fetch missing revisions into a temporary repository. To provision fixtures
(requires Git, Python 3.12, and uv):
livepeer_fixture_dir=$(mktemp -d)
export GO_RUNNER_SDK_DIR="$livepeer_fixture_dir/golang-runner"
export PYTHON_RUNNER_SDK_DIR="$livepeer_fixture_dir/livepeer-python-gateway"
git clone https://github.com/livepeer/golang-runner.git "$GO_RUNNER_SDK_DIR"
git -C "$GO_RUNNER_SDK_DIR" checkout --detach c3be5a14a91f8a3437133419becaced324d804fe
git clone https://github.com/livepeer/livepeer-python-gateway.git "$PYTHON_RUNNER_SDK_DIR"
git -C "$PYTHON_RUNNER_SDK_DIR" checkout --detach 76a1a1c58656ef2ad0c28542ea5f99086b76db69
uv sync --project "$PYTHON_RUNNER_SDK_DIR" --locked --no-dev --extra examples --python 3.12
export PYTHON_RUNNER_PYTHON="$PYTHON_RUNNER_SDK_DIR/.venv/bin/python"
go test -race ./...Without explicit paths, tests look for sibling golang-runner and
python-runner checkouts and the Python checkout's .venv/bin/python. SDK
coverage can be skipped when checkouts or dependencies are absent; check the
logs before reporting compatibility.
The fixtures cover persistent and single-shot sessions, proxy modes, discovery, runner callbacks, Trickle, and Python media/control round trips. Payment tests cover live/fixed calls, sustained refresh, payer exposure, concurrent liability, and crash/reorg/finality handling with deterministic Ethereum interfaces. These do not replace staging against real contracts.
Refresh CLI help and completion snapshots after an intentional interface change:
UPDATE_CLI_GOLDENS=1 go test ./cmd/livepeer -run TestRealBinaryOffchainFlowReview the resulting diff. See the HTTP API reference.