@smbcloud / proses / commits / e8dfe93

Add GitHub Actions workflow and metadata for Debian packaging

Seto committed Apr 6, 2026 at 11:50 UTC e8dfe93b4bd7b710862627d233893be795c2dead
3 files changed +150 -1
.github/workflows/release-debian.yaml new
+135
@@ -0,0 +1,135 @@
1 +name: Debian Package Release
2 +
3 +on:
4 + release:
5 + types: [published]
6 + workflow_dispatch:
7 + inputs:
8 + tag:
9 + description: "Release tag (e.g. v0.1.0)"
10 + required: true
11 +
12 +permissions:
13 + contents: write
14 +
15 +env:
16 + PROJECT_NAME: proses
17 + CARGO_TERM_COLOR: always
18 +
19 +jobs:
20 + build-deb:
21 + name: Build .deb (${{ matrix.arch }})
22 + runs-on: ubuntu-latest
23 +
24 + strategy:
25 + fail-fast: false
26 + matrix:
27 + include:
28 + - arch: amd64
29 + target: x86_64-unknown-linux-gnu
30 + cross-packages: ""
31 + linker: ""
32 + - arch: arm64
33 + target: aarch64-unknown-linux-gnu
34 + cross-packages: "gcc-aarch64-linux-gnu"
35 + linker: "aarch64-linux-gnu-gcc"
36 +
37 + steps:
38 + - name: Resolve release tag
39 + id: tag
40 + shell: bash
41 + run: |
42 + if [[ "${{ github.event_name }}" == "release" ]]; then
43 + TAG="${{ github.event.release.tag_name }}"
44 + else
45 + TAG="${{ github.event.inputs.tag }}"
46 + fi
47 + echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
48 +
49 + - name: Checkout
50 + uses: actions/checkout@v6
51 + with:
52 + ref: ${{ steps.tag.outputs.tag }}
53 +
54 + - name: Install Rust toolchain
55 + uses: dtolnay/rust-toolchain@stable
56 + with:
57 + targets: ${{ matrix.target }}
58 +
59 + - name: Install cross-compilation toolchain
60 + if: matrix.cross-packages != ''
61 + run: |
62 + sudo apt-get update
63 + sudo apt-get install -y ${{ matrix.cross-packages }}
64 +
65 + - name: Install cargo-deb
66 + run: cargo install cargo-deb --locked
67 +
68 + - name: Setup Rust cache
69 + uses: Swatinem/rust-cache@v2
70 + with:
71 + key: deb-${{ matrix.target }}
72 +
73 + # Configure the cross-linker so Cargo can link arm64 binaries on an
74 + # x86_64 host. This file is only written for cross-compilation jobs;
75 + # native amd64 builds need no extra configuration.
76 + - name: Configure cross-linker
77 + if: matrix.linker != ''
78 + shell: bash
79 + run: |
80 + mkdir -p .cargo
81 + printf '[target.${{ matrix.target }}]\nlinker = "${{ matrix.linker }}"\n' >> .cargo/config.toml
82 +
83 + - name: Verify Cargo.toml version matches tag
84 + shell: bash
85 + run: |
86 + CARGO_VERSION=$(cargo metadata --no-deps --format-version 1 \
87 + | jq -r '.packages[] | select(.name == "proses") | .version')
88 + TAG_VERSION="${{ steps.tag.outputs.tag }}"
89 + TAG_VERSION="${TAG_VERSION#v}"
90 +
91 + echo "Cargo.toml version : ${CARGO_VERSION}"
92 + echo "Release tag version: ${TAG_VERSION}"
93 +
94 + if [[ "${CARGO_VERSION}" != "${TAG_VERSION}" ]]; then
95 + echo "::error::Version mismatch — bump version in Cargo.toml before releasing."
96 + exit 1
97 + fi
98 +
99 + # cargo-deb compiles the binary and assembles the .deb in one step.
100 + # For cross-compiled targets it automatically locates the
101 + # target-prefixed strip (e.g. aarch64-linux-gnu-strip) that ships
102 + # with the gcc-<arch>-linux-gnu package installed above.
103 + - name: Build .deb package
104 + shell: bash
105 + run: cargo deb --target ${{ matrix.target }} --locked
106 +
107 + - name: Rename .deb with architecture suffix
108 + id: deb
109 + shell: bash
110 + run: |
111 + DEB_FILE=$(find "target/${{ matrix.target }}/debian" -name '*.deb' -print -quit)
112 +
113 + if [[ -z "${DEB_FILE}" ]]; then
114 + echo "::error::No .deb file found in target/${{ matrix.target }}/debian/"
115 + exit 1
116 + fi
117 +
118 + echo "path=${DEB_FILE}" >> "$GITHUB_OUTPUT"
119 + echo "name=$(basename "${DEB_FILE}")" >> "$GITHUB_OUTPUT"
120 +
121 + - name: Inspect package
122 + shell: bash
123 + run: dpkg-deb --info "${{ steps.deb.outputs.path }}"
124 +
125 + - name: Upload artifact
126 + uses: actions/upload-artifact@v4
127 + with:
128 + name: deb-${{ matrix.arch }}
129 + path: ${{ steps.deb.outputs.path }}
130 +
131 + - name: Attach to GitHub Release
132 + uses: softprops/action-gh-release@v2
133 + with:
134 + tag_name: ${{ steps.tag.outputs.tag }}
135 + files: ${{ steps.deb.outputs.path }}
Cargo.toml
+15
@@ -59,3 +59,18 @@ home = "0.5"
59
60 # One-time global initialisation of the Config singleton
61 once_cell = "1"
62 +
63 +# ── Debian packaging (cargo-deb) ──────────────────────────────────────────────
64 +[package.metadata.deb]
65 +maintainer = "Seto Elkahfi <hej@setoelkahfi.se>"
66 +section = "utils"
67 +priority = "optional"
68 +depends = "libc6 (>= 2.17)"
69 +extended-description = """\
70 +Proses is a fast, secure process manager built in Rust. \
71 +One command starts your app, supervises it, restarts it on crash, \
72 +and captures its logs — no config files, no Node runtime, \
73 +no dependency hell. A single binary. A live terminal dashboard."""
74 +assets = [
75 + ["target/release/proses", "usr/bin/", "755"],
76 +]
README.md
-1
@@ -2,7 +2,6 @@
2 <h1>
3 <p align="center">
4 <img src="./assets/proses-logo.png" alt="Proses Logo" width="500">
5 - <br>Proses
5 </h1>
6 <p align="center">
7 <br />