From 564c76c38b3ccdffce3544523ace2d3f8da2387a Mon Sep 17 00:00:00 2001 From: kjuulh Date: Fri, 21 Oct 2022 01:39:22 +0200 Subject: [PATCH] added releaser --- .github/workflows/release.yml | 176 ++++++++++++++++++++++++++++++++++ ci/build-dep | 33 +++++++ ci/cargo-out-dir | 14 +++ ci/ubuntu-install-packages | 10 ++ 4 files changed, 233 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 ci/build-dep create mode 100644 ci/cargo-out-dir create mode 100644 ci/ubuntu-install-packages diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..08cb403 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,176 @@ +# The way this works is the following: +# +# The create-release job runs purely to initialize the GitHub release itself +# and to output upload_url for the following job. +# +# The build-release job runs only once create-release is finished. It gets the +# release upload URL from create-release job outputs, then builds the release +# executables for each supported platform and attaches them as release assets +# to the previously created release. +# +# The key here is that we create the release only once. +# +# Reference: +# https://eugene-babichenko.github.io/blog/2020/05/09/github-actions-cross-platform-auto-releases/ + +name: release +on: + push: + # Enable when testing release infrastructure on a branch. + # branches: + # - ag/work + tags: + - "[0-9]+.[0-9]+.[0-9]+" +jobs: + create-release: + name: create-release + runs-on: ubuntu-22.04 + # env: + # Set to force version number, e.g., when no tag exists. + # KIGNORE_VERSION: TEST-0.0.0 + outputs: + upload_url: ${{ steps.release.outputs.upload_url }} + kignore_version: ${{ env.KIGNORE_VERSION }} + steps: + - name: Get the release version from the tag + shell: bash + if: env.KIGNORE_VERSION == '' + run: | + # Apparently, this is the right way to get a tag name. Really? + # + # See: https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027 + echo "KIGNORE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + echo "version is: ${{ env.KIGNORE_VERSION }}" + - name: Create GitHub release + id: release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.KIGNORE_VERSION }} + release_name: ${{ env.KIGNORE_VERSION }} + + 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 + # Build static releases with PCRE2. + PCRE2_SYS_STATIC: 1 + strategy: + matrix: + build: [linux, linux-arm, macos, win-msvc, win-gnu, win32-msvc] + include: + - build: linux + os: ubuntu-22.04 + rust: nightly + target: x86_64-unknown-linux-musl + - build: linux-arm + os: ubuntu-22.04 + rust: nightly + target: arm-unknown-linux-gnueabihf + - build: macos + os: macos-12 + rust: nightly + target: x86_64-apple-darwin + - build: win-msvc + os: windows-2022 + rust: nightly + target: x86_64-pc-windows-msvc + - build: win-gnu + os: windows-2022 + rust: nightly-x86_64-gnu + target: x86_64-pc-windows-gnu + - build: win32-msvc + os: windows-2022 + rust: nightly + target: i686-pc-windows-msvc + + steps: + - name: Checkout repository + uses: + actions/checkout@v3 + + #- name: Install packages (Ubuntu) + # if: matrix.os == 'ubuntu-22.04' + # run: | + # ci/ubuntu-install-packages + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.rust }} + target: ${{ matrix.target }} + + - name: Use Cross + shell: bash + 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 + run: ${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }} + + - name: Strip release binary (linux and macos) + if: matrix.build == 'linux' || matrix.build == 'macos' + run: strip "target/${{ matrix.target }}/release/kignore" + + - 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/kignore + + - name: Build archive + shell: bash + run: | + outdir="$(ci/cargo-out-dir "${{ env.TARGET_DIR }}")" + staging="kignore-${{ needs.create-release.outputs.kignore_version }}-${{ matrix.target }}" + mkdir -p "$staging"/{complete,doc} + + cp {README.md,COPYING,UNLICENSE,LICENSE-MIT} "$staging/" + cp {CHANGELOG.md,FAQ.md,GUIDE.md} "$staging/doc/" + #cp "$outdir"/{rg.bash,rg.fish,_rg.ps1} "$staging/complete/" + #cp complete/_rg "$staging/complete/" + + if [ "${{ matrix.os }}" = "windows-2022" ]; then + cp "target/${{ matrix.target }}/release/kignore.exe" "$staging/" + 7z a "$staging.zip" "$staging" + echo "ASSET=$staging.zip" >> $GITHUB_ENV + else + # The man page is only generated on Unix systems. + cp "$outdir"/kignore.1 "$staging/doc/" + cp "target/${{ matrix.target }}/release/kignore" "$staging/" + tar czf "$staging.tar.gz" "$staging" + echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV + fi + + - name: Upload release archive + uses: actions/upload-release-asset@v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.create-release.outputs.upload_url }} + asset_path: ${{ env.ASSET }} + asset_name: ${{ env.ASSET }} + asset_content_type: application/octet-stream diff --git a/ci/build-dep b/ci/build-dep new file mode 100644 index 0000000..1f8cce1 --- /dev/null +++ b/ci/build-dep @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e +D="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" + +# This script builds a binary dpkg for Debian based distros. It does not +# currently run in CI, and is instead run manually and the resulting dpkg is +# uploaded to GitHub via the web UI. +# +# Note that this requires 'cargo deb', which can be installed with +# 'cargo install cargo-deb'. +# +# This should be run from the root of the ripgrep repo. + +if ! command -V cargo-deb > /dev/null 2>&1; then + echo "cargo-deb command missing" >&2 + exit 1 +fi + +# 'cargo deb' does not seem to provide a way to specify an asset that is +# created at build time, such as ripgrep's man page. To work around this, +# we force a debug build, copy out the man page (and shell completions) +# produced from that build, put it into a predictable location and then build +# the deb, which knows where to look. +cargo build + +DEPLOY_DIR=deployment/deb +OUT_DIR="$("$D"/cargo-out-dir target/debug/)" +mkdir -p "$DEPLOY_DIR" + +# Since we're distributing the dpkg, we don't know whether the user will have +# PCRE2 installed, so just do a static build. +PCRE2_SYS_STATIC=1 cargo deb --target x86_64-unknown-linux-musl diff --git a/ci/cargo-out-dir b/ci/cargo-out-dir new file mode 100644 index 0000000..9c0712b --- /dev/null +++ b/ci/cargo-out-dir @@ -0,0 +1,14 @@ +#!/bin/bash + +if [ $# != 1 ]; then + echo "Usage: $(basename "$0") " >&2 + exit 2 +fi + +# This works by finding the most recent stamp file, which is produced by +# every ripgrep build. +target_dir="$1" +find "$target_dir" -name kignore-stamp -print0 \ + | xargs -0 ls -t \ + | head -n1 \ + | xargs dirname diff --git a/ci/ubuntu-install-packages b/ci/ubuntu-install-packages new file mode 100644 index 0000000..6ff8ecc --- /dev/null +++ b/ci/ubuntu-install-packages @@ -0,0 +1,10 @@ +#!/bin/sh + +if ! command -V sudo; then + apt-get update + apt-get install -y --no-install-recommends sudo +fi +sudo apt-get update +sudo apt-get install -y --no-install-recommends \ + zsh xz-utils liblz4-tool musl-tools \ + brotli zstd