Release Nebula APT
Use packaging/RELEASING.md as the release contract and
packaging/repositories/nebula-apt as the external repository scaffold. Treat
release tags, published assets, attestations, and promoted channel entries as
immutable.
Guardrails
- Accept only a published
nebula-v3.* release and its
Nebula-VERSION-linux-x86_64.deb.
- Map semantic versions with a prerelease suffix only to
prerelease; map
versions without one only to stable.
- Verify the release-provided SHA-256 and GitHub provenance attestation before
changing
channels.json. Match the checksum filename exactly; similarly
prefixed SBOM filenames are separate assets.
- Validate
Package, Version, and Architecture from DEB metadata. Do not
pass --arch to dpkg-scanpackages: Nebula's managed asset ends in
linux-x86_64.deb, while that option filters Debian-style filenames ending
in _amd64.deb.
- Retain the current and previous package in each channel so CI tests a real
upgrade.
- Require every promotion to advance semantic-version precedence. Reject
downgrades, duplicate versions, and any change to an already-recorded tag.
- Keep the OpenPGP primary key and revocation certificate offline. Put only an
exported dedicated signing subkey and its passphrase in the protected
apt-release environment.
- Never commit or upload a private key, passphrase, token,
.env file, decrypted
credential, or signing home directory.
- Commit the public archive key only after its fingerprint is verified through
an independent channel.
- Do not push a promotion branch, open or merge a pull request, publish Pages,
replace an asset, or repoint a tag unless the user explicitly authorizes that
external change.
Change the repository source
When editing the scaffold, run:
python -m unittest discover -s packaging/repositories/nebula-apt/tests -v
sh -n packaging/repositories/nebula-apt/scripts/build-repository.sh
sh -n packaging/repositories/nebula-apt/scripts/smoke-test.sh
Review every workflow for least-privilege permissions and pinned action commit
SHAs. Validate channels.json before any job can access apt-release. Confirm
that signing material is created under the runner temporary directory and that
the job never uploads it as an artifact.
Promote a release
- Confirm the source GitHub release is published, immutable, and has the
expected stable or prerelease flag.
- Confirm the managed DEB digest matches
SHA256SUMS-linux-x64.txt.
- Verify its GitHub attestation against
BerylliumSec/nebula.
- Dispatch
promote.yml in BerylliumSec/nebula-apt with the exact tag and
channel.
- Review the generated
channels.json pull request. It must contain only the
new current package and, when present, the prior package for that channel.
- Merge only after repository CI passes and explicit publication approval is
granted.
Verify publication
Require publish.yml to:
- Re-download and verify every retained DEB.
- Generate
Packages, Packages.gz, Release, Release.gpg, and InRelease
for both channels, and make the entire public tree world-readable.
- Verify the metadata with the exported public archive key.
- Run clean install, upgrade,
nebula --self-test,
nebula-core doctor --json, and uninstall checks on Ubuntu, Debian, and
Kali.
- Deploy the tested directory to GitHub Pages.
After deployment, fetch InRelease and Packages.gz from Pages, verify the
signature using a clean keyring, and confirm the promoted version is indexed.
1---2name: release-nebula-apt3description: Validate, promote, build, sign, test, or publish Nebula Linux DEB releases through the public signed APT repository. Use for BerylliumSec/nebula-apt, stable or prerelease APT channels, archive signing keys, GitHub Pages deployment, package install or upgrade testing, and changes to packaging/repositories/nebula-apt.4---56# Release Nebula APT78Use `packaging/RELEASING.md` as the release contract and9`packaging/repositories/nebula-apt` as the external repository scaffold. Treat10release tags, published assets, attestations, and promoted channel entries as11immutable.1213## Guardrails1415- Accept only a published `nebula-v3.*` release and its16 `Nebula-VERSION-linux-x86_64.deb`.17- Map semantic versions with a prerelease suffix only to `prerelease`; map18 versions without one only to `stable`.19- Verify the release-provided SHA-256 and GitHub provenance attestation before20 changing `channels.json`. Match the checksum filename exactly; similarly21 prefixed SBOM filenames are separate assets.22- Validate `Package`, `Version`, and `Architecture` from DEB metadata. Do not23 pass `--arch` to `dpkg-scanpackages`: Nebula's managed asset ends in24 `linux-x86_64.deb`, while that option filters Debian-style filenames ending25 in `_amd64.deb`.26- Retain the current and previous package in each channel so CI tests a real27 upgrade.28- Require every promotion to advance semantic-version precedence. Reject29 downgrades, duplicate versions, and any change to an already-recorded tag.30- Keep the OpenPGP primary key and revocation certificate offline. Put only an31 exported dedicated signing subkey and its passphrase in the protected32 `apt-release` environment.33- Never commit or upload a private key, passphrase, token, `.env` file, decrypted34 credential, or signing home directory.35- Commit the public archive key only after its fingerprint is verified through36 an independent channel.37- Do not push a promotion branch, open or merge a pull request, publish Pages,38 replace an asset, or repoint a tag unless the user explicitly authorizes that39 external change.4041## Change the repository source4243When editing the scaffold, run:4445```console46python -m unittest discover -s packaging/repositories/nebula-apt/tests -v47sh -n packaging/repositories/nebula-apt/scripts/build-repository.sh48sh -n packaging/repositories/nebula-apt/scripts/smoke-test.sh49```5051Review every workflow for least-privilege permissions and pinned action commit52SHAs. Validate `channels.json` before any job can access `apt-release`. Confirm53that signing material is created under the runner temporary directory and that54the job never uploads it as an artifact.5556## Promote a release57581. Confirm the source GitHub release is published, immutable, and has the59 expected stable or prerelease flag.602. Confirm the managed DEB digest matches `SHA256SUMS-linux-x64.txt`.613. Verify its GitHub attestation against `BerylliumSec/nebula`.624. Dispatch `promote.yml` in `BerylliumSec/nebula-apt` with the exact tag and63 channel.645. Review the generated `channels.json` pull request. It must contain only the65 new current package and, when present, the prior package for that channel.666. Merge only after repository CI passes and explicit publication approval is67 granted.6869## Verify publication7071Require `publish.yml` to:72731. Re-download and verify every retained DEB.742. Generate `Packages`, `Packages.gz`, `Release`, `Release.gpg`, and `InRelease`75 for both channels, and make the entire public tree world-readable.763. Verify the metadata with the exported public archive key.774. Run clean install, upgrade, `nebula --self-test`,78 `nebula-core doctor --json`, and uninstall checks on Ubuntu, Debian, and79 Kali.805. Deploy the tested directory to GitHub Pages.8182After deployment, fetch `InRelease` and `Packages.gz` from Pages, verify the83signature using a clean keyring, and confirm the promoted version is indexed.