mirror of
https://oauth2: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@github.com/m1ngsama/TNT.git
synced 2026-06-26 05:54:38 +08:00
Split release and package publish gates
This commit is contained in:
parent
fe7419709e
commit
0da5f51e2e
17 changed files with 232 additions and 51 deletions
44
.github/workflows/release.yml
vendored
44
.github/workflows/release.yml
vendored
|
|
@ -35,6 +35,9 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Verify release tag matches source version
|
||||||
|
run: scripts/check_release_ref.sh "${GITHUB_REF_NAME}"
|
||||||
|
|
||||||
- name: Install dependencies (Ubuntu)
|
- name: Install dependencies (Ubuntu)
|
||||||
if: runner.os == 'Linux'
|
if: runner.os == 'Linux'
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -97,6 +100,9 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Verify release tag matches source version
|
||||||
|
run: scripts/check_release_ref.sh "${GITHUB_REF_NAME}"
|
||||||
|
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
|
|
@ -122,12 +128,24 @@ jobs:
|
||||||
body: |
|
body: |
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
Install the libssh runtime before running TNT:
|
||||||
|
```bash
|
||||||
|
# Ubuntu/Debian
|
||||||
|
sudo apt install libssh-4
|
||||||
|
|
||||||
|
# Arch
|
||||||
|
sudo pacman -S libssh
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
brew install libssh
|
||||||
|
```
|
||||||
|
|
||||||
Download the binary for your platform:
|
Download the binary for your platform:
|
||||||
|
|
||||||
**Linux AMD64:**
|
**Linux AMD64:**
|
||||||
```bash
|
```bash
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-linux-amd64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-linux-amd64
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-linux-amd64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-linux-amd64
|
||||||
chmod +x tnt-linux-amd64
|
chmod +x tnt-linux-amd64
|
||||||
chmod +x tntctl-linux-amd64
|
chmod +x tntctl-linux-amd64
|
||||||
sudo mv tnt-linux-amd64 /usr/local/bin/tnt
|
sudo mv tnt-linux-amd64 /usr/local/bin/tnt
|
||||||
|
|
@ -136,8 +154,8 @@ jobs:
|
||||||
|
|
||||||
**Linux ARM64:**
|
**Linux ARM64:**
|
||||||
```bash
|
```bash
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-linux-arm64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-linux-arm64
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-linux-arm64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-linux-arm64
|
||||||
chmod +x tnt-linux-arm64
|
chmod +x tnt-linux-arm64
|
||||||
chmod +x tntctl-linux-arm64
|
chmod +x tntctl-linux-arm64
|
||||||
sudo mv tnt-linux-arm64 /usr/local/bin/tnt
|
sudo mv tnt-linux-arm64 /usr/local/bin/tnt
|
||||||
|
|
@ -146,8 +164,8 @@ jobs:
|
||||||
|
|
||||||
**macOS Intel:**
|
**macOS Intel:**
|
||||||
```bash
|
```bash
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-darwin-amd64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-darwin-amd64
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-darwin-amd64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-darwin-amd64
|
||||||
chmod +x tnt-darwin-amd64
|
chmod +x tnt-darwin-amd64
|
||||||
chmod +x tntctl-darwin-amd64
|
chmod +x tntctl-darwin-amd64
|
||||||
sudo mv tnt-darwin-amd64 /usr/local/bin/tnt
|
sudo mv tnt-darwin-amd64 /usr/local/bin/tnt
|
||||||
|
|
@ -156,8 +174,8 @@ jobs:
|
||||||
|
|
||||||
**macOS Apple Silicon:**
|
**macOS Apple Silicon:**
|
||||||
```bash
|
```bash
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-darwin-arm64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tnt-darwin-arm64
|
||||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-darwin-arm64
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/tntctl-darwin-arm64
|
||||||
chmod +x tnt-darwin-arm64
|
chmod +x tnt-darwin-arm64
|
||||||
chmod +x tntctl-darwin-arm64
|
chmod +x tntctl-darwin-arm64
|
||||||
sudo mv tnt-darwin-arm64 /usr/local/bin/tnt
|
sudo mv tnt-darwin-arm64 /usr/local/bin/tnt
|
||||||
|
|
@ -166,7 +184,15 @@ jobs:
|
||||||
|
|
||||||
**Verify checksums:**
|
**Verify checksums:**
|
||||||
```bash
|
```bash
|
||||||
sha256sum -c checksums.txt
|
curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/checksums.txt
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
sha256sum -c checksums.txt --ignore-missing
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
for f in tnt-* tntctl-*; do
|
||||||
|
grep " $f$" checksums.txt | shasum -a 256 -c -
|
||||||
|
done
|
||||||
```
|
```
|
||||||
|
|
||||||
## What's Changed
|
## What's Changed
|
||||||
|
|
|
||||||
5
Makefile
5
Makefile
|
|
@ -35,7 +35,7 @@ MANDIR ?= $(PREFIX)/share/man
|
||||||
SYSTEMD_UNIT_DIR ?= $(PREFIX)/lib/systemd/system
|
SYSTEMD_UNIT_DIR ?= $(PREFIX)/lib/systemd/system
|
||||||
CI_TEST_PORT ?= $(if $(PORT),$(PORT),2222)
|
CI_TEST_PORT ?= $(if $(PORT),$(PORT),2222)
|
||||||
|
|
||||||
.PHONY: all clean install install-systemd uninstall uninstall-systemd debug release release-check release-check-strict debian-source-package asan valgrind check test test-advisory ci-test unit-test script-test integration-test anonymous-access-test connection-limit-test security-test stress-test soak-test slow-client-test user-lifecycle-test info
|
.PHONY: all clean install install-systemd uninstall uninstall-systemd debug release release-check release-check-strict package-publish-check debian-source-package asan valgrind check test test-advisory ci-test unit-test script-test integration-test anonymous-access-test connection-limit-test security-test stress-test soak-test slow-client-test user-lifecycle-test info
|
||||||
|
|
||||||
all: $(TARGETS)
|
all: $(TARGETS)
|
||||||
|
|
||||||
|
|
@ -95,6 +95,9 @@ release-check:
|
||||||
release-check-strict:
|
release-check-strict:
|
||||||
./scripts/release_check.sh --strict
|
./scripts/release_check.sh --strict
|
||||||
|
|
||||||
|
package-publish-check:
|
||||||
|
./scripts/package_publish_check.sh
|
||||||
|
|
||||||
debian-source-package:
|
debian-source-package:
|
||||||
./scripts/package_debian_source.sh $${OUT_DIR:-dist/debian-source}
|
./scripts/package_debian_source.sh $${OUT_DIR:-dist/debian-source}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -401,10 +401,11 @@ Longer local preflight can opt into runtime soak and slow-client coverage:
|
||||||
RUN_SOAK=1 RUN_SLOW_CLIENT=1 make release-check
|
RUN_SOAK=1 RUN_SLOW_CLIENT=1 make release-check
|
||||||
```
|
```
|
||||||
|
|
||||||
Before publishing package recipes, replace placeholder checksums and run:
|
Before publishing package recipes, download the final GitHub source archive,
|
||||||
|
replace placeholder checksums, and run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make release-check-strict
|
SOURCE_TARBALL=dist/tnt-chat-vX.Y.Z.tar.gz make package-publish-check
|
||||||
```
|
```
|
||||||
|
|
||||||
## Files
|
## Files
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,10 @@
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- Added a release tag/version guard used by the GitHub release workflow, so a
|
||||||
|
`vX.Y.Z` tag must match `TNT_VERSION` before release assets are built.
|
||||||
|
- Added `make package-publish-check` for verifying Arch/Homebrew source
|
||||||
|
checksums against the final GitHub source archive after a tag exists.
|
||||||
- Added a dedicated `tntctl_text` module with unit coverage for local
|
- Added a dedicated `tntctl_text` module with unit coverage for local
|
||||||
`tntctl` help and validation diagnostics.
|
`tntctl` help and validation diagnostics.
|
||||||
- Documented the stable SSH exec interface contract, including exit statuses
|
- Documented the stable SSH exec interface contract, including exit statuses
|
||||||
|
|
@ -37,6 +41,17 @@
|
||||||
and server survival stay responsive.
|
and server survival stay responsive.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- INSERT-mode chrome now only advertises message sending and `Esc` to NORMAL;
|
||||||
|
`? keys` appears only in NORMAL mode, matching where help keys work.
|
||||||
|
- Dismissing MOTD now returns first-time users to INSERT mode, and `Ctrl+C`
|
||||||
|
closes the full key reference before it disconnects from NORMAL mode.
|
||||||
|
- COMMAND mode now accepts an optional leading `:` in typed commands, matching
|
||||||
|
the way commands are written in the manual.
|
||||||
|
- `:search` output and docs now state that the command shows the last 15
|
||||||
|
matches, avoiding the impression that the pager is a complete result set.
|
||||||
|
- Release checks now separate tag/source-archive readiness from package-manager
|
||||||
|
checksum publishing, avoiding self-referential checksum requirements before
|
||||||
|
the final GitHub source archive exists.
|
||||||
- `tntctl --help` now gets its exec command list from `exec_catalog`, reducing
|
- `tntctl --help` now gets its exec command list from `exec_catalog`, reducing
|
||||||
duplicate command metadata between the local wrapper and SSH exec mode.
|
duplicate command metadata between the local wrapper and SSH exec mode.
|
||||||
- Updated `tnt(1)` to document the current TUI search and pager keys, and
|
- Updated `tnt(1)` to document the current TUI search and pager keys, and
|
||||||
|
|
|
||||||
21
docs/CICD.md
21
docs/CICD.md
|
|
@ -35,8 +35,7 @@ Release policy:
|
||||||
- packaging/arch/PKGBUILD
|
- packaging/arch/PKGBUILD
|
||||||
- packaging/homebrew/tnt-chat.rb
|
- packaging/homebrew/tnt-chat.rb
|
||||||
- packaging/debian/debian/changelog
|
- packaging/debian/debian/changelog
|
||||||
- package checksums and maintainer metadata, when preparing public package
|
- maintainer metadata, when preparing public package recipes
|
||||||
recipes
|
|
||||||
|
|
||||||
2. Run the local preflight:
|
2. Run the local preflight:
|
||||||
make release-check
|
make release-check
|
||||||
|
|
@ -46,7 +45,7 @@ Release policy:
|
||||||
|
|
||||||
3. Commit the release changes and create a local tag. Do not push the tag
|
3. Commit the release changes and create a local tag. Do not push the tag
|
||||||
until strict checks pass:
|
until strict checks pass:
|
||||||
git tag v1.0.1
|
git tag vX.Y.Z
|
||||||
|
|
||||||
4. Run strict release checks:
|
4. Run strict release checks:
|
||||||
make release-check-strict
|
make release-check-strict
|
||||||
|
|
@ -56,7 +55,7 @@ Release policy:
|
||||||
untracked and would be missing from GitHub's source archive.
|
untracked and would be missing from GitHub's source archive.
|
||||||
|
|
||||||
5. Push the tag:
|
5. Push the tag:
|
||||||
git push origin v1.0.1
|
git push origin vX.Y.Z
|
||||||
|
|
||||||
6. GitHub Actions automatically:
|
6. GitHub Actions automatically:
|
||||||
- Builds `tnt` and `tntctl` binaries (Linux/macOS, AMD64/ARM64)
|
- Builds `tnt` and `tntctl` binaries (Linux/macOS, AMD64/ARM64)
|
||||||
|
|
@ -77,7 +76,9 @@ RELEASE REVIEW CHECKLIST
|
||||||
Before publishing a draft release:
|
Before publishing a draft release:
|
||||||
- Confirm `git tag` points at the intended commit.
|
- Confirm `git tag` points at the intended commit.
|
||||||
- Download every release asset from GitHub, not from the local workspace.
|
- Download every release asset from GitHub, not from the local workspace.
|
||||||
- Verify `checksums.txt` with `sha256sum -c checksums.txt`.
|
- Verify downloaded assets against `checksums.txt` (`sha256sum -c
|
||||||
|
checksums.txt --ignore-missing` on Linux, or `shasum -a 256 -c` for each
|
||||||
|
downloaded asset on macOS).
|
||||||
- Run downloaded `tnt --version` and `tntctl --version`.
|
- Run downloaded `tnt --version` and `tntctl --version`.
|
||||||
- Start a temporary server and check:
|
- Start a temporary server and check:
|
||||||
ssh -p 2222 server health
|
ssh -p 2222 server health
|
||||||
|
|
@ -87,8 +88,10 @@ Before publishing a draft release:
|
||||||
ssh -p 2222 server "tail -n 1"
|
ssh -p 2222 server "tail -n 1"
|
||||||
- Check runtime dynamic links (`ldd` on Linux, `otool -L` on macOS) and make
|
- Check runtime dynamic links (`ldd` on Linux, `otool -L` on macOS) and make
|
||||||
sure `libssh` is documented for the target install path.
|
sure `libssh` is documented for the target install path.
|
||||||
- Confirm `make release-check-strict` passed after package checksums were
|
- Confirm `make release-check-strict` passed before pushing the tag.
|
||||||
replaced.
|
- For package-manager recipes, download the final GitHub source archive,
|
||||||
|
replace Arch/Homebrew source checksums, then run:
|
||||||
|
SOURCE_TARBALL=dist/tnt-chat-vX.Y.Z.tar.gz make package-publish-check
|
||||||
|
|
||||||
|
|
||||||
ROLLBACK
|
ROLLBACK
|
||||||
|
|
@ -158,8 +161,8 @@ make && make asan && make release-check
|
||||||
./tnt
|
./tnt
|
||||||
|
|
||||||
# Create release
|
# Create release
|
||||||
git tag v1.0.1
|
git tag vX.Y.Z
|
||||||
git push origin v1.0.1
|
git push origin vX.Y.Z
|
||||||
# Wait 5 minutes for builds
|
# Wait 5 minutes for builds
|
||||||
|
|
||||||
# Deploy to production manually after validation
|
# Deploy to production manually after validation
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ curl -sSL https://raw.githubusercontent.com/m1ngsama/TNT/main/install.sh | sh
|
||||||
|
|
||||||
Specific version:
|
Specific version:
|
||||||
```bash
|
```bash
|
||||||
VERSION=v1.0.1 curl -sSL https://raw.githubusercontent.com/m1ngsama/TNT/main/install.sh | sh
|
VERSION=vX.Y.Z curl -sSL https://raw.githubusercontent.com/m1ngsama/TNT/main/install.sh | sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Manual Install
|
## Manual Install
|
||||||
|
|
@ -18,12 +18,12 @@ Download binary for your platform from [releases](https://github.com/m1ngsama/TN
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Linux AMD64
|
# Linux AMD64
|
||||||
wget https://github.com/m1ngsama/TNT/releases/latest/download/tnt-linux-amd64
|
curl -LO https://github.com/m1ngsama/TNT/releases/latest/download/tnt-linux-amd64
|
||||||
chmod +x tnt-linux-amd64
|
chmod +x tnt-linux-amd64
|
||||||
sudo mv tnt-linux-amd64 /usr/local/bin/tnt
|
sudo mv tnt-linux-amd64 /usr/local/bin/tnt
|
||||||
|
|
||||||
# macOS ARM64 (Apple Silicon)
|
# macOS ARM64 (Apple Silicon)
|
||||||
wget https://github.com/m1ngsama/TNT/releases/latest/download/tnt-darwin-arm64
|
curl -LO https://github.com/m1ngsama/TNT/releases/latest/download/tnt-darwin-arm64
|
||||||
chmod +x tnt-darwin-arm64
|
chmod +x tnt-darwin-arm64
|
||||||
sudo mv tnt-darwin-arm64 /usr/local/bin/tnt
|
sudo mv tnt-darwin-arm64 /usr/local/bin/tnt
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -113,9 +113,9 @@ Goal: make regressions harder to introduce.
|
||||||
|
|
||||||
These are the next changes that should happen before new feature work expands the surface area.
|
These are the next changes that should happen before new feature work expands the surface area.
|
||||||
|
|
||||||
1. Replace remaining release placeholders with real maintainer metadata and
|
1. Replace remaining source-archive checksum placeholders only after the final
|
||||||
source-archive checksums when cutting a public package release.
|
GitHub source archive exists, then run `make package-publish-check`.
|
||||||
2. Create or move the `v1.0.1` tag only when the release commit is final, then
|
2. Create or move the `vX.Y.Z` tag only when the release commit is final, then
|
||||||
run `make release-check-strict`.
|
run `make release-check-strict` before pushing it.
|
||||||
3. Decide whether admin-only moderation controls belong in 1.0.x or should
|
3. Decide whether admin-only moderation controls belong in 1.0.x or should
|
||||||
wait for a later minor release.
|
wait for a later minor release.
|
||||||
|
|
|
||||||
29
install.sh
29
install.sh
|
|
@ -27,6 +27,34 @@ sha256_of() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
warn_missing_libssh() {
|
||||||
|
case "$OS" in
|
||||||
|
linux)
|
||||||
|
if command -v ldconfig >/dev/null 2>&1 &&
|
||||||
|
ldconfig -p 2>/dev/null | grep -q 'libssh\.so'; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
for path in /usr/lib/libssh.so* /usr/lib64/libssh.so* \
|
||||||
|
/lib/libssh.so* /lib64/libssh.so*; do
|
||||||
|
[ -e "$path" ] && return
|
||||||
|
done
|
||||||
|
echo "WARNING: TNT requires the libssh runtime library."
|
||||||
|
echo "Install it first, for example:"
|
||||||
|
echo " Ubuntu/Debian: sudo apt install libssh-4"
|
||||||
|
echo " Arch: sudo pacman -S libssh"
|
||||||
|
;;
|
||||||
|
darwin)
|
||||||
|
if [ -e /opt/homebrew/opt/libssh/lib/libssh.dylib ] ||
|
||||||
|
[ -e /usr/local/opt/libssh/lib/libssh.dylib ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
echo "WARNING: TNT requires the libssh runtime library."
|
||||||
|
echo "Install it first:"
|
||||||
|
echo " brew install libssh"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
need_cmd curl
|
need_cmd curl
|
||||||
need_cmd awk
|
need_cmd awk
|
||||||
|
|
||||||
|
|
@ -53,6 +81,7 @@ echo "OS: $OS"
|
||||||
echo "Arch: $ARCH"
|
echo "Arch: $ARCH"
|
||||||
echo "Version: $VERSION"
|
echo "Version: $VERSION"
|
||||||
echo ""
|
echo ""
|
||||||
|
warn_missing_libssh
|
||||||
|
|
||||||
# Get latest version if not specified
|
# Get latest version if not specified
|
||||||
if [ "$VERSION" = "latest" ]; then
|
if [ "$VERSION" = "latest" ]; then
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ Package installs include both `tnt` and `tntctl`. `tnt` is the server process;
|
||||||
|
|
||||||
1. Confirm `TNT_VERSION` in `include/common.h` and the manpage version match.
|
1. Confirm `TNT_VERSION` in `include/common.h` and the manpage version match.
|
||||||
Also update package versions in Arch, Homebrew, and Debian drafts.
|
Also update package versions in Arch, Homebrew, and Debian drafts.
|
||||||
2. Create a GitHub release tag such as `v1.0.1`.
|
2. Create a GitHub release tag such as `vX.Y.Z`.
|
||||||
3. Build and upload release tarballs or rely on GitHub source archives.
|
3. Build and upload release tarballs or rely on GitHub source archives.
|
||||||
4. Replace placeholder checksums in package drafts.
|
4. Replace placeholder checksums in package drafts.
|
||||||
5. Verify package contents in an isolated directory:
|
5. Verify package contents in an isolated directory:
|
||||||
|
|
@ -35,10 +35,11 @@ Package installs include both `tnt` and `tntctl`. `tnt` is the server process;
|
||||||
Use `scripts/package_debian_source.sh --build` on a Debian/Ubuntu system
|
Use `scripts/package_debian_source.sh --build` on a Debian/Ubuntu system
|
||||||
with `dpkg-buildpackage` installed to build the unsigned source package.
|
with `dpkg-buildpackage` installed to build the unsigned source package.
|
||||||
|
|
||||||
7. Before submitting package recipes, replace checksum placeholders and run:
|
7. Before submitting package recipes, download the final GitHub source archive,
|
||||||
|
replace checksum placeholders, and run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make release-check-strict
|
SOURCE_TARBALL=dist/tnt-chat-vX.Y.Z.tar.gz make package-publish-check
|
||||||
```
|
```
|
||||||
|
|
||||||
8. Submit packages manually:
|
8. Submit packages manually:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Maintainer: M1ng <REPLACE_WITH_EMAIL>
|
# Maintainer: M1ng <contact@m1ng.space>
|
||||||
|
|
||||||
pkgname=tnt-chat
|
pkgname=tnt-chat
|
||||||
pkgver=1.0.1
|
pkgver=1.0.1
|
||||||
|
|
|
||||||
|
|
@ -26,11 +26,12 @@ After editing `PKGBUILD`, regenerate `.SRCINFO`:
|
||||||
makepkg --printsrcinfo > .SRCINFO
|
makepkg --printsrcinfo > .SRCINFO
|
||||||
```
|
```
|
||||||
|
|
||||||
Before AUR submission, replace `sha256sums=('SKIP')` with the real release
|
Before AUR submission, replace `sha256sums=('SKIP')` with the real GitHub
|
||||||
archive checksum, then run the project-level strict check:
|
source archive checksum, regenerate `.SRCINFO`, then run the package publish
|
||||||
|
check:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make release-check-strict
|
SOURCE_TARBALL=dist/tnt-chat-vX.Y.Z.tar.gz make package-publish-check
|
||||||
```
|
```
|
||||||
|
|
||||||
## Manual AUR submission
|
## Manual AUR submission
|
||||||
|
|
@ -40,7 +41,7 @@ git clone ssh://aur@aur.archlinux.org/tnt-chat.git aur-tnt-chat
|
||||||
cp PKGBUILD .SRCINFO aur-tnt-chat/
|
cp PKGBUILD .SRCINFO aur-tnt-chat/
|
||||||
cd aur-tnt-chat
|
cd aur-tnt-chat
|
||||||
git add PKGBUILD .SRCINFO
|
git add PKGBUILD .SRCINFO
|
||||||
git commit -m "Update to 1.0.1"
|
git commit -m "Update to X.Y.Z"
|
||||||
git push
|
git push
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,4 @@ tnt-chat (1.0.1-1) unstable; urgency=medium
|
||||||
|
|
||||||
* Initial package draft.
|
* Initial package draft.
|
||||||
|
|
||||||
-- M1ng <REPLACE_WITH_EMAIL> Thu, 21 May 2026 00:00:00 +0800
|
-- M1ng <contact@m1ng.space> Thu, 21 May 2026 00:00:00 +0800
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
Source: tnt-chat
|
Source: tnt-chat
|
||||||
Section: net
|
Section: net
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: M1ng <REPLACE_WITH_EMAIL>
|
Maintainer: M1ng <contact@m1ng.space>
|
||||||
Build-Depends:
|
Build-Depends:
|
||||||
debhelper-compat (= 13),
|
debhelper-compat (= 13),
|
||||||
libssh-dev,
|
libssh-dev,
|
||||||
|
|
|
||||||
|
|
@ -30,20 +30,20 @@ ruby -c packaging/homebrew/tnt-chat.rb
|
||||||
|
|
||||||
## Updating the formula
|
## Updating the formula
|
||||||
|
|
||||||
1. Publish a GitHub release tag such as `v1.0.1`.
|
1. Publish a GitHub release tag such as `vX.Y.Z`.
|
||||||
2. Download or hash the release source archive:
|
2. Download or hash the release source archive:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl -L -o tnt-chat-1.0.1.tar.gz \
|
curl -L -o dist/tnt-chat-vX.Y.Z.tar.gz \
|
||||||
https://github.com/m1ngsama/TNT/archive/refs/tags/v1.0.1.tar.gz
|
https://github.com/m1ngsama/TNT/archive/refs/tags/vX.Y.Z.tar.gz
|
||||||
shasum -a 256 tnt-chat-1.0.1.tar.gz
|
shasum -a 256 dist/tnt-chat-vX.Y.Z.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Replace `REPLACE_WITH_RELEASE_TARBALL_SHA256` in `tnt-chat.rb`.
|
3. Replace `REPLACE_WITH_RELEASE_TARBALL_SHA256` in `tnt-chat.rb`.
|
||||||
4. Run:
|
4. Run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make release-check-strict
|
SOURCE_TARBALL=dist/tnt-chat-vX.Y.Z.tar.gz make package-publish-check
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Copy the formula into the tap repository and open a normal review PR.
|
5. Copy the formula into the tap repository and open a normal review PR.
|
||||||
|
|
|
||||||
31
scripts/check_release_ref.sh
Executable file
31
scripts/check_release_ref.sh
Executable file
|
|
@ -0,0 +1,31 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Verify that a release tag matches TNT_VERSION.
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
|
||||||
|
cd "$ROOT"
|
||||||
|
|
||||||
|
fail() {
|
||||||
|
echo "release-ref-check: $*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
ref=${1:-${GITHUB_REF_NAME:-}}
|
||||||
|
[ -n "$ref" ] || fail "missing release ref; pass vX.Y.Z or set GITHUB_REF_NAME"
|
||||||
|
|
||||||
|
case "$ref" in
|
||||||
|
refs/tags/*) tag=${ref#refs/tags/} ;;
|
||||||
|
*) tag=$ref ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf '%s\n' "$tag" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$' ||
|
||||||
|
fail "release ref must be vMAJOR.MINOR.PATCH, got $tag"
|
||||||
|
|
||||||
|
version=$(sed -n 's/^#define TNT_VERSION "\([^"]*\)".*/\1/p' include/common.h)
|
||||||
|
[ -n "$version" ] || fail "could not read TNT_VERSION from include/common.h"
|
||||||
|
|
||||||
|
[ "$tag" = "v$version" ] ||
|
||||||
|
fail "release tag $tag does not match TNT_VERSION $version"
|
||||||
|
|
||||||
|
echo "release ref matches TNT_VERSION: $tag"
|
||||||
68
scripts/package_publish_check.sh
Executable file
68
scripts/package_publish_check.sh
Executable file
|
|
@ -0,0 +1,68 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Verify package-manager recipes against a final release source archive.
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
|
||||||
|
cd "$ROOT"
|
||||||
|
|
||||||
|
fail() {
|
||||||
|
echo "package-publish-check: $*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
sha256_of() {
|
||||||
|
if command -v sha256sum >/dev/null 2>&1; then
|
||||||
|
sha256sum "$1" | awk '{print $1}'
|
||||||
|
elif command -v shasum >/dev/null 2>&1; then
|
||||||
|
shasum -a 256 "$1" | awk '{print $1}'
|
||||||
|
else
|
||||||
|
fail "sha256sum or shasum is required"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
version=$(sed -n 's/^#define TNT_VERSION "\([^"]*\)".*/\1/p' include/common.h)
|
||||||
|
[ -n "$version" ] || fail "could not read TNT_VERSION from include/common.h"
|
||||||
|
|
||||||
|
source_tarball=${SOURCE_TARBALL:-${RELEASE_SOURCE_TARBALL:-}}
|
||||||
|
[ -n "$source_tarball" ] ||
|
||||||
|
fail "set SOURCE_TARBALL to the final GitHub source archive"
|
||||||
|
[ -f "$source_tarball" ] ||
|
||||||
|
fail "SOURCE_TARBALL does not exist: $source_tarball"
|
||||||
|
|
||||||
|
! grep -R "REPLACE_WITH_EMAIL" packaging/arch packaging/debian >/dev/null ||
|
||||||
|
fail "replace maintainer email placeholders before package publishing"
|
||||||
|
|
||||||
|
arch_sha=$(sed -n "s/^[[:space:]]*sha256sums=('\([^']*\)'.*/\1/p" \
|
||||||
|
packaging/arch/PKGBUILD | head -n 1)
|
||||||
|
srcinfo_sha=$(sed -n 's/^[[:space:]]*sha256sums = \([^[:space:]]*\).*/\1/p' \
|
||||||
|
packaging/arch/.SRCINFO | head -n 1)
|
||||||
|
brew_sha=$(sed -n 's/^[[:space:]]*sha256 "\([^"]*\)".*/\1/p' \
|
||||||
|
packaging/homebrew/tnt-chat.rb | head -n 1)
|
||||||
|
|
||||||
|
[ -n "$arch_sha" ] || fail "could not read PKGBUILD source checksum"
|
||||||
|
[ -n "$srcinfo_sha" ] || fail "could not read .SRCINFO source checksum"
|
||||||
|
[ -n "$brew_sha" ] || fail "could not read Homebrew source checksum"
|
||||||
|
[ "$arch_sha" != "SKIP" ] || fail "replace PKGBUILD sha256sums before publishing"
|
||||||
|
[ "$srcinfo_sha" != "SKIP" ] || fail "replace .SRCINFO sha256sums before publishing"
|
||||||
|
[ "$brew_sha" != "REPLACE_WITH_RELEASE_TARBALL_SHA256" ] ||
|
||||||
|
fail "replace Homebrew sha256 before publishing"
|
||||||
|
|
||||||
|
expected_sha=$(sha256_of "$source_tarball")
|
||||||
|
[ "$arch_sha" = "$expected_sha" ] ||
|
||||||
|
fail "PKGBUILD source checksum does not match SOURCE_TARBALL"
|
||||||
|
[ "$srcinfo_sha" = "$expected_sha" ] ||
|
||||||
|
fail ".SRCINFO source checksum does not match SOURCE_TARBALL"
|
||||||
|
[ "$brew_sha" = "$expected_sha" ] ||
|
||||||
|
fail "Homebrew source checksum does not match SOURCE_TARBALL"
|
||||||
|
|
||||||
|
grep -q "^pkgver=$version$" packaging/arch/PKGBUILD ||
|
||||||
|
fail "PKGBUILD pkgver does not match $version"
|
||||||
|
grep -q "pkgver = $version" packaging/arch/.SRCINFO ||
|
||||||
|
fail ".SRCINFO pkgver does not match $version"
|
||||||
|
grep -q "v${version}.tar.gz" packaging/homebrew/tnt-chat.rb ||
|
||||||
|
fail "Homebrew URL does not match v$version"
|
||||||
|
grep -q "^tnt-chat (${version}-1)" packaging/debian/debian/changelog ||
|
||||||
|
fail "Debian changelog version does not match $version"
|
||||||
|
|
||||||
|
echo "package recipes match SOURCE_TARBALL for $version: $expected_sha"
|
||||||
|
|
@ -26,8 +26,9 @@ Environment:
|
||||||
PORT=12720 base port for integration tests
|
PORT=12720 base port for integration tests
|
||||||
|
|
||||||
Strict checks additionally require a clean tree, a vX.Y.Z tag at HEAD, a
|
Strict checks additionally require a clean tree, a vX.Y.Z tag at HEAD, a
|
||||||
matching changelog release section, real package checksums, and non-placeholder
|
matching changelog release section, non-placeholder maintainer metadata, and a
|
||||||
maintainer metadata, then build from the tagged source archive.
|
build from the tagged source archive. Run `make package-publish-check` after
|
||||||
|
the final GitHub source archive exists to verify package checksums.
|
||||||
USAGE
|
USAGE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -190,6 +191,14 @@ grep -q '^invalid_records 1$' "$recover_report" ||
|
||||||
|
|
||||||
step "checking installer syntax"
|
step "checking installer syntax"
|
||||||
sh -n install.sh
|
sh -n install.sh
|
||||||
|
sh -n scripts/check_release_ref.sh
|
||||||
|
sh -n scripts/package_publish_check.sh
|
||||||
|
scripts/check_release_ref.sh "v$version"
|
||||||
|
bad_ref=v0.0.0
|
||||||
|
[ "$version" != "0.0.0" ] || bad_ref=v9.9.9
|
||||||
|
if scripts/check_release_ref.sh "$bad_ref" >/dev/null 2>&1; then
|
||||||
|
fail "release ref check accepted a mismatched tag"
|
||||||
|
fi
|
||||||
|
|
||||||
step "checking Debian packaging metadata"
|
step "checking Debian packaging metadata"
|
||||||
[ -x packaging/debian/debian/rules ] ||
|
[ -x packaging/debian/debian/rules ] ||
|
||||||
|
|
@ -248,12 +257,6 @@ if [ "$STRICT" -eq 1 ]; then
|
||||||
fail "local tag v$version does not point at HEAD"
|
fail "local tag v$version does not point at HEAD"
|
||||||
grep -q "^## $version " docs/CHANGELOG.md ||
|
grep -q "^## $version " docs/CHANGELOG.md ||
|
||||||
fail "docs/CHANGELOG.md does not contain a release section for $version"
|
fail "docs/CHANGELOG.md does not contain a release section for $version"
|
||||||
! grep -q "sha256sums=('SKIP')" packaging/arch/PKGBUILD ||
|
|
||||||
fail "replace PKGBUILD sha256sums before strict release"
|
|
||||||
! grep -q "sha256sums = SKIP" packaging/arch/.SRCINFO ||
|
|
||||||
fail "replace .SRCINFO sha256sums before strict release"
|
|
||||||
! grep -q "REPLACE_WITH_RELEASE_TARBALL_SHA256" packaging/homebrew/tnt-chat.rb ||
|
|
||||||
fail "replace Homebrew sha256 before strict release"
|
|
||||||
! grep -R "REPLACE_WITH_EMAIL" packaging/arch packaging/debian >/dev/null ||
|
! grep -R "REPLACE_WITH_EMAIL" packaging/arch packaging/debian >/dev/null ||
|
||||||
fail "replace maintainer email placeholders before strict release"
|
fail "replace maintainer email placeholders before strict release"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue