Skip to content

nightly

nightly #723

Workflow file for this run

# CI pipeline for stable binaries
# Keep in sync with:
# - .github/workflows/debug_build.yml
# - Dockerfile-CI.Dockerfile
# - Dockerfile-CI.alpine.Dockerfile
# - https://github.com/lycheeverse/lychee-action/blob/master/action.yml
name: Release Binary
# Only do the release on x.y.z tags or manual workflow dispatch
on:
release:
types:
- published
- created
- prereleased
workflow_dispatch:
# We need this to be able to upload releases
permissions:
contents: write
env:
CARGO_TERM_COLOR: always
jobs:
# The create-release job runs purely to initialize the GitHub release itself
create-release:
name: create-release
runs-on: ubuntu-latest
outputs:
tag_name: ${{ steps.get_release.outputs.tag_name }}
upload_url: ${{ steps.get_release.outputs.upload_url }}
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Get release
id: get_release
uses: bruceadams/get-release@v1.3.2
env:
GITHUB_TOKEN: ${{ github.token }}
# Skip step if not in the official repository as it would fail.
# Instead fail at the end of this workflow.
if: ${{ github.repository == 'lycheeverse/lychee' }}
build-release:
name: build-release
needs: ["create-release"]
runs-on: ${{ matrix.os }}
env:
# For some builds, we use cross to test on 32-bit and big-endian systems.
CARGO: cargo
# When CARGO is set to CROSS, this is set to `--target matrix.target`.
TARGET_FLAGS:
# When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
TARGET_DIR: ./target
# Emit backtraces on panics.
RUST_BACKTRACE: 1
strategy:
fail-fast: false
matrix:
include:
# Linux builds
- build: x86_64-gnu
os: ubuntu-latest
rust: stable
target: x86_64-unknown-linux-gnu
strip: x86_64-linux-gnu-strip
- build: x86_64-musl
os: ubuntu-latest
rust: stable
target: x86_64-unknown-linux-musl
strip: x86_64-linux-musl-strip
- build: arm-gnueabihf
os: ubuntu-latest
rust: stable
target: armv7-unknown-linux-gnueabihf
strip: arm-linux-gnueabihf-strip
qemu: qemu-arm
- build: arm-musleabi
os: ubuntu-latest
rust: stable
target: arm-unknown-linux-musleabi
strip: arm-linux-musleabi-strip
qemu: qemu-arm
- build: arm-musleabihf
os: ubuntu-latest
rust: stable
target: arm-unknown-linux-musleabihf
strip: arm-linux-musleabihf-strip
qemu: qemu-arm
- build: aarch64-gnu
os: ubuntu-latest
rust: stable
target: aarch64-unknown-linux-gnu
strip: aarch64-linux-gnu-strip
qemu: qemu-aarch64
- build: aarch64-musl
os: ubuntu-latest
rust: stable
target: aarch64-unknown-linux-musl
strip: aarch64-linux-musl-strip
qemu: qemu-aarch64
- build: i686-gnu
os: ubuntu-latest
rust: stable
target: i686-unknown-linux-gnu
strip: x86_64-linux-gnu-strip
qemu: i386
# macOS builds
- build: x86_64-macos
os: macos-latest
rust: stable
target: x86_64-apple-darwin
- build: aarch64-macos
os: macos-latest
rust: stable
target: aarch64-apple-darwin
# Windows builds
- build: x86_64-windows-msvc
os: windows-latest
rust: stable
target: x86_64-pc-windows-msvc
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Install packages (Ubuntu)
if: matrix.os == 'ubuntu-latest'
shell: bash
run: |
# Install musl tools if needed
if [[ "${{ matrix.target }}" == *musl* ]]; then
sudo apt-get update && sudo apt-get install -y musl-tools
fi
# Install cross-compilation toolchains
if [[ "${{ matrix.target }}" == arm* ]]; then
sudo apt-get update && sudo apt-get install -y binutils-arm-linux-gnueabihf
fi
if [[ "${{ matrix.target }}" == aarch64* ]]; then
sudo apt-get update && sudo apt-get install -y binutils-aarch64-linux-gnu
fi
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
target: ${{ matrix.target }}
- name: Use Cross
# Skip cross for x86_64-unknown-linux-gnu since it's the native host target.
# Building it via cross fails on aws-lc-sys due to an outdated gcc in the cross image.
if: matrix.os == 'ubuntu-latest' && matrix.target != 'x86_64-unknown-linux-gnu'
shell: bash
run: |
# Use cross for Linux cross-compilation
cargo install cross --git https://github.com/cross-rs/cross
echo "CARGO=cross" >> $GITHUB_ENV
- name: Set target variables
shell: bash
run: |
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV
- name: Show command used for Cargo
shell: bash
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
shell: bash
run: |
${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }}
if [[ "${{ matrix.os }}" == windows-* ]]; then
bin="target/${{ matrix.target }}/release/lychee.exe"
else
bin="target/${{ matrix.target }}/release/lychee"
fi
echo "BIN=$bin" >> $GITHUB_ENV
- name: Strip release binary (macOS)
if: matrix.os == 'macos-latest'
shell: bash
run: strip "$BIN"
- name: Strip release binary (native Linux host)
# The native x86_64-unknown-linux-gnu build does not go through cross,
# so strip it directly on the runner.
if: matrix.target == 'x86_64-unknown-linux-gnu'
shell: bash
run: strip "$BIN"
- name: Strip release binary (cross)
if: env.CARGO == 'cross'
shell: bash
run: |
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.strip }}" \
"/$BIN"
- name: Determine archive name
shell: bash
run: |
echo "ARCHIVE=lychee-${{ matrix.target }}" >> $GITHUB_ENV
- name: Creating directory for archive
shell: bash
run: |
mkdir -p "$ARCHIVE/docs" "$ARCHIVE/complete"
cp "$BIN" "$ARCHIVE"/
cp README.md "$ARCHIVE"/
cp docs/*.md "$ARCHIVE/docs/"
- name: Generate man page (no emulation)
if: matrix.qemu == ''
shell: bash
run: |
"$BIN" --version
"$BIN" --generate man > "$ARCHIVE/docs/lychee.1"
- name: Generate man page (emulation)
if: matrix.qemu != ''
shell: bash
run: |
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.qemu }}" "/$BIN" --version
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.qemu }}" "/$BIN" \
--generate man > "$ARCHIVE/docs/lychee.1"
- name: Generate shell completions without emulation
if: matrix.qemu == ''
shell: bash
run: |
"$BIN" --generate complete-bash > "$ARCHIVE/complete/lychee.bash"
"$BIN" --generate complete-elvish > "$ARCHIVE/complete/lychee.elv"
"$BIN" --generate complete-fish > "$ARCHIVE/complete/lychee.fish"
"$BIN" --generate complete-powershell > "$ARCHIVE/complete/_lychee.ps1"
"$BIN" --generate complete-zsh > "$ARCHIVE/complete/_lychee"
- name: Generate shell completions with emulation
if: matrix.qemu != ''
shell: bash
run: |
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.qemu }}" "/$BIN" \
--generate complete-bash > "$ARCHIVE/complete/lychee.bash"
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.qemu }}" "/$BIN" \
--generate complete-elvish > "$ARCHIVE/complete/lychee.elv"
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.qemu }}" "/$BIN" \
--generate complete-fish > "$ARCHIVE/complete/lychee.fish"
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.qemu }}" "/$BIN" \
--generate complete-powershell > "$ARCHIVE/complete/_lychee.ps1"
docker run --rm -v \
"$PWD/target:/target:Z" \
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
"${{ matrix.qemu }}" "/$BIN" \
--generate complete-zsh > "$ARCHIVE/complete/_lychee"
- name: Build archive (Windows)
shell: bash
if: startsWith(matrix.os, 'windows')
run: |
7z a "$ARCHIVE.zip" "$ARCHIVE"
certutil -hashfile "$ARCHIVE.zip" SHA256 > "$ARCHIVE.zip.sha256"
echo "ASSET=$ARCHIVE.zip" >> $GITHUB_ENV
echo "ASSET_SUM=$ARCHIVE.zip.sha256" >> $GITHUB_ENV
- name: Build archive (Unix)
shell: bash
if: ${{ !startsWith(matrix.os, 'windows') }}
run: |
tar czf "$ARCHIVE.tar.gz" "$ARCHIVE"
shasum -a 256 "$ARCHIVE.tar.gz" > "$ARCHIVE.tar.gz.sha256"
echo "ASSET=$ARCHIVE.tar.gz" >> $GITHUB_ENV
echo "ASSET_SUM=$ARCHIVE.tar.gz.sha256" >> $GITHUB_ENV
- name: Build macOS DMG (aarch64 only)
# We only build a DMG for Apple Silicon (aarch64). The x86_64 macOS
# build ships as a tar.gz only, as demand for that target is low.
# If you need an x86_64 macOS DMG, please open an issue.
if: matrix.build == 'aarch64-macos'
shell: bash
run: |
# Create DMG for macOS arm64 and append it to the assets to upload
mkdir -p dmg
cp "$BIN" dmg/
hdiutil create -fs HFS+ -srcfolder dmg -volname lychee "$ARCHIVE.dmg"
shasum -a 256 "$ARCHIVE.dmg" > "$ARCHIVE.dmg.sha256"
echo "ASSET=${ASSET} $ARCHIVE.dmg" >> $GITHUB_ENV
echo "ASSET_SUM=${ASSET_SUM} $ARCHIVE.dmg.sha256" >> $GITHUB_ENV
- name: Check if possible to release
if: ${{ needs.create-release.outputs.upload_url == '' }}
shell: bash
run: |
echo "Releasing only works on the master/main branch in the official repository."
exit 1
- name: Upload release archive
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: |
version="${{ needs.create-release.outputs.tag_name }}"
gh release upload "$version" ${{ env.ASSET }} ${{ env.ASSET_SUM }}
binstall-check:
needs: [build-release]
runs-on: ubuntu-latest
env:
# Avoid 403 rate-limit failures when binstall queries GitHub releases.
GITHUB_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v6
- uses: cargo-bins/cargo-binstall@main
# Uses nightly to preview upcoming release archive changes.
- run: sed -i.bak 's|/{ name }-v{ version }/|/nightly/|' lychee-bin/Cargo.toml
if: github.event.release.prerelease
# Use `--manifest-path .` so binstall validates the in-tree binstall metadata.
- run: cargo binstall --manifest-path . --strategies crate-meta-data lychee --no-confirm --verbose