nightly #723
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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 | |