Skip to content

Merge pull request #324 from rrauenza/main #1231

Merge pull request #324 from rrauenza/main

Merge pull request #324 from rrauenza/main #1231

Workflow file for this run

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 }}