diff options
-rw-r--r-- | .github/workflows/release.yml | 372 |
1 files changed, 194 insertions, 178 deletions
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3f6a27e..9cec89b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,14 +1,68 @@ -name: ci +# The way this works is a little weird. But basically, the create-release job +# runs purely to initialize the GitHub release itself. Once done, the upload +# URL of the release is saved as an artifact. +# +# The build-release job runs only once create-release is finished. It gets +# the release upload URL by downloading the corresponding artifact (which was +# uploaded by create-release). It 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. + +name: release on: - pull_request: push: - branches: - - master - schedule: - - cron: '00 01 * * *' + # Enable when testing release infrastructure on a branch. + # branches: + # - ag/release + tags: + - '[0-9]+.[0-9]+.[0-9]+' jobs: - test: - name: test + create-release: + name: create-release + runs-on: ubuntu-latest + # env: + # Set to force version number, e.g., when no tag exists. + # RG_VERSION: TEST-0.0.0 + steps: + - name: Create artifacts directory + run: mkdir artifacts + + - name: Get the release version from the tag + if: env.RG_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 "::set-env name=RG_VERSION::${GITHUB_REF#refs/tags/}" + echo "version is: ${{ env.RG_VERSION }}" + + - name: Create GitHub release + id: release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.RG_VERSION }} + release_name: ${{ env.RG_VERSION }} + + - name: Save release upload URL to artifact + run: echo "${{ steps.release.outputs.upload_url }}" > artifacts/release-upload-url + + - name: Save version number to artifact + run: echo "${{ env.RG_VERSION }}" > artifacts/release-version + + - name: Upload artifacts + uses: actions/upload-artifact@v1 + with: + name: artifacts + path: artifacts + + 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. @@ -19,177 +73,139 @@ jobs: TARGET_DIR: ./target # Emit backtraces on panics. RUST_BACKTRACE: 1 - runs-on: ${{ matrix.os }} + # Build static releases with PCRE2. + PCRE2_SYS_STATIC: 1 strategy: matrix: - build: - # We test ripgrep on a pinned version of Rust, along with the moving - # targets of 'stable' and 'beta' for good measure. - - pinned - - stable - - beta - # Our release builds are generated by a nightly compiler to take - # advantage of the latest optimizations/compile time improvements. So - # we test all of them here. (We don't do mips releases, but test on - # mips for big-endian coverage.) - - nightly - - nightly-musl - - nightly-32 - - nightly-mips - - nightly-arm - - macos - - win-msvc - - win-gnu + build: [linux, linux-arm, macos, win-msvc, win-gnu, win32-msvc] include: - - build: pinned - os: ubuntu-18.04 - rust: 1.41.0 - - build: stable - os: ubuntu-18.04 - rust: stable - - build: beta - os: ubuntu-18.04 - rust: beta - - build: nightly - os: ubuntu-18.04 - rust: nightly - - build: nightly-musl - os: ubuntu-18.04 - rust: nightly - target: x86_64-unknown-linux-musl - - build: nightly-32 - os: ubuntu-18.04 - rust: nightly - target: i686-unknown-linux-gnu - - build: nightly-mips - os: ubuntu-18.04 - rust: nightly - target: mips64-unknown-linux-gnuabi64 - - build: nightly-arm - os: ubuntu-18.04 - rust: nightly - # For stripping release binaries: - # docker run --rm -v $PWD/target:/target:Z \ - # rustembedded/cross:arm-unknown-linux-gnueabihf \ - # arm-linux-gnueabihf-strip \ - # /target/arm-unknown-linux-gnueabihf/debug/rg - target: arm-unknown-linux-gnueabihf - - build: macos - os: macos-latest - rust: nightly - - build: win-msvc - os: windows-2019 - rust: nightly - - build: win-gnu - os: windows-2019 - rust: nightly-x86_64-gnu - steps: - - name: Checkout repository - uses: actions/checkout@v1 - - - name: Install packages (Ubuntu) - if: matrix.os == 'ubuntu-18.04' - run: | - ci/ubuntu-install-packages - - - name: Install packages (macOS) - if: matrix.os == 'macos-latest' - run: | - ci/macos-install-packages - - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ matrix.rust }} - profile: minimal - override: true - - - name: Use Cross - if: matrix.target != '' - run: | - # FIXME: to work around bugs in latest cross release, install master. - # See: https://github.com/rust-embedded/cross/issues/357 - cargo install --git https://github.com/rust-embedded/cross - echo "::set-env name=CARGO::cross" - echo "::set-env name=TARGET_FLAGS::--target ${{ matrix.target }}" - echo "::set-env name=TARGET_DIR::./target/${{ matrix.target }}" - - - name: Show command used for Cargo - run: | - echo "cargo command is: ${{ env.CARGO }}" - echo "target flag is: ${{ env.TARGET_FLAGS }}" - - - name: Build ripgrep and all crates - run: ${{ env.CARGO }} build --verbose --all ${{ env.TARGET_FLAGS }} - - - name: Build ripgrep with PCRE2 - run: ${{ env.CARGO }} build --verbose --all --features pcre2 ${{ env.TARGET_FLAGS }} - - # This is useful for debugging problems when the expected build artifacts - # (like shell completions and man pages) aren't generated. - - name: Show build.rs stderr - shell: bash - run: | - set +x - stderr="$(find "${{ env.TARGET_DIR }}/debug" -name stderr -print0 | xargs -0 ls -t | head -n1)" - if [ -s "$stderr" ]; then - echo "===== $stderr ===== " - cat "$stderr" - echo "=====" - fi - set -x - - - name: Run tests with PCRE2 (sans cross) - if: matrix.target == '' - run: ${{ env.CARGO }} test --verbose --all --features pcre2 ${{ env.TARGET_FLAGS }} - - - name: Run tests without PCRE2 (with cross) - # These tests should actually work, but they almost double the runtime. - # Every integration test spins up qemu to run 'rg', and when PCRE2 is - # enabled, every integration test is run twice: one with the default - # regex engine and once with PCRE2. - if: matrix.target != '' - run: ${{ env.CARGO }} test --verbose --all ${{ env.TARGET_FLAGS }} - - - name: Test for existence of build artifacts (Windows) - if: matrix.os == 'windows-2019' - shell: bash - run: | - outdir="$(ci/cargo-out-dir "${{ env.TARGET_DIR }}")" - ls "$outdir/_rg.ps1" && file "$outdir/_rg.ps1" - - - name: Test for existence of build artifacts (Unix) - if: matrix.os != 'windows-2019' - shell: bash - run: | - outdir="$(ci/cargo-out-dir "${{ env.TARGET_DIR }}")" - for f in rg.bash rg.fish rg.1; do - # We could use file -E here, but it isn't supported on macOS. - ls "$outdir/$f" && file "$outdir/$f" - done - - - name: Test zsh shell completions (Unix, sans cross) - # We could test this when using Cross, but we'd have to execute the - # 'rg' binary (done in test-complete) with qemu, which is a pain and - # doesn't really gain us much. If shell completion works in one place, - # it probably works everywhere. - if: matrix.target == '' && matrix.os != 'windows-2019' - shell: bash - run: ci/test-complete - - rustfmt: - name: rustfmt - runs-on: ubuntu-18.04 + - build: linux + os: ubuntu-18.04 + rust: nightly + target: x86_64-unknown-linux-musl + - build: linux-arm + os: ubuntu-18.04 + rust: nightly + target: arm-unknown-linux-gnueabihf + - build: macos + os: macos-latest + rust: nightly + target: x86_64-apple-darwin + - build: win-msvc + os: windows-2019 + rust: nightly + target: x86_64-pc-windows-msvc + - build: win-gnu + os: windows-2019 + rust: nightly-x86_64-gnu + target: x86_64-pc-windows-gnu + - build: win32-msvc + os: windows-2019 + rust: nightly + target: i686-pc-windows-msvc + steps: - - name: Checkout repository - uses: actions/checkout@v1 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - profile: minimal - components: rustfmt - - name: Check formatting - run: | - cargo fmt --all -- --check
\ No newline at end of file + - name: Checkout repository + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: Install packages (Ubuntu) + if: matrix.os == 'ubuntu-18.04' + run: | + ci/ubuntu-install-packages + + - name: Install packages (macOS) + if: matrix.os == 'macos-latest' + run: | + ci/macos-install-packages + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.rust }} + profile: minimal + override: true + target: ${{ matrix.target }} + + - name: Use Cross + # if: matrix.os != 'windows-2019' + run: | + # FIXME: to work around bugs in latest cross release, install master. + # See: https://github.com/rust-embedded/cross/issues/357 + cargo install --git https://github.com/rust-embedded/cross + echo "::set-env name=CARGO::cross" + echo "::set-env name=TARGET_FLAGS::--target ${{ matrix.target }}" + echo "::set-env name=TARGET_DIR::./target/${{ matrix.target }}" + + - 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: Get release download URL + uses: actions/download-artifact@v1 + with: + name: artifacts + path: artifacts + + - name: Set release upload URL and release version + shell: bash + run: | + release_upload_url="$(cat artifacts/release-upload-url)" + echo "::set-env name=RELEASE_UPLOAD_URL::$release_upload_url" + echo "release upload url: $RELEASE_UPLOAD_URL" + release_version="$(cat artifacts/release-version)" + echo "::set-env name=RELEASE_VERSION::$release_version" + echo "release version: $RELEASE_VERSION" + + - name: Build release binary + run: ${{ env.CARGO }} build --verbose --release --features pcre2 ${{ env.TARGET_FLAGS }} + + - name: Strip release binary (linux and macos) + if: matrix.build == 'linux' || matrix.build == 'macos' + run: strip "target/${{ matrix.target }}/release/rg" + + - 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/rg + + - name: Build archive + shell: bash + run: | + outdir="$(ci/cargo-out-dir "${{ env.TARGET_DIR }}")" + staging="ripgrep-${{ env.RELEASE_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-2019" ]; then + cp "target/${{ matrix.target }}/release/rg.exe" "$staging/" + 7z a "$staging.zip" "$staging" + echo "::set-env name=ASSET::$staging.zip" + else + # The man page is only generated on Unix systems. ¯\_(ツ)_/¯ + cp "$outdir"/rg.1 "$staging/doc/" + cp "target/${{ matrix.target }}/release/rg" "$staging/" + tar czf "$staging.tar.gz" "$staging" + echo "::set-env name=ASSET::$staging.tar.gz" + fi + + - name: Upload release archive + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ env.RELEASE_UPLOAD_URL }} + asset_path: ${{ env.ASSET }} + asset_name: ${{ env.ASSET }} + asset_content_type: application/octet-stream |