Skip to content

Merge pull request #83 from tamirelazar/dev #3

Merge pull request #83 from tamirelazar/dev

Merge pull request #83 from tamirelazar/dev #3

Workflow file for this run

name: Release
on:
workflow_dispatch:
push:
tags: ['v*']
env:
CARGO_TERM_COLOR: always
jobs:
hygiene:
name: Hygiene
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Check public tree contains no dev-meta paths
shell: bash
run: ./scripts/check_tree_clean.sh
build:
name: Build Release
needs: hygiene
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
artifact_name: tslime
asset_name: tslime-linux-x86_64
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: tslime
asset_name: tslime-macos-arm64
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact_name: tslime.exe
asset_name: tslime-windows-x86_64.exe
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install musl tools (Linux)
if: runner.os == 'Linux'
run: sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends musl-tools
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
- name: Build release binary
run: cargo build --release --verbose --target ${{ matrix.target }}
- name: Check binary size
if: runner.os == 'Linux'
run: |
BIN="target/${{ matrix.target }}/release/tslime"
size "$BIN" || true
SIZE=$(stat -c%s "$BIN")
MAX_SIZE=4000000
if [ "$SIZE" -gt "$MAX_SIZE" ]; then
echo "Binary size $SIZE exceeds $MAX_SIZE limit"
exit 1
fi
echo "Binary size $SIZE is under $MAX_SIZE limit"
# Stage the binary under its release asset name so the downloaded artifact
# is named correctly for `gh release create` (no post-download rename).
- name: Stage binary
shell: bash
run: |
mkdir -p dist
cp "target/${{ matrix.target }}/release/${{ matrix.artifact_name }}" "dist/${{ matrix.asset_name }}"
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.asset_name }}
path: dist/${{ matrix.asset_name }}
gui-build:
name: GUI Build
needs: hygiene
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
include:
- os: ubuntu-latest
artifact_name: tslime
asset_name: tslime-gui-linux-x86_64
- os: macos-latest
artifact_name: tslime
asset_name: tslime-gui-macos
- os: windows-latest
artifact_name: tslime.exe
asset_name: tslime-gui-windows.exe
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Install Linux GUI dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends \
libxkbcommon-dev \
libwayland-dev \
libx11-dev libxcursor-dev libxrandr-dev libxi-dev \
libvulkan-dev mesa-vulkan-drivers \
libfontconfig1-dev libfreetype6-dev \
libegl1-mesa-dev
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-gui-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-gui-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-cargo-build-gui-${{ hashFiles('**/Cargo.lock') }}
- name: Build GUI binary
run: cargo build --release --features gui --verbose
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.asset_name }}
path: target/release/${{ matrix.artifact_name }}
# Publish a GitHub Release with the CLI binaries attached and notes pulled
# from the matching CHANGELOG section. Tag pushes only (skipped for manual
# workflow_dispatch runs, which have no tag to release).
release:
name: Publish GitHub Release
needs: build
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download Linux binary
uses: actions/download-artifact@v4
with:
name: tslime-linux-x86_64
path: dist
- name: Download Windows binary
uses: actions/download-artifact@v4
with:
name: tslime-windows-x86_64.exe
path: dist
- name: Extract release notes from CHANGELOG
shell: bash
run: |
version="${GITHUB_REF_NAME#v}"
awk -v v="$version" '
$0 ~ ("^## \\[" v "\\]") { found=1; next }
found && /^## \[/ { exit }
found { print }
' CHANGELOG.md > RELEASE_NOTES.md
if [ ! -s RELEASE_NOTES.md ]; then
printf 'tslime %s\n' "$GITHUB_REF_NAME" > RELEASE_NOTES.md
fi
- name: Create GitHub Release
env:
GH_TOKEN: ${{ github.token }}
shell: bash
run: |
gh release create "$GITHUB_REF_NAME" \
--repo "$GITHUB_REPOSITORY" \
--title "tslime $GITHUB_REF_NAME" \
--notes-file RELEASE_NOTES.md \
dist/tslime-linux-x86_64 \
dist/tslime-windows-x86_64.exe
# Publish a container image to GHCR so users can `docker run --rm -it
# ghcr.io/<owner>/tslime` without installing anything. Self-contained build
# (the Dockerfile compiles the static musl binary onto a scratch image). Tag
# pushes only. linux/amd64; arm64 is a follow-up.
docker:
name: Publish Docker image
needs: hygiene
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push image
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64
push: true
tags: |
ghcr.io/${{ github.repository }}:latest
ghcr.io/${{ github.repository }}:${{ github.ref_name }}