Merge pull request #324 from rrauenza/main #1231
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
name: Continuous integration | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
ci-linux: | |
name: Build for Linux | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- if: ${{ github.event_name == 'push' }} | |
uses: docker/login-action@v3 | |
with: | |
username: stephanmisc | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- uses: stepchowfun/toast/.github/actions/toast@main | |
with: | |
tasks: build test lint release validate_release run | |
docker_repo: stephanmisc/toast | |
read_remote_cache: true | |
write_remote_cache: ${{ github.event_name == 'push' }} | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# The artifact name will contain the target triple, so the file name doesn't need to. | |
mv artifacts/docuum-x86_64-unknown-linux-gnu artifacts/docuum | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: x86_64-unknown-linux-gnu | |
path: artifacts/docuum | |
if-no-files-found: error | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# The artifact name will contain the target triple, so the file name doesn't need to. | |
mv artifacts/docuum-x86_64-unknown-linux-musl artifacts/docuum | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: x86_64-unknown-linux-musl | |
path: artifacts/docuum | |
if-no-files-found: error | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# The artifact name will contain the target triple, so the file name doesn't need to. | |
mv artifacts/docuum-aarch64-unknown-linux-gnu artifacts/docuum | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: aarch64-unknown-linux-gnu | |
path: artifacts/docuum | |
if-no-files-found: error | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# The artifact name will contain the target triple, so the file name doesn't need to. | |
mv artifacts/docuum-aarch64-unknown-linux-musl artifacts/docuum | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: aarch64-unknown-linux-musl | |
path: artifacts/docuum | |
if-no-files-found: error | |
ci-windows: | |
name: Build for Windows | |
runs-on: windows-latest | |
steps: | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# The unit tests do not expect the files in `test_data` to have carriage returns added. | |
git config --global core.autocrlf false | |
git config --global core.eol lf | |
- uses: actions/checkout@v4 | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# Install the appropriate version of Rust. The `--no-self-update` is necessary to make this | |
# command work reliably on Windows. Without that flag, the command fails occasionally. See | |
# | |
# https://github.com/rust-lang/rustup/issues/2441 | |
# | |
# for more information. | |
rustup toolchain install 1.83.0 --no-self-update # [ref:rust_1.83.0] | |
rustup default 1.83.0 # [ref:rust_1.83.0] | |
# Add the targets. | |
rustup target add x86_64-pc-windows-msvc | |
rustup target add aarch64-pc-windows-msvc | |
# Build for x86_64-pc-windows-msvc. | |
RUSTFLAGS='--codegen target-feature=+crt-static' cargo build \ | |
--locked \ | |
--release \ | |
--target x86_64-pc-windows-msvc | |
# Build for aarch64-pc-windows-msvc. | |
RUSTFLAGS='--codegen target-feature=+crt-static' cargo build \ | |
--locked \ | |
--release \ | |
--target aarch64-pc-windows-msvc | |
# Run the tests. | |
NO_COLOR=true cargo test --locked # [ref:colorless_tests] | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: x86_64-pc-windows-msvc | |
path: target/x86_64-pc-windows-msvc/release/docuum.exe | |
if-no-files-found: error | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: aarch64-pc-windows-msvc | |
path: target/aarch64-pc-windows-msvc/release/docuum.exe | |
if-no-files-found: error | |
ci-macos: | |
name: Build for macOS | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# Install the appropriate version of Rust. | |
rustup toolchain install 1.83.0 # [ref:rust_1.83.0] | |
rustup default 1.83.0 # [ref:rust_1.83.0] | |
# Add the targets. | |
rustup target add x86_64-apple-darwin | |
rustup target add aarch64-apple-darwin | |
# Build for x86_64-apple-darwin. | |
SDKROOT=$(xcrun --show-sdk-path) \ | |
MACOSX_DEPLOYMENT_TARGET=$(xcrun --show-sdk-version) \ | |
cargo build --locked --release --target x86_64-apple-darwin | |
# Build for aarch64-apple-darwin. | |
SDKROOT=$(xcrun --show-sdk-path) \ | |
MACOSX_DEPLOYMENT_TARGET=$(xcrun --show-sdk-version) \ | |
cargo build --locked --release --target aarch64-apple-darwin | |
# Run the tests. | |
NO_COLOR=true cargo test --locked # [ref:colorless_tests] | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: x86_64-apple-darwin | |
path: target/x86_64-apple-darwin/release/docuum | |
if-no-files-found: error | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: aarch64-apple-darwin | |
path: target/aarch64-apple-darwin/release/docuum | |
if-no-files-found: error | |
install-macos: | |
name: Install on macOS | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# Run the installer script. | |
PREFIX=/tmp ./install.sh | |
# Run the installed binary. | |
/tmp/docuum --help | |
install-ubuntu: | |
name: Install on Ubuntu | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# Run the installer script. | |
PREFIX=/tmp ./install.sh | |
# Run the installed binary. | |
/tmp/docuum --help | |
publish-release: | |
name: Publish a release if applicable | |
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} | |
runs-on: ubuntu-latest | |
needs: [ci-linux, ci-macos, ci-windows, install-macos, install-ubuntu] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: docker/setup-qemu-action@v3 # For building multi-platform images | |
- uses: docker/setup-buildx-action@v3 # For building multi-platform images | |
- uses: docker/login-action@v3 | |
with: | |
username: stephanmisc | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- uses: actions/download-artifact@v4 | |
with: | |
path: artifacts/ | |
- env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# Install the appropriate version of Rust. | |
rustup toolchain install 1.83.0 # [ref:rust_1.83.0] | |
rustup default 1.83.0 # [ref:rust_1.83.0] | |
# Fetch the program version. | |
VERSION="$(cargo pkgid | cut -d# -f2 | cut -d: -f2)" | |
# Determine if the release already exists. | |
if gh release view "v$VERSION" &> /dev/null; then | |
echo "Release v$VERSION already exists." | |
else | |
echo "VERSION_TO_PUBLISH=$VERSION" >> "$GITHUB_ENV" | |
fi | |
# Give the artifacts unique names. | |
mv \ | |
artifacts/x86_64-unknown-linux-gnu/docuum \ | |
artifacts/docuum-x86_64-unknown-linux-gnu | |
mv \ | |
artifacts/x86_64-unknown-linux-musl/docuum \ | |
artifacts/docuum-x86_64-unknown-linux-musl | |
mv \ | |
artifacts/aarch64-unknown-linux-gnu/docuum \ | |
artifacts/docuum-aarch64-unknown-linux-gnu | |
mv \ | |
artifacts/aarch64-unknown-linux-musl/docuum \ | |
artifacts/docuum-aarch64-unknown-linux-musl | |
mv \ | |
artifacts/x86_64-apple-darwin/docuum \ | |
artifacts/docuum-x86_64-apple-darwin | |
mv \ | |
artifacts/aarch64-apple-darwin/docuum \ | |
artifacts/docuum-aarch64-apple-darwin | |
mv \ | |
artifacts/x86_64-pc-windows-msvc/docuum.exe \ | |
artifacts/docuum-x86_64-pc-windows-msvc.exe | |
mv \ | |
artifacts/aarch64-pc-windows-msvc/docuum.exe \ | |
artifacts/docuum-aarch64-pc-windows-msvc.exe | |
# For the Docker image, make the relevant artifacts executable again. See | |
# https://github.com/actions/upload-artifact/issues/38. | |
chmod a+x artifacts/docuum-x86_64-unknown-linux-musl | |
chmod a+x artifacts/docuum-aarch64-unknown-linux-musl | |
- if: ${{ env.VERSION_TO_PUBLISH != null }} | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
push: true | |
platforms: linux/amd64,linux/arm64 | |
tags: stephanmisc/docuum,stephanmisc/docuum:${{ env.VERSION_TO_PUBLISH }} | |
- if: ${{ env.VERSION_TO_PUBLISH != null }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
# Make Bash log commands and not silently ignore errors. | |
set -euxo pipefail | |
# Run the Docker image to validate it. The image has already been published (since the | |
# `docker/build-push-action@v5` action unfortunately doesn't support importing multi- | |
# platform images into a local Docker installation), but we still validate it now anyway. | |
docker run \ | |
--init \ | |
--rm \ | |
--tty \ | |
--name docuum \ | |
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \ | |
--mount type=volume,source=docuum,target=/root \ | |
"stephanmisc/docuum:$VERSION_TO_PUBLISH" --help | |
# Create the release. | |
gh release create "v$VERSION_TO_PUBLISH" --title "v$VERSION_TO_PUBLISH" --notes '' \ | |
'artifacts/docuum-x86_64-unknown-linux-gnu' \ | |
'artifacts/docuum-x86_64-unknown-linux-musl' \ | |
'artifacts/docuum-aarch64-unknown-linux-gnu' \ | |
'artifacts/docuum-aarch64-unknown-linux-musl' \ | |
'artifacts/docuum-x86_64-apple-darwin' \ | |
'artifacts/docuum-aarch64-apple-darwin' \ | |
'artifacts/docuum-x86_64-pc-windows-msvc.exe' \ | |
'artifacts/docuum-aarch64-pc-windows-msvc.exe' | |
echo "Created release v$VERSION_TO_PUBLISH." | |
- uses: stepchowfun/toast/.github/actions/toast@main | |
with: | |
tasks: publish | |
docker_repo: stephanmisc/toast | |
env: | |
CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} |