name: Continuous Deployment
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
jobs:
publish:
name: Publishing for ${{ matrix.job.os }}
runs-on: ${{ matrix.job.os }}
strategy:
matrix:
job:
- os: macos-latest
target: aarch64-apple-darwin
use-cross: false
- os: windows-latest
target: x86_64-pc-windows-msvc
use-cross: false
- os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
use-cross: false
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
use-cross: true
- os: ubuntu-22.04
target: i686-unknown-linux-gnu
use-cross: true
- os: ubuntu-22.04
target: arm-unknown-linux-gnueabihf
use-cross: true
- os: ubuntu-22.04
target: aarch64-unknown-linux-gnu
use-cross: true
steps:
- name: Installing Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.job.target }}
- name: Checkout repository
uses: actions/checkout@v4
- name: Install cross
if: matrix.job.use-cross
uses: taiki-e/install-action@v2
with:
tool: cross
- name: Cargo build
env:
MACOSX_DEPLOYMENT_TARGET: 10.7
shell: bash
run: |
if [[ "${{ matrix.job.use-cross }}" == "true" ]]; then
cross build --release --target ${{ matrix.job.target }}
else
cargo build --release --target ${{ matrix.job.target }}
fi
- name: Install required dependencies
shell: bash
run: |
if [[ ${{ matrix.job.target }} == arm-unknown-linux-gnueabihf ]]; then
sudo apt update
sudo apt-get install -y binutils-arm-linux-gnueabihf
fi
if [[ ${{ matrix.job.target }} == aarch64-unknown-linux-gnu ]]; then
sudo apt update
sudo apt-get install -y binutils-aarch64-linux-gnu
fi
- name: Packaging final binary
shell: bash
env:
TARGET: ${{ matrix.job.target }}
PROJECT_NAME: delta
PACKAGE_NAME: git-delta
OS_NAME: ${{ matrix.job.os }}
run: ./etc/ci/before_deploy.sh
- name: Releasing assets
uses: softprops/action-gh-release@v2
with:
draft: true
files: |
delta-*-${{ matrix.job.target }}.*
git-delta*.deb
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
verify-release:
name: Verify release assets
needs: publish
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: Wait for release assets to be available
run: sleep 10
- name: Check all expected assets exist
run: |
tag="${GITHUB_REF#refs/tags/}"
expected=(
"delta-${tag}-aarch64-apple-darwin.tar.gz"
"delta-${tag}-aarch64-unknown-linux-gnu.tar.gz"
"delta-${tag}-arm-unknown-linux-gnueabihf.tar.gz"
"delta-${tag}-i686-unknown-linux-gnu.tar.gz"
"delta-${tag}-x86_64-pc-windows-msvc.zip"
"delta-${tag}-x86_64-unknown-linux-gnu.tar.gz"
"delta-${tag}-x86_64-unknown-linux-musl.tar.gz"
"git-delta_${tag}_amd64.deb"
"git-delta_${tag}_arm64.deb"
"git-delta_${tag}_armhf.deb"
"git-delta_${tag}_i386.deb"
"git-delta-musl_${tag}_amd64.deb"
)
actual=$(gh release view "$tag" --repo "$GITHUB_REPOSITORY" --json assets -q '.assets[].name' | sort)
missing=()
for asset in "${expected[@]}"; do
if ! echo "$actual" | grep -qxF "$asset"; then
missing+=("$asset")
fi
done
if [[ ${#missing[@]} -gt 0 ]]; then
echo "FAIL: missing release assets:"
printf ' %s\n' "${missing[@]}"
exit 1
fi
echo "All ${#expected[@]} expected assets present."
- name: Verify .deb installability on Debian 12
run: |
tag="${GITHUB_REF#refs/tags/}"
deb_url="https://github.com/${GITHUB_REPOSITORY}/releases/download/${tag}/git-delta_${tag}_amd64.deb"
docker run --rm debian:12 bash -c "
set -e
apt-get update -qq > /dev/null 2>&1
apt-get install -y -qq curl > /dev/null 2>&1
curl -fsSL -o /tmp/delta.deb '$deb_url'
dpkg -i /tmp/delta.deb
delta --version
"
- name: Verify .deb libc6 dependencies are Debian 12 compatible
run: |
tag="${GITHUB_REF#refs/tags/}"
max_libc="2.36"
for arch in amd64 arm64 armhf i386; do
deb_url="https://github.com/${GITHUB_REPOSITORY}/releases/download/${tag}/git-delta_${tag}_${arch}.deb"
curl -fsSL -o "/tmp/delta-${arch}.deb" "$deb_url"
depends=$(dpkg-deb -f "/tmp/delta-${arch}.deb" Depends)
echo "${arch}: ${depends}"
libc_ver=$(echo "$depends" | grep -oP 'libc6 \(>= \K[0-9.]+')
if [ "$(printf '%s\n%s' "$libc_ver" "$max_libc" | sort -V | tail -1)" != "$max_libc" ]; then
echo "FAIL: ${arch} requires libc6 >= ${libc_ver}, but Debian 12 has ${max_libc}"
exit 1
fi
done
echo "All .deb packages are Debian 12 compatible."
publish-to-cargo:
name: Publishing to Cargo
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo publish --token ${{ secrets.CARGO_API_KEY }} --allow-dirty
publish-to-winget:
name: Publish to WinGet
runs-on: ubuntu-latest
needs: publish
steps:
- uses: vedantmgoyal2009/winget-releaser@v2
with:
identifier: dandavison.delta
version: ${{ github.ref_name }}
installers-regex: '-pc-windows-msvc\.zip$'
token: ${{ secrets.WINGET_TOKEN }}