Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 51 additions & 15 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -1,32 +1,68 @@
on: [push, pull_request]
name: Test & Lint

name: Continuous Integration
on:
push:
paths:
- 'Cargo.lock'
- 'Cargo.toml'
- 'rust-toolchain.toml'
- '.rustfmt.toml'
- 'src/**'
pull_request:
paths:
- 'Cargo.lock'
- 'Cargo.toml'
- 'rust-toolchain.toml'
- '.rustfmt.toml'
- 'src/**'

env:
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
RUST_BACKTRACE: short
RUSTFLAGS: "-D warnings -W rust-2021-compatibility"
RUSTUP_MAX_RETRIES: 10

defaults:
run:
shell: bash

jobs:
check:
name: Check
runs-on: windows-latest
runs-on: ubuntu-24.04
steps:
- name: Checkout sources
uses: actions/checkout@v6

- name: Install toolchain
uses: dtolnay/rust-toolchain@stable

# This plugin should be loaded after toolchain setup
- name: Cache
uses: Swatinem/rust-cache@v2

- name: Run cargo check
uses: actions-rs/cargo@v1
with:
command: check
run: cargo check

lints:
name: Lints
runs-on: windows-latest
runs-on: ubuntu-24.04
steps:
- name: Checkout sources
uses: actions/checkout@v6
- name: Run cargo fmt
uses: actions-rs/cargo@v1

- name: Install toolchain
uses: dtolnay/rust-toolchain@stable
with:
command: fmt
args: --all -- --check
components: rustfmt, clippy

# This plugin should be loaded after toolchain setup
- name: Cache
uses: Swatinem/rust-cache@v2

- name: Run cargo fmt
run: cargo fmt --all -- --check --color always

- name: Run cargo clippy
uses: actions-rs/cargo@v1
with:
command: clippy
args: -- -D warnings
run: cargo clippy --all-targets --all-features -- -D warnings
13 changes: 13 additions & 0 deletions .github/workflows/pr-title.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Check PR title

on: [pull_request_target]

jobs:
lint:
runs-on: ubuntu-24.04
permissions:
statuses: write
steps:
- uses: aslafy-z/conventional-pr-title-action@v3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
79 changes: 79 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Publish

on:
workflow_dispatch:
inputs:
tag-name:
description: 'The git tag to publish'
required: true
type: string

jobs:
publish-cratesio:
name: Publish to crates.io
runs-on: ubuntu-24.04
environment: "publish-crates.io"
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ github.event.inputs.tag-name }}

- name: Install toolchain
uses: dtolnay/rust-toolchain@stable

# This plugin should be loaded after toolchain setup
- name: Cache
uses: Swatinem/rust-cache@v2

- name: Upload to crates.io
run: cargo publish
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

publish-homebrew:
name: Publish to Homebrew
runs-on: ubuntu-24.04
environment: "publish-homebrew"
steps:
- name: Checkout homebrew-tools Repository
uses: actions/checkout@v6
with:
repository: michidk/homebrew-tools
token: ${{ secrets.COMMITTER_TOKEN }}
path: homebrew-tools
ref: main

- name: Update displayz.rb Formula
run: |
FORMULA_PATH="homebrew-tools/Formula/displayz.rb"
mkdir -p artifacts

artifacts=(
"displayz-x86_64-apple-darwin.tar.gz"
"displayz-aarch64-apple-darwin.tar.gz"
"displayz-x86_64-unknown-linux-musl.tar.gz"
"displayz-arm-unknown-linux-gnueabihf.tar.gz"
)

for asset in "${artifacts[@]}"; do
identifier="${asset%.tar.gz}"
wget -q -O "artifacts/${asset}" "https://github.com/michidk/displayz/releases/download/${{ github.event.inputs.tag-name }}/${asset}" || exit 1
sha256=$(sha256sum "artifacts/${asset}" | awk '{print $1}')
sed -i "s|sha256 \".*\" # sha:${identifier}|sha256 \"${sha256}\" # sha:${identifier}|" "$FORMULA_PATH"
done

# Extract version number by removing the leading 'v' from the tag
version_number="${{ github.event.inputs.tag-name }}"
version_number="${version_number#v}"

sed -i "s/version \".*\"/version \"${version_number}\"/" "$FORMULA_PATH"

- name: Commit and Push Changes
run: |
cd homebrew-tools
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add Formula/displayz.rb
git commit -m "Update displayz to version ${{ github.event.inputs.tag-name }}"
git push origin main
140 changes: 140 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
name: Release

# References:
# - https://github.com/BurntSushi/ripgrep/blob/master/.github/workflows/release.yml

on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'

permissions:
contents: write

defaults:
run:
shell: bash

env:
APP_NAME: displayz

jobs:
create-release:
name: Create release
runs-on: ubuntu-24.04
outputs:
upload_url: ${{ steps.release.outputs.upload_url }}
steps:
- name: Get release version
if: env.VERSION == ''
run: |
# Get the version from github tag
echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
echo "Version: ${{ env.VERSION }}"

- name: Create release
id: release
uses: mikepenz/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
name: ${{ env.VERSION }}
draft: true
generate_release_notes: true

build-release:
name: Build release
needs: ['create-release']
runs-on: ${{ matrix.os }}
env:
# Build tool. For some builds this can be cross.
CARGO: cargo
# When `CARGO` is set to `cross` this will be set to `--target {{matrix.target}}`.
TARGET_FLAGS: ""
# When `CARGO` is set to `cross` this will be set to `./target/{{matrix.target}}`.
TARGET_DIR: ./target
# Get backtraces on panics.
RUST_BACKTRACE: 1
strategy:
matrix:
include:
- build: linux
os: ubuntu-latest
target: x86_64-unknown-linux-musl
- build: linux-arm
os: ubuntu-latest
target: arm-unknown-linux-gnueabihf
- build: macos
os: macos-latest
target: x86_64-apple-darwin
- build: macos-arm
os: macos-latest
target: aarch64-apple-darwin
- build: win32-msvc
os: windows-latest
target: i686-pc-windows-msvc
- build: win-msvc
os: windows-latest
target: x86_64-pc-windows-msvc
steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Install toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}

- name: Setup Cross
if: matrix.target != ''
run: |
cargo install cross
echo "CARGO=cross" >> $GITHUB_ENV
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV

- name: Show command used for Cargo
run: |
echo "cargo command is: ${{ env.CARGO }}"
echo "target flag is: ${{ env.TARGET_FLAGS }}"
echo "target dir is: ${{ env.TARGET_DIR }}"

- name: Build release binary without features
run: ${{ env.CARGO }} build --release --verbose ${{ env.TARGET_FLAGS }}

- name: Strip release binary (linux)
if: matrix.build == 'linux' || matrix.os == 'macos'
run: strip "${{ env.TARGET_DIR }}/release/${{ env.APP_NAME }}"

- name: Strip release binary (arm)
if: matrix.build == 'linux-arm'
run: |
docker run --rm -v \
"$PWD/target:/target:Z" \
rustembedded/cross:arm-unknown-linux-gnueabihf \
arm-linux-gnueabihf-strip \
/target/arm-unknown-linux-gnueabihf/release/${{ env.APP_NAME }}

- name: Build archive
run: |
staging="${{ env.APP_NAME }}-${{ matrix.target }}"
mkdir -p "$staging"

if [[ "${{ matrix.os }}" = "windows-latest" ]]; then
echo "Archiving windows build"
cp "${{ env.TARGET_DIR }}/release/${{ env.APP_NAME }}.exe" "$staging/"
7z a "$staging.zip" "$staging"
echo "ASSET=$staging.zip" >> $GITHUB_ENV
else
echo "Archiving unix build"
cp "${{ env.TARGET_DIR }}/release/${{ env.APP_NAME }}" "$staging/"
tar czf "$staging.tar.gz" "$staging"
echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV
fi

- name: Upload archive
uses: shogo82148/actions-upload-release-asset@v1
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.ASSET }}
asset_name: ${{ env.ASSET }}
asset_content_type: application/octet-stream
Loading