name: Release
on:
push:
tags:
- '*'
env:
RUST_VERSION: "1.91.1"
jobs:
build-linux-amd64:
name: Build Linux AMD64 (Static)
runs-on: ubuntu-latest
container:
image: alpine:latest
steps:
- name: Install build dependencies
run: |
apk add --no-cache \
git \
curl \
bash \
build-base \
pkgconfig \
dbus-dev \
gtk+3.0-dev \
libnftnl-dev \
libmnl-dev \
libmnl-static \
musl-dev
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust via rustup
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain ${{ env.RUST_VERSION }} --profile minimal
source $HOME/.cargo/env
rustc --version
cargo --version
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: alpine-amd64-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
alpine-amd64-cargo-
- name: Build static release binary
run: |
source $HOME/.cargo/env
RUSTC_LOG=rustc_codegen_ssa::back::link=info \
RUSTFLAGS='-C target-feature=+crt-static -C link-arg=-Wl,-static -C link-arg=-lmnl -C link-arg=-lc' \
cargo build --release --target x86_64-unknown-linux-musl
- name: Prepare artifacts
run: |
cp -v target/x86_64-unknown-linux-musl/release/tailscale-systray \
tailscale-systray-linux-amd64
sha256sum tailscale-systray-linux-amd64 > tailscale-systray-linux-amd64.sha256
file tailscale-systray-linux-amd64
ldd tailscale-systray-linux-amd64 || echo "Static binary - no dynamic dependencies"
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: tailscale-systray-linux-amd64
path: |
tailscale-systray-linux-amd64
tailscale-systray-linux-amd64.sha256
retention-days: 7
build-linux-arm64:
name: Build Linux ARM64 (Static)
runs-on: ubuntu-24.04-arm
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build in Alpine container
run: |
docker run --rm \
-v "${{ github.workspace }}:/workspace" \
-w /workspace \
alpine:latest \
sh -c '
set -e
apk add --no-cache \
git \
curl \
bash \
build-base \
pkgconfig \
dbus-dev \
gtk+3.0-dev \
libnftnl-dev \
libmnl-dev \
libmnl-static \
musl-dev
curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain ${{ env.RUST_VERSION }} --profile minimal
source $HOME/.cargo/env
RUSTFLAGS="-C target-feature=+crt-static -C link-arg=-Wl,-static -C link-arg=-lmnl -C link-arg=-lc" \
cargo build --release --target aarch64-unknown-linux-musl
cp -v target/aarch64-unknown-linux-musl/release/tailscale-systray tailscale-systray-linux-arm64
sha256sum tailscale-systray-linux-arm64 > tailscale-systray-linux-arm64.sha256
file tailscale-systray-linux-arm64
ldd tailscale-systray-linux-arm64 || echo "Static binary - no dynamic dependencies"
'
- name: Verify artifacts were created
run: |
ls -lh tailscale-systray-linux-arm64*
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: tailscale-systray-linux-arm64
path: |
tailscale-systray-linux-arm64
tailscale-systray-linux-arm64.sha256
retention-days: 7
create-release:
name: Create GitHub Release
runs-on: ubuntu-latest
needs: [build-linux-amd64, build-linux-arm64]
permissions:
contents: write
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Display artifact structure
run: ls -R artifacts
- name: Prepare release files
run: |
mkdir -p release
cp artifacts/tailscale-systray-linux-amd64/* release/
cp artifacts/tailscale-systray-linux-arm64/* release/
ls -lh release/
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
draft: true
generate_release_notes: true
files: |
release/tailscale-systray-linux-amd64
release/tailscale-systray-linux-amd64.sha256
release/tailscale-systray-linux-arm64
release/tailscale-systray-linux-arm64.sha256
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}