feat(packaging): Ubuntu 24.04/26.04 .deb packages (#137)
* chore(packaging): align package descriptions with the README tagline * feat(packaging): build and smoke-test Ubuntu .deb packages in releases
- commit
- 06e11122322c93077ff103e17fdd8de61f9c5c6e
- author
- bnema · · 2026-10-05 17:26 UTC
- committer
- GitHub · · 2026-10-05 17:26 UTC
- parent
- 245c4bb
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
7 files · +109 -4
M .github/workflows/release.yml +12 -0
| @@ -26,6 +26,17 @@ jobs: | |||
| 26 | 26 | - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 | |
| 27 | 27 | with: | |
| 28 | 28 | go-version-file: go.mod | |
| 29 | + | - uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3 | |
| 30 | + | with: | |
| 31 | + | distribution: goreleaser | |
| 32 | + | version: '~> v2' | |
| 33 | + | # Snapshot first: the .deb is installed on Ubuntu before anything ships. | |
| 34 | + | args: release --snapshot --clean --skip=aur | |
| 35 | + | - name: Smoke-test the .deb on Ubuntu LTS | |
| 36 | + | run: | | |
| 37 | + | for v in 24.04 26.04; do | |
| 38 | + | packaging/deb/smoke-test.sh "$v" dist/neferwl_*_amd64.deb | |
| 39 | + | done | |
| 29 | 40 | - uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3 | |
| 30 | 41 | with: | |
| 31 | 42 | distribution: goreleaser | |
| @@ -37,6 +48,7 @@ jobs: | |||
| 37 | 48 | with: | |
| 38 | 49 | subject-path: | | |
| 39 | 50 | dist/*.tar.gz | |
| 51 | + | dist/*.deb | |
| 40 | 52 | dist/checksums.txt | |
| 41 | 53 | - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| 42 | 54 | with: | |
| @@ -26,6 +26,17 @@ jobs: | |||||
| 26 | - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 | 26 | - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 | ||
| 27 | with: | 27 | with: | ||
| 28 | go-version-file: go.mod | 28 | go-version-file: go.mod | ||
| 29 | + | - uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3 | |||
| 30 | + | with: | |||
| 31 | + | distribution: goreleaser | |||
| 32 | + | version: '~> v2' | |||
| 33 | + | # Snapshot first: the .deb is installed on Ubuntu before anything ships. | |||
| 34 | + | args: release --snapshot --clean --skip=aur | |||
| 35 | + | - name: Smoke-test the .deb on Ubuntu LTS | |||
| 36 | + | run: | | |||
| 37 | + | for v in 24.04 26.04; do | |||
| 38 | + | packaging/deb/smoke-test.sh "$v" dist/neferwl_*_amd64.deb | |||
| 39 | + | done | |||
| 29 | - uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3 | 40 | - uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3 | ||
| 30 | with: | 41 | with: | ||
| 31 | distribution: goreleaser | 42 | distribution: goreleaser | ||
| @@ -37,6 +48,7 @@ jobs: | |||||
| 37 | with: | 48 | with: | ||
| 38 | subject-path: | | 49 | subject-path: | | ||
| 39 | dist/*.tar.gz | 50 | dist/*.tar.gz | ||
| 51 | + | dist/*.deb | |||
| 40 | dist/checksums.txt | 52 | dist/checksums.txt | ||
| 41 | - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | 53 | - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | ||
| 42 | with: | 54 | with: | ||
M .goreleaser.yaml +64 -1
| @@ -42,6 +42,59 @@ archives: | |||
| 42 | 42 | - packaging/neferwl.desktop | |
| 43 | 43 | - packaging/neferwl-portals.conf | |
| 44 | 44 | ||
| 45 | + | nfpms: | |
| 46 | + | - id: neferwl | |
| 47 | + | ids: [neferwl] | |
| 48 | + | package_name: neferwl | |
| 49 | + | file_name_template: "{{ .PackageName }}_{{ .Version }}_{{ .Arch }}" | |
| 50 | + | formats: [deb] | |
| 51 | + | vendor: bnema | |
| 52 | + | homepage: https://github.com/bnema/neferwl | |
| 53 | + | maintainer: "bnema <b@bnema.dev>" | |
| 54 | + | description: A Wayland compositor that spends its frames on your apps, not on itself | |
| 55 | + | license: GPL-3.0-only | |
| 56 | + | section: x11 | |
| 57 | + | bindir: /usr/bin | |
| 58 | + | # Loaded at runtime (purego, no cgo): dpkg-shlibdeps cannot see them. | |
| 59 | + | dependencies: | |
| 60 | + | - libc6 | |
| 61 | + | - libinput10 | |
| 62 | + | - libseat1 | |
| 63 | + | - libudev1 | |
| 64 | + | - libxkbcommon0 | |
| 65 | + | - libvulkan1 | |
| 66 | + | - mesa-vulkan-drivers | vulkan-icd | |
| 67 | + | - dbus | |
| 68 | + | - libcap2-bin | |
| 69 | + | suggests: | |
| 70 | + | - xwayland-satellite | |
| 71 | + | - foot | |
| 72 | + | - fuzzel | |
| 73 | + | - xdg-desktop-portal-gtk | |
| 74 | + | - xdg-desktop-portal-wlr | |
| 75 | + | scripts: | |
| 76 | + | postinstall: packaging/deb/postinst | |
| 77 | + | contents: | |
| 78 | + | - src: packaging/neferwl-session | |
| 79 | + | dst: /usr/bin/neferwl-session | |
| 80 | + | file_info: {mode: 0755} | |
| 81 | + | - src: packaging/neferwl.service | |
| 82 | + | dst: /usr/lib/systemd/user/neferwl.service | |
| 83 | + | - src: packaging/neferwl-shutdown.target | |
| 84 | + | dst: /usr/lib/systemd/user/neferwl-shutdown.target | |
| 85 | + | - src: packaging/neferwl.desktop | |
| 86 | + | dst: /usr/share/wayland-sessions/neferwl.desktop | |
| 87 | + | - src: packaging/neferwl-portals.conf | |
| 88 | + | dst: /usr/share/xdg-desktop-portal/neferwl-portals.conf | |
| 89 | + | - src: examples/config | |
| 90 | + | dst: /usr/share/doc/neferwl/config.example | |
| 91 | + | - src: examples/capture-allow | |
| 92 | + | dst: /usr/share/doc/neferwl/capture-allow.example | |
| 93 | + | - src: README.md | |
| 94 | + | dst: /usr/share/doc/neferwl/README.md | |
| 95 | + | - src: LICENSE | |
| 96 | + | dst: /usr/share/doc/neferwl/copyright | |
| 97 | + | ||
| 45 | 98 | checksum: | |
| 46 | 99 | name_template: checksums.txt | |
| 47 | 100 | algorithm: sha256 | |
| @@ -108,6 +161,16 @@ release: | |||
| 108 | 161 | gh attestation verify neferwl_{{ .Version }}_linux_amd64.tar.gz -R bnema/neferwl | |
| 109 | 162 | ``` | |
| 110 | 163 | ||
| 164 | + | ### Install on Ubuntu 24.04 and 26.04 | |
| 165 | + | ||
| 166 | + | Replace `amd64` with `arm64` on ARM. | |
| 167 | + | ||
| 168 | + | ```sh | |
| 169 | + | gh release download {{ .Tag }} -R bnema/neferwl -p 'neferwl_{{ .Version }}_amd64.deb' -p checksums.txt | |
| 170 | + | sha256sum -c --ignore-missing checksums.txt | |
| 171 | + | sudo apt install ./neferwl_{{ .Version }}_amd64.deb | |
| 172 | + | ``` | |
| 173 | + | ||
| 111 | 174 | The archive holds the `neferwl` binary, the session files from `packaging/` and `examples/config`. See the [README](https://github.com/bnema/neferwl#readme) for runtime dependencies and the session setup. | |
| 112 | 175 | footer: | | |
| 113 | 176 | --- | |
| @@ -118,7 +181,7 @@ aurs: | |||
| 118 | 181 | - name: neferwl-bin | |
| 119 | 182 | ids: [neferwl] | |
| 120 | 183 | homepage: https://github.com/bnema/neferwl | |
| 121 | - | description: Minimal Wayland compositor with column tiling, for the TTY | |
| 184 | + | description: A Wayland compositor that spends its frames on your apps, not on itself | |
| 122 | 185 | maintainers: | |
| 123 | 186 | - "bnema <b at bnema dot dev>" | |
| 124 | 187 | license: GPL-3.0-only | |
| @@ -42,6 +42,59 @@ archives: | |||||
| 42 | - packaging/neferwl.desktop | 42 | - packaging/neferwl.desktop | ||
| 43 | - packaging/neferwl-portals.conf | 43 | - packaging/neferwl-portals.conf | ||
| 44 | 44 | ||||
| 45 | + | nfpms: | |||
| 46 | + | - id: neferwl | |||
| 47 | + | ids: [neferwl] | |||
| 48 | + | package_name: neferwl | |||
| 49 | + | file_name_template: "{{ .PackageName }}_{{ .Version }}_{{ .Arch }}" | |||
| 50 | + | formats: [deb] | |||
| 51 | + | vendor: bnema | |||
| 52 | + | homepage: https://github.com/bnema/neferwl | |||
| 53 | + | maintainer: "bnema <b@bnema.dev>" | |||
| 54 | + | description: A Wayland compositor that spends its frames on your apps, not on itself | |||
| 55 | + | license: GPL-3.0-only | |||
| 56 | + | section: x11 | |||
| 57 | + | bindir: /usr/bin | |||
| 58 | + | # Loaded at runtime (purego, no cgo): dpkg-shlibdeps cannot see them. | |||
| 59 | + | dependencies: | |||
| 60 | + | - libc6 | |||
| 61 | + | - libinput10 | |||
| 62 | + | - libseat1 | |||
| 63 | + | - libudev1 | |||
| 64 | + | - libxkbcommon0 | |||
| 65 | + | - libvulkan1 | |||
| 66 | + | - mesa-vulkan-drivers | vulkan-icd | |||
| 67 | + | - dbus | |||
| 68 | + | - libcap2-bin | |||
| 69 | + | suggests: | |||
| 70 | + | - xwayland-satellite | |||
| 71 | + | - foot | |||
| 72 | + | - fuzzel | |||
| 73 | + | - xdg-desktop-portal-gtk | |||
| 74 | + | - xdg-desktop-portal-wlr | |||
| 75 | + | scripts: | |||
| 76 | + | postinstall: packaging/deb/postinst | |||
| 77 | + | contents: | |||
| 78 | + | - src: packaging/neferwl-session | |||
| 79 | + | dst: /usr/bin/neferwl-session | |||
| 80 | + | file_info: {mode: 0755} | |||
| 81 | + | - src: packaging/neferwl.service | |||
| 82 | + | dst: /usr/lib/systemd/user/neferwl.service | |||
| 83 | + | - src: packaging/neferwl-shutdown.target | |||
| 84 | + | dst: /usr/lib/systemd/user/neferwl-shutdown.target | |||
| 85 | + | - src: packaging/neferwl.desktop | |||
| 86 | + | dst: /usr/share/wayland-sessions/neferwl.desktop | |||
| 87 | + | - src: packaging/neferwl-portals.conf | |||
| 88 | + | dst: /usr/share/xdg-desktop-portal/neferwl-portals.conf | |||
| 89 | + | - src: examples/config | |||
| 90 | + | dst: /usr/share/doc/neferwl/config.example | |||
| 91 | + | - src: examples/capture-allow | |||
| 92 | + | dst: /usr/share/doc/neferwl/capture-allow.example | |||
| 93 | + | - src: README.md | |||
| 94 | + | dst: /usr/share/doc/neferwl/README.md | |||
| 95 | + | - src: LICENSE | |||
| 96 | + | dst: /usr/share/doc/neferwl/copyright | |||
| 97 | + | ||||
| 45 | checksum: | 98 | checksum: | ||
| 46 | name_template: checksums.txt | 99 | name_template: checksums.txt | ||
| 47 | algorithm: sha256 | 100 | algorithm: sha256 | ||
| @@ -108,6 +161,16 @@ release: | |||||
| 108 | gh attestation verify neferwl_{{ .Version }}_linux_amd64.tar.gz -R bnema/neferwl | 161 | gh attestation verify neferwl_{{ .Version }}_linux_amd64.tar.gz -R bnema/neferwl | ||
| 109 | ``` | 162 | ``` | ||
| 110 | 163 | ||||
| 164 | + | ### Install on Ubuntu 24.04 and 26.04 | |||
| 165 | + | ||||
| 166 | + | Replace `amd64` with `arm64` on ARM. | |||
| 167 | + | ||||
| 168 | + | ```sh | |||
| 169 | + | gh release download {{ .Tag }} -R bnema/neferwl -p 'neferwl_{{ .Version }}_amd64.deb' -p checksums.txt | |||
| 170 | + | sha256sum -c --ignore-missing checksums.txt | |||
| 171 | + | sudo apt install ./neferwl_{{ .Version }}_amd64.deb | |||
| 172 | + | ``` | |||
| 173 | + | ||||
| 111 | The archive holds the `neferwl` binary, the session files from `packaging/` and `examples/config`. See the [README](https://github.com/bnema/neferwl#readme) for runtime dependencies and the session setup. | 174 | The archive holds the `neferwl` binary, the session files from `packaging/` and `examples/config`. See the [README](https://github.com/bnema/neferwl#readme) for runtime dependencies and the session setup. | ||
| 112 | footer: | | 175 | footer: | | ||
| 113 | --- | 176 | --- | ||
| @@ -118,7 +181,7 @@ aurs: | |||||
| 118 | - name: neferwl-bin | 181 | - name: neferwl-bin | ||
| 119 | ids: [neferwl] | 182 | ids: [neferwl] | ||
| 120 | homepage: https://github.com/bnema/neferwl | 183 | homepage: https://github.com/bnema/neferwl | ||
| 121 | - | description: Minimal Wayland compositor with column tiling, for the TTY | 184 | + | description: A Wayland compositor that spends its frames on your apps, not on itself |
| 122 | maintainers: | 185 | maintainers: | ||
| 123 | - "bnema <b at bnema dot dev>" | 186 | - "bnema <b at bnema dot dev>" | ||
| 124 | license: GPL-3.0-only | 187 | license: GPL-3.0-only | ||
M packaging/arch/PKGBUILD +1 -1
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | pkgname=neferwl | |
| 3 | 3 | pkgver=0.0.0 | |
| 4 | 4 | pkgrel=1 | |
| 5 | - | pkgdesc='Minimal Wayland compositor with column tiling, for the TTY' | |
| 5 | + | pkgdesc='A Wayland compositor that spends its frames on your apps, not on itself' | |
| 6 | 6 | arch=('x86_64') | |
| 7 | 7 | url='https://github.com/bnema/neferwl' | |
| 8 | 8 | license=('GPL-3.0-only') | |
| @@ -2,7 +2,7 @@ | |||||
| 2 | pkgname=neferwl | 2 | pkgname=neferwl | ||
| 3 | pkgver=0.0.0 | 3 | pkgver=0.0.0 | ||
| 4 | pkgrel=1 | 4 | pkgrel=1 | ||
| 5 | - | pkgdesc='Minimal Wayland compositor with column tiling, for the TTY' | 5 | + | pkgdesc='A Wayland compositor that spends its frames on your apps, not on itself' |
| 6 | arch=('x86_64') | 6 | arch=('x86_64') | ||
| 7 | url='https://github.com/bnema/neferwl' | 7 | url='https://github.com/bnema/neferwl' | ||
| 8 | license=('GPL-3.0-only') | 8 | license=('GPL-3.0-only') | ||
M packaging/aur/neferwl-git/PKGBUILD +1 -1
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | pkgname=neferwl-git | |
| 5 | 5 | pkgver=0.1.0.r78.ge0b15ca | |
| 6 | 6 | pkgrel=1 | |
| 7 | - | pkgdesc='Minimal Wayland compositor with column tiling, for the TTY (git version)' | |
| 7 | + | pkgdesc='A Wayland compositor that spends its frames on your apps, not on itself (git version)' | |
| 8 | 8 | arch=('x86_64' 'aarch64') | |
| 9 | 9 | url='https://github.com/bnema/neferwl' | |
| 10 | 10 | license=('GPL-3.0-only') | |
| @@ -4,7 +4,7 @@ | |||||
| 4 | pkgname=neferwl-git | 4 | pkgname=neferwl-git | ||
| 5 | pkgver=0.1.0.r78.ge0b15ca | 5 | pkgver=0.1.0.r78.ge0b15ca | ||
| 6 | pkgrel=1 | 6 | pkgrel=1 | ||
| 7 | - | pkgdesc='Minimal Wayland compositor with column tiling, for the TTY (git version)' | 7 | + | pkgdesc='A Wayland compositor that spends its frames on your apps, not on itself (git version)' |
| 8 | arch=('x86_64' 'aarch64') | 8 | arch=('x86_64' 'aarch64') | ||
| 9 | url='https://github.com/bnema/neferwl' | 9 | url='https://github.com/bnema/neferwl' | ||
| 10 | license=('GPL-3.0-only') | 10 | license=('GPL-3.0-only') | ||
A packaging/deb/postinst +8 -0
| @@ -0,0 +1,8 @@ | |||
| 1 | + | #!/bin/sh | |
| 2 | + | # Real-time input and output threads and the high-priority Vulkan queue need | |
| 3 | + | # CAP_SYS_NICE. Apps launched by NeferWL do not inherit it. | |
| 4 | + | set -e | |
| 5 | + | ||
| 6 | + | if [ "$1" = configure ]; then | |
| 7 | + | setcap cap_sys_nice=ep /usr/bin/neferwl || echo 'neferwl: setcap failed, real-time scheduling is off' | |
| 8 | + | fi | |
| @@ -0,0 +1,8 @@ | |||||
| 1 | + | #!/bin/sh | |||
| 2 | + | # Real-time input and output threads and the high-priority Vulkan queue need | |||
| 3 | + | # CAP_SYS_NICE. Apps launched by NeferWL do not inherit it. | |||
| 4 | + | set -e | |||
| 5 | + | ||||
| 6 | + | if [ "$1" = configure ]; then | |||
| 7 | + | setcap cap_sys_nice=ep /usr/bin/neferwl || echo 'neferwl: setcap failed, real-time scheduling is off' | |||
| 8 | + | fi | |||
A packaging/deb/smoke-test.sh +22 -0
| @@ -0,0 +1,22 @@ | |||
| 1 | + | #!/bin/sh | |
| 2 | + | # Installs a neferwl .deb in a clean Ubuntu container and checks that it runs. | |
| 3 | + | # Usage: packaging/deb/smoke-test.sh <ubuntu-version> <path/to/neferwl.deb> | |
| 4 | + | # Needs CAP_SYS_NICE in the container: postinst sets it as a file capability. | |
| 5 | + | set -eu | |
| 6 | + | ||
| 7 | + | version=$1 | |
| 8 | + | deb=$(realpath "$2") | |
| 9 | + | ||
| 10 | + | docker run --rm --cap-add SYS_NICE -v "$deb:/tmp/neferwl.deb:ro" "ubuntu:$version" sh -euc ' | |
| 11 | + | # Ubuntu images skip /usr/share/doc; the example config lives there. | |
| 12 | + | rm -f /etc/dpkg/dpkg.cfg.d/excludes | |
| 13 | + | apt-get update -qq | |
| 14 | + | DEBIAN_FRONTEND=noninteractive apt-get install -y -qq /tmp/neferwl.deb >/dev/null | |
| 15 | + | getcap /usr/bin/neferwl | grep -q cap_sys_nice | |
| 16 | + | neferwl version | |
| 17 | + | neferwl validate-config /usr/share/doc/neferwl/config.example | |
| 18 | + | for lib in libinput.so.10 libseat.so.1 libudev.so.1 libxkbcommon.so.0 libvulkan.so.1; do | |
| 19 | + | ldconfig -p | grep -q "$lib" || { echo "missing $lib"; exit 1; } | |
| 20 | + | done | |
| 21 | + | apt-get remove -y -qq neferwl >/dev/null | |
| 22 | + | ' | |
| @@ -0,0 +1,22 @@ | |||||
| 1 | + | #!/bin/sh | |||
| 2 | + | # Installs a neferwl .deb in a clean Ubuntu container and checks that it runs. | |||
| 3 | + | # Usage: packaging/deb/smoke-test.sh <ubuntu-version> <path/to/neferwl.deb> | |||
| 4 | + | # Needs CAP_SYS_NICE in the container: postinst sets it as a file capability. | |||
| 5 | + | set -eu | |||
| 6 | + | ||||
| 7 | + | version=$1 | |||
| 8 | + | deb=$(realpath "$2") | |||
| 9 | + | ||||
| 10 | + | docker run --rm --cap-add SYS_NICE -v "$deb:/tmp/neferwl.deb:ro" "ubuntu:$version" sh -euc ' | |||
| 11 | + | # Ubuntu images skip /usr/share/doc; the example config lives there. | |||
| 12 | + | rm -f /etc/dpkg/dpkg.cfg.d/excludes | |||
| 13 | + | apt-get update -qq | |||
| 14 | + | DEBIAN_FRONTEND=noninteractive apt-get install -y -qq /tmp/neferwl.deb >/dev/null | |||
| 15 | + | getcap /usr/bin/neferwl | grep -q cap_sys_nice | |||
| 16 | + | neferwl version | |||
| 17 | + | neferwl validate-config /usr/share/doc/neferwl/config.example | |||
| 18 | + | for lib in libinput.so.10 libseat.so.1 libudev.so.1 libxkbcommon.so.0 libvulkan.so.1; do | |||
| 19 | + | ldconfig -p | grep -q "$lib" || { echo "missing $lib"; exit 1; } | |||
| 20 | + | done | |||
| 21 | + | apt-get remove -y -qq neferwl >/dev/null | |||
| 22 | + | ' | |||
M packaging/neferwl.desktop +1 -1
| @@ -1,6 +1,6 @@ | |||
| 1 | 1 | [Desktop Entry] | |
| 2 | 2 | Name=NeferWL | |
| 3 | - | Comment=Minimal Wayland compositor with column tiling | |
| 3 | + | Comment=A Wayland compositor that spends its frames on your apps, not on itself | |
| 4 | 4 | Exec=neferwl-session | |
| 5 | 5 | Type=Application | |
| 6 | 6 | DesktopNames=neferwl | |
| @@ -1,6 +1,6 @@ | |||||
| 1 | [Desktop Entry] | 1 | [Desktop Entry] | ||
| 2 | Name=NeferWL | 2 | Name=NeferWL | ||
| 3 | - | Comment=Minimal Wayland compositor with column tiling | 3 | + | Comment=A Wayland compositor that spends its frames on your apps, not on itself |
| 4 | Exec=neferwl-session | 4 | Exec=neferwl-session | ||
| 5 | Type=Application | 5 | Type=Application | ||
| 6 | DesktopNames=neferwl | 6 | DesktopNames=neferwl | ||