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 />