Files
l-ui/docs/release.md
T
Muse 739c18ce48
CI / go-test (push) Waiting to run
CI / postgres-durable-first (push) Waiting to run
CI / codegen (push) Waiting to run
CI / govulncheck (push) Waiting to run
CI / race (push) Waiting to run
CI / fuzz-smoke (push) Waiting to run
CI / golangci (push) Waiting to run
CI / frontend (push) Waiting to run
Docs CI / build (push) Waiting to run
Release 3X-UI / build (386) (push) Waiting to run
Release 3X-UI / build (amd64) (push) Waiting to run
Release 3X-UI / build (arm64) (push) Waiting to run
Release 3X-UI / build (armv5) (push) Waiting to run
Release 3X-UI / build (armv6) (push) Waiting to run
Release 3X-UI / build (armv7) (push) Waiting to run
Release 3X-UI / build (s390x) (push) Waiting to run
Release 3X-UI / Build for Windows (amd64) (push) Waiting to run
Release 3X-UI / Publish rolling dev release (push) Blocked by required conditions
Deploy Smoke Tests / noninteractive-install (ubuntu-24.04-arm) (push) Waiting to run
Deploy Smoke Tests / noninteractive-install (ubuntu-latest) (push) Waiting to run
Deploy Smoke Tests / release-tag-install (ubuntu-24.04-arm) (push) Waiting to run
Deploy Smoke Tests / release-tag-install (ubuntu-latest) (push) Waiting to run
CodeQL Advanced / Analyze (go) (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Docs Deploy (GitHub Pages) / build (push) Canceled after 0s
Docs Deploy (GitHub Pages) / deploy (push) Canceled after 0s
release: panel V2.7.0 / agent line A2.6.0
Agent code changed in the rename batch (lui-agent binary, LUI_ env prefix, /etc/l-ui paths and services), so the agent line moves 2.5.0 -> 2.6.0 and its default-expectation tests move with it; panel version is injected at build time (V2.7.0). install-agent.sh RELEASE_BASE and install-master.sh LUI_URL move V2.6.0 -> V2.7.0. Repo name settled as rogue/l-ui (user decision 2026-10-24); the rename-batch placeholder warnings in docs/release.md, selfupdate.go and install-master.sh are closed by the Gitea rename that precedes publishing this release.
2026-10-24 20:53:51 +08:00

4.5 KiB

Release process (L-UI fork)

Repo name settled 2026-10-24: rogue/l-ui. The Gitea repository rogue/3x-ui-agent is renamed to rogue/l-ui before this release is published; the placeholder warnings from the rename batch are closed by that rename.

Releases are published on the self-hosted Gitea (rogue/l-ui). Build with scripts/release-build.sh; this document is the rules that script encodes. Read it before cutting a release — several rules exist because violating them already caused a production incident once.

Two independent version lines

The panel and the agent are maintained as separate lines (policy set 2026-10-24). They never borrow each other's numbers.

line form source of truth injection
panel (master) V2.4.0 release tag -X .../internal/config.displayVersion
agent A2.3.0 the release's agent-version.txt marker -X .../internal/config.agentDisplayVersion (agents only)
  • The agent line moves only when agent code changes (anything under cmd/lui-agent*, internal/agent/, or code reachable from the agent binaries). A panel-only change ships a new panel release whose agent assets are the previous ones, untouched.
  • An agent built without injection reports the source default (defaultAgentDisplayVersion in internal/config), which must always equal the current agent line. When the agent line bumps, bump that constant in the same commit.
  • Masters resolve "latest agent version" from the newest release's agent-version.txt marker (selfupdate.ResolveLatestAgentTarget), never by rewriting the panel tag. Releases older than the marker convention (≤ V2.4.0) transparently fall back to the legacy tag-derived value, which is exact for them (their agent assets were still stamped from the tag).

Asset set

Every release ships exactly:

  • l-ui-linux-amd64, l-ui-linux-arm64 (+ .sha256 sidecars) — panel
  • lui-agent-linux-amd64, lui-agent-linux-arm64 (+ .sha256) — agent
  • agent-version.txt — one line, the agent line's version (A2.3.0)
  • geoip-country.mmdb lives in its own standing release, not here.

No Windows executable. See the freeze below.

The agent reuse rule

When agent code is unchanged since the previous release:

  1. Download the previous release's agent binaries and their .sha256 sidecars.
  2. Verify each binary against its sidecar.
  3. Upload them to the new release byte-for-byte — do not rebuild, do not re-stamp. Rebuilding the same source with a new injection would mint a binary that claims a version its code does not earn and would churn every node's update state for nothing.
  4. agent-version.txt still names the same agent version.

When agent code changed: build fresh agents, bump only the agent line (and defaultAgentDisplayVersion), generate fresh sidecars.

scripts/release-build.sh implements both paths (AGENT_CHANGED=0/1).

Windows freeze

The Windows agent is frozen at A2.2.1; V2.4.0 was the last release containing x-ui-agent-windows-amd64.exe. One machine (TYYUN, probe-only) runs it and it will not be updated.

Consequences that are part of the release contract:

  • install-agent.ps1 stays pinned to the V2.4.0 release base. Do not bump it: newer releases contain no exe for it to download.
  • The frozen agent cannot adapt to master changes, so the master side of its protocol is contract-locked by TestAgentLegacyWindows221Contract (register / heartbeat / probe-report request shapes; config payload keys; response envelopes). If that test goes red, the change breaks a node that can never be upgraded — stop and reconsider.

Pre-publish checks

  • agent-version.txt content equals the agent assets' reported version (for reused assets: the version they already report).
  • Sizes and sha256 of every asset read back through the API after upload match the local files.
  • Binaries are static (readelf -d shows no NEEDED) and carry no CGO stub strings.
  • Panel self-reports the new V version; agent self-reports the intended A version (unchanged line ⇒ unchanged report).
  • Pilot: update ONE node first; after it converges, stat the on-disk agent binary and compare size + sha256 with the release asset. (V2.3.0 lesson: the version display can look right while the fleet still runs the previous asset generation — the update asset an agent fetches is decided by the agent's own build.)
  • install-agent.sh's RELEASE_BASE points at the new tag.