test release job #80
This file contains 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
# Thanks goes to `BurntSushi/ripgrep` for the original template for GitHub Actions! | ||
name: release | ||
on: | ||
push: | ||
# Enable when testing release infrastructure on a branch. | ||
# branches: | ||
- read-config-file | ||
tags: | ||
- '[0-9]+.[0-9]+.[0-9]+' | ||
jobs: | ||
# This job is responsible for _creating_ the GitHub release. | ||
# It creates the release, and publishes some artifacts into it which are used | ||
# in the `build-release` job. | ||
# | ||
# This job runs only once, before the `build-release` jobs. | ||
create-release: | ||
name: create-release | ||
runs-on: ubuntu-latest | ||
# env: | ||
# # Set to force version number, e.g., when no tag exists. | ||
# CRATE_VERSION: TEST-0.0.0 | ||
steps: | ||
- name: Create artifacts directory | ||
run: mkdir artifacts | ||
- name: Get the release version from the tag | ||
if: env.CRATE_VERSION == '' | ||
run: | | ||
echo "CRATE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV | ||
- name: Create GitHub release | ||
id: release | ||
uses: actions/create-release@v1 | ||
env: | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
with: | ||
tag_name: ${{ env.CRATE_VERSION }} | ||
release_name: ${{ env.CRATE_VERSION }} | ||
draft: true | ||
- 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.CRATE_VERSION }}" > artifacts/release-version | ||
- name: Upload artifacts | ||
uses: actions/upload-artifact@v1 | ||
with: | ||
name: artifacts | ||
path: artifacts | ||
# This job runs _after_ the `create-release` job, and uses the artifacts that it created. | ||
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: | ||
matrix: | ||
build: [linux-gnu, linux-musl, linux-arm-gnueabihf, macos, win-msvc, win-gnu, win32-msvc] | ||
include: | ||
# NOTE: we pin to a specific version since sometimes things fail to compile on the latest nightly builds | ||
- build: linux-gnu | ||
os: ubuntu-latest | ||
rust: nightly-2023-12-04 | ||
target: x86_64-unknown-linux-gnu | ||
- build: linux-musl | ||
os: ubuntu-latest | ||
rust: nightly-2023-12-04 | ||
target: x86_64-unknown-linux-musl | ||
- build: linux-arm-gnueabihf | ||
os: ubuntu-latest | ||
rust: nightly-2023-12-04 | ||
target: arm-unknown-linux-gnueabihf | ||
- build: macos | ||
os: macos-latest | ||
rust: nightly-2023-12-04 | ||
target: x86_64-apple-darwin | ||
- build: win-msvc | ||
os: windows-2019 | ||
rust: nightly-2023-12-04 | ||
target: x86_64-pc-windows-msvc | ||
- build: win-gnu | ||
os: windows-2019 | ||
rust: nightly-2023-12-04-x86_64-gnu | ||
target: x86_64-pc-windows-gnu | ||
- build: win32-msvc | ||
os: windows-2019 | ||
rust: nightly-2023-12-04 | ||
target: i686-pc-windows-msvc | ||
steps: | ||
- name: Checkout repository | ||
uses: actions/checkout@v3 | ||
with: | ||
fetch-depth: 1 | ||
submodules: recursive | ||
- name: Install packages (Ubuntu) | ||
if: matrix.os == 'ubuntu-latest' | ||
run: | | ||
ci/install-packages-ubuntu.sh | ||
- name: Install packages (macOS) | ||
if: matrix.os == 'macos-latest' | ||
run: | | ||
ci/install-packages-macos.sh | ||
- name: Install Rust | ||
uses: actions-rs/toolchain@v1 | ||
with: | ||
toolchain: ${{ matrix.rust }} | ||
profile: minimal | ||
override: true | ||
target: ${{ matrix.target }} | ||
# cache | ||
- uses: actions/cache@v3 | ||
with: | ||
path: | | ||
~/.cargo/bin/ | ||
~/.cargo/registry/index/ | ||
~/.cargo/registry/cache/ | ||
~/.cargo/git/db/ | ||
~/.cargo/.crates.toml | ||
~/.cargo/.crates2.json | ||
target/ | ||
key: ${{ runner.os }}-cargo-${{ matrix.target }} | ||
# We install ripgrep via cargo to get the latest version (we need at least 14) | ||
# since ubuntu is still on 13 (at least it is while this is being written...) | ||
# We need 14 in order to generate completion files. | ||
- name: Install ripgrep | ||
run: cargo install ripgrep | ||
- name: Use Cross | ||
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: 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 "RELEASE_UPLOAD_URL=$release_upload_url" >> $GITHUB_ENV | ||
echo "release upload url: $RELEASE_UPLOAD_URL" | ||
release_version="$(cat artifacts/release-version)" | ||
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV | ||
echo "release version: $RELEASE_VERSION" | ||
- name: Build release binary | ||
run: ${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }} | ||
timeout-minutes: 10 | ||
- name: Strip release binary (linux and macos) | ||
if: matrix.build == 'linux' || matrix.build == 'macos' | ||
run: strip "target/${{ matrix.target }}/release/rgr" | ||
- 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/rgr | ||
# FIXME: for some reasons the manpage isn't generated in CI from the build.rs script. | ||
# So we build it (again?) here too. | ||
# NOTE: the windows builds don't create a target-triple directory under "target/" | ||
- name: Build archive | ||
shell: bash | ||
run: | | ||
outdir="$(ci/cargo-out-dir.sh "${{ env.TARGET_DIR }}")" | ||
if [ "${{ matrix.os }}" != "windows-2019" ]; then | ||
asciidoctor --doctype manpage --backend manpage --destination-dir "$outdir" doc/rgr.1.template | ||
fi | ||
staging="repgrep-${{ env.RELEASE_VERSION }}-${{ matrix.target }}" | ||
mkdir -p "$staging"/{complete,doc} | ||
echo 'complete -F _rg rgr' > "${outdir}/rgr.bash" | ||
echo 'compdef $_comps[rg] rgr' > "${outdir}/_rgr" | ||
rg --generate complete-fish | sed 's/-c rg/-c rgr/' > "${outdir}/rgr.fish" | ||
rg --generate complete-powershell | sed "s/'rg'/'rgr'/" > "${outdir}/_rgr.ps1" | ||
cp {LICENSE-*,CHANGELOG.md,README.md} "$staging/doc/" | ||
cp "$outdir"/{_rgr,rgr.bash,rgr.fish,_rgr.ps1} "$staging/complete/" | ||
if [ "${{ matrix.os }}" = "windows-2019" ]; then | ||
cp "target/release/rgr.exe" "$staging/" | ||
7z a "$staging.zip" "$staging" | ||
echo "ASSET=$staging.zip" >> $GITHUB_ENV | ||
else | ||
cp "$outdir"/rgr.1 "$staging/doc/" | ||
cp "target/${{ matrix.target }}/release/rgr" "$staging/" | ||
tar czf "$staging.tar.gz" "$staging" | ||
echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV | ||
fi | ||
- name: Upload release archive | ||
uses: actions/[email protected] | ||
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 | ||
# This job runs _after_ the `create-release` job, and uses the artifacts that it created. | ||
publish-crate: | ||
name: publish-crate | ||
needs: ['build-release'] | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout repository | ||
uses: actions/checkout@v2 | ||
with: | ||
fetch-depth: 1 | ||
submodules: recursive | ||
- name: Install packages (Ubuntu) | ||
if: matrix.os == 'ubuntu-latest' | ||
run: | | ||
ci/install-packages-ubuntu.sh | ||
- name: Install Rust | ||
uses: actions-rs/toolchain@v1 | ||
with: | ||
toolchain: nightly | ||
profile: minimal | ||
override: true | ||
target: x86_64-unknown-linux-gnu | ||
- name: Publish Crate | ||
shell: bash | ||
env: | ||
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} | ||
run: | | ||
cargo publish |