summaryrefslogtreecommitdiffstats
path: root/.github
diff options
context:
space:
mode:
authorSebastian Thiel <sebastian.thiel@icloud.com>2020-03-26 07:06:49 +0800
committerSebastian Thiel <sebastian.thiel@icloud.com>2020-03-26 07:06:49 +0800
commitc32e65a4562f3e3c9ce7b39ebbe4bd54ba31da93 (patch)
tree997200c23fd958797b43506f2399c7f60f80bd26 /.github
parent17170fb41c2962a468fde7c97cf863ea3e5a85a2 (diff)
Now with the actual, unaltered release.yml, previous one was ci.yml
Diffstat (limited to '.github')
-rw-r--r--.github/workflows/release.yml372
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