Files
mikusays-c/.github/workflows/package.yml
T

171 lines
5.7 KiB
YAML

name: Build Packages
permissions:
contents: read
on:
release:
types: [created]
workflow_dispatch:
inputs:
release_tag:
description: 'Release tag to attach packages to (e.g., v0.1.3)'
required: false
type: string
jobs:
build-deb:
name: Build DEB Package (${{ matrix.arch }})
permissions:
contents: write
runs-on: ubuntu-latest
strategy:
matrix:
include:
- arch: x86_64
target: x86_64-unknown-linux-gnu
- arch: aarch64
target: aarch64-unknown-linux-gnu
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install cross-compilation tools
if: matrix.arch == 'aarch64'
run: |
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu
- name: Install cargo-deb
run: cargo install cargo-deb
- name: Build DEB package
run: cargo deb --target ${{ matrix.target }}
env:
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
- name: Find DEB package
id: find-deb
run: |
DEB_PATH=$(find target/${{ matrix.target }}/debian -name "*.deb" | head -n 1)
echo "path=$DEB_PATH" >> $GITHUB_OUTPUT
VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')
DEB_NAME="mikusays-debian-${{ matrix.arch }}-${VERSION}.deb"
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "name=$DEB_NAME" >> $GITHUB_OUTPUT
- name: Upload DEB artifact
uses: actions/upload-artifact@v4
with:
name: deb-package-${{ matrix.arch }}
path: ${{ steps.find-deb.outputs.path }}
- name: Upload to release
if: github.event_name == 'release' || github.event.inputs.release_tag
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.release.tag_name || github.event.inputs.release_tag }}
run: |
install -m 0644 "${{ steps.find-deb.outputs.path }}" \
"$RUNNER_TEMP/${{ steps.find-deb.outputs.name }}"
gh release upload "$RELEASE_TAG" \
"$RUNNER_TEMP/${{ steps.find-deb.outputs.name }}" \
--repo "$GITHUB_REPOSITORY" \
--clobber
build-rpm:
name: Build RPM Package (${{ matrix.arch }})
permissions:
contents: write
runs-on: ubuntu-latest
strategy:
matrix:
include:
- arch: x86_64
target: x86_64-unknown-linux-gnu
- arch: aarch64
target: aarch64-unknown-linux-gnu
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install cross-compilation tools
if: matrix.arch == 'aarch64'
run: |
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu
- name: Install cargo-generate-rpm
run: cargo install cargo-generate-rpm
- name: Build release binary
run: cargo build --release --target ${{ matrix.target }}
env:
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
- name: Strip binary
run: |
if [ "${{ matrix.arch }}" = "aarch64" ]; then
aarch64-linux-gnu-strip target/${{ matrix.target }}/release/mikusays
else
strip target/${{ matrix.target }}/release/mikusays
fi
- name: Generate RPM package
run: cargo generate-rpm --target ${{ matrix.target }}
- name: Find RPM package
id: find-rpm
run: |
RPM_PATH=$(find target/${{ matrix.target }}/generate-rpm -name "*.rpm" | head -n 1)
echo "path=$RPM_PATH" >> $GITHUB_OUTPUT
VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')
RPM_NAME="mikusays-redhat-${{ matrix.arch }}-${VERSION}.rpm"
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "name=$RPM_NAME" >> $GITHUB_OUTPUT
- name: Upload RPM artifact
uses: actions/upload-artifact@v4
with:
name: rpm-package-${{ matrix.arch }}
path: ${{ steps.find-rpm.outputs.path }}
- name: Upload to release
if: github.event_name == 'release' || github.event.inputs.release_tag
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.release.tag_name || github.event.inputs.release_tag }}
run: |
install -m 0644 "${{ steps.find-rpm.outputs.path }}" \
"$RUNNER_TEMP/${{ steps.find-rpm.outputs.name }}"
gh release upload "$RELEASE_TAG" \
"$RUNNER_TEMP/${{ steps.find-rpm.outputs.name }}" \
--repo "$GITHUB_REPOSITORY" \
--clobber
notify-package-repository:
name: Notify package repository
runs-on: ubuntu-latest
needs: [build-deb, build-rpm]
if: github.event_name == 'release' || github.event.inputs.release_tag
permissions:
contents: read
steps:
- name: Dispatch exact release tag
env:
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_TAG: ${{ github.event.release.tag_name || github.event.inputs.release_tag }}
run: |
if ! gh api --method POST repos/xxanqw/apt-repository/dispatches \
--raw-field event_type=new-release \
--field "client_payload[tag_name]=$RELEASE_TAG"; then
echo "::warning::Could not dispatch apt-repository; its daily schedule will publish the release. Check RELEASE_TOKEN if immediate updates are required."
fi