feat: add a way of using GHA cache locally #30
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: ci | |
on: [push, pull_request] | |
jobs: | |
lint: | |
name: ${{ matrix.component }} ${{ matrix.os }} | |
runs-on: ${{ matrix.os }} | |
timeout-minutes: 15 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, macOS-latest, windows-latest] | |
component: [clippy] | |
include: | |
- component: rustfmt | |
cargo_cmd: fmt -- --check | |
os: ubuntu-latest | |
- component: clippy | |
cargo_cmd: clippy --locked --all-targets -- -D warnings -A unknown-lints -A clippy::type_complexity -A clippy::new-without-default | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Install rust | |
uses: ./.github/actions/rust-toolchain | |
with: | |
components: ${{ matrix.component }} | |
# Oldest supported version, keep in sync with README.md | |
toolchain: "1.70.0" | |
- name: clippy version | |
run: cargo clippy --version | |
if: ${{ matrix.component == 'clippy' }} | |
- name: Check | |
run: cargo ${{ matrix.cargo_cmd }} | |
check_features: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
feature: [azure, gcs, gha, memcached, redis, s3, webdav] | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Check feature ${{ matrix.feature }} | |
run: cargo check --no-default-features --features ${{ matrix.feature }} | |
toml_format: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Check | |
run: npx --yes @taplo/cli fmt --check | |
test: | |
name: test ${{ matrix.os }} rust ${{ matrix.rustc || 'stable' }} ${{ matrix.extra_desc }} | |
runs-on: ${{ matrix.os }} | |
continue-on-error: ${{ matrix.allow_failure || false }} | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-20.04 | |
# Oldest supported version, keep in sync with README.md | |
rustc: "1.70.0" | |
- os: ubuntu-22.04 | |
# Oldest supported version, keep in sync with README.md | |
rustc: "1.70.0" | |
extra_desc: dist-server | |
extra_args: --no-default-features --features=dist-tests test_dist_ -- --test-threads 1 | |
- os: ubuntu-20.04 | |
rustc: stable | |
- os: ubuntu-20.04 | |
rustc: beta | |
- os: ubuntu-20.04 | |
rustc: nightly | |
allow_failure: true | |
extra_args: --features=unstable | |
- os: ubuntu-20.04 | |
extra_desc: no-default-features | |
extra_args: --no-default-features | |
allow_failure: true | |
- os: ubuntu-22.04 | |
- os: macOS-11 | |
# M1 CPU | |
- os: macos-14 | |
- os: windows-2019 | |
# Oldest supported version, keep in sync with README.md | |
rustc: "1.70.0" | |
- os: windows-2019 | |
rustc: nightly | |
allow_failure: true | |
extra_args: --features=unstable | |
- os: windows-2019 | |
rustc: beta | |
env: | |
RUST_BACKTRACE: 1 | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Install rust | |
uses: ./.github/actions/rust-toolchain | |
with: | |
toolchain: ${{ matrix.rustc }} | |
- name: Install gcc & clang for tests | |
run: sudo apt-get install -y clang gcc | |
if: ${{ matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04' }} | |
- name: Build tests | |
run: cargo test --no-run --locked --all-targets ${{ matrix.extra_args }} | |
- name: Run tests | |
run: cargo test --locked --all-targets ${{ matrix.extra_args }} | |
- name: Upload failure | |
if: failure() | |
uses: ./.github/actions/artifact_failure | |
with: | |
name: test-${{ matrix.os }}-${{ matrix.rustc || 'stable' }}-${{ matrix.extra_desc }} | |
build: | |
name: build ${{ matrix.binary || 'sccache' }} ${{ matrix.target }} | |
runs-on: ${{ matrix.os }} | |
container: ${{ fromJson(matrix.container || '{"image":null}') }} | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-20.04 | |
target: x86_64-unknown-linux-musl | |
container: '{"image": "messense/rust-musl-cross:x86_64-musl"}' | |
- os: ubuntu-20.04 | |
binary: sccache-dist | |
extra_args: --no-default-features --features="dist-server" | |
target: x86_64-unknown-linux-musl | |
container: '{"image": "messense/rust-musl-cross:x86_64-musl"}' | |
- os: ubuntu-20.04 | |
target: aarch64-unknown-linux-musl | |
container: '{"image": "messense/rust-musl-cross:aarch64-musl"}' | |
- os: ubuntu-20.04 | |
target: armv7-unknown-linux-musleabi | |
container: '{"image": "messense/rust-musl-cross:armv7-musleabi"}' | |
- os: ubuntu-20.04 | |
target: i686-unknown-linux-musl | |
container: '{"image": "messense/rust-musl-cross:i686-musl"}' | |
- os: macOS-11 | |
target: x86_64-apple-darwin | |
macosx_deployment_target: 10.13 | |
developer_dir: /Applications/Xcode_11.7.app | |
sdkroot: /Applications/Xcode_11.7.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk | |
- os: macos-14 | |
target: aarch64-apple-darwin | |
macosx_deployment_target: 11.0 | |
- os: windows-2019 | |
target: x86_64-pc-windows-msvc | |
rustflags: -Ctarget-feature=+crt-static | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Install rust | |
uses: ./.github/actions/rust-toolchain | |
with: | |
toolchain: ${{ matrix.target == 'aarch64-apple-darwin' && 'beta' || 'stable' }} | |
target: ${{ matrix.target }} | |
if: ${{ !matrix.container }} | |
- name: Build | |
run: cargo build --locked --release --bin ${{ matrix.binary || 'sccache' }} --target ${{ matrix.target }} --features=openssl/vendored ${{ matrix.extra_args }} | |
env: | |
MACOSX_DEPLOYMENT_TARGET: ${{ matrix.macosx_deployment_target }} | |
DEVELOPER_DIR: ${{ matrix.developer_dir }} | |
SDKROOT: ${{ matrix.sdkroot }} | |
RUSTFLAGS: ${{ matrix.rustflags }} | |
# Workaround for the lack of substring() function in github actions expressions. | |
- name: Id | |
id: id | |
shell: bash | |
run: echo "id=${ID#refs/tags/}" >> $GITHUB_OUTPUT | |
env: | |
ID: ${{ startsWith(github.ref, 'refs/tags/') && github.ref || github.sha }} | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.binary || 'sccache' }}-${{ steps.id.outputs.id }}-${{ matrix.target }} | |
path: target/${{ matrix.target }}/release/${{ matrix.binary || 'sccache' }}${{ endsWith(matrix.target, '-msvc') && '.exe' || '' }} | |
if-no-files-found: error | |
coverage: | |
name: coverage ${{ matrix.os }} rust ${{ matrix.rustc || 'stable' }} ${{ matrix.extra_desc }} | |
runs-on: ${{ matrix.os }} | |
continue-on-error: ${{ matrix.allow_failure || false }} | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-20.04 | |
rustc: nightly | |
allow_failure: true | |
extra_args: --features=unstable | |
- os: macOS-11 | |
rustc: nightly | |
# Disable on Windows for now as it fails with: | |
# found invalid metadata files for crate `vte_generate_state_changes` | |
# - os: windows-2019 | |
# rustc: nightly | |
env: | |
RUST_BACKTRACE: 1 | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Install rust | |
uses: ./.github/actions/rust-toolchain | |
with: | |
toolchain: ${{ matrix.rustc }} | |
- name: Install gcc & clang for tests | |
run: sudo apt-get install -y clang gcc | |
if: ${{ matrix.os == 'ubuntu-20.04' }} | |
- name: "`grcov` ~ install" | |
run: cargo install grcov | |
- name: Execute tests | |
run: cargo test --no-fail-fast --locked --all-targets ${{ matrix.extra_args }} | |
env: | |
CARGO_INCREMENTAL: "0" | |
RUSTC_WRAPPER: "" | |
RUSTFLAGS: "-Zprofile -Ccodegen-units=1 -Copt-level=0 -Clink-dead-code -Coverflow-checks=off" | |
- name: Generate coverage data (via `grcov`) | |
id: coverage | |
shell: bash | |
run: | | |
## Generate coverage data | |
COVERAGE_REPORT_DIR="target/debug" | |
COVERAGE_REPORT_FILE="${COVERAGE_REPORT_DIR}/lcov.info" | |
# GRCOV_IGNORE_OPTION='--ignore build.rs --ignore "/*" --ignore "[a-zA-Z]:/*"' ## `grcov` ignores these params when passed as an environment variable (why?) | |
# GRCOV_EXCLUDE_OPTION='--excl-br-line "^\s*((debug_)?assert(_eq|_ne)?!|#\[derive\()"' ## `grcov` ignores these params when passed as an environment variable (why?) | |
mkdir -p "${COVERAGE_REPORT_DIR}" | |
# display coverage files | |
grcov . --output-type files --ignore build.rs --ignore "/*" --ignore "[a-zA-Z]:/*" --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?!|#\[derive\()" | sort --unique | |
# generate coverage report | |
grcov . --output-type lcov --output-path "${COVERAGE_REPORT_FILE}" --branch --ignore build.rs --ignore "/*" --ignore "[a-zA-Z]:/*" --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?!|#\[derive\()" | |
echo "report=${COVERAGE_REPORT_FILE}" >> $GITHUB_OUTPUT | |
- name: Upload coverage results (to Codecov.io) | |
uses: codecov/codecov-action@v4 | |
with: | |
file: ${{ steps.coverage.outputs.report }} | |
## flags: IntegrationTests, UnitTests, ${{ steps.vars.outputs.CODECOV_FLAGS }} | |
flags: ${{ steps.vars.outputs.CODECOV_FLAGS }} | |
name: codecov-umbrella | |
fail_ci_if_error: false | |
test_freebsd: | |
name: test freebsd-13.2 rust stable | |
runs-on: ${{ matrix.job.os }} | |
timeout-minutes: 70 | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- { os: ubuntu-22.04 } | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Prepare, build and test | |
uses: vmactions/freebsd-vm@v1.0.7 | |
with: | |
mem: 8192 | |
usesh: true | |
sync: rsync | |
copyback: false | |
prepare: pkg install -y ca_root_nss curl gmake gtar pot sudo | |
run: | | |
##################################################################################### | |
### Prepare, build, and test | |
##################################################################################### | |
### based on ref: <https://github.com/rust-lang/rustup/pull/2783> | |
### and on ref: <https://github.com/uutils/coreutils/commit/86c610a84b8b6c> | |
### * NOTE: All steps need to be run in this block, otherwise, we are operating back | |
### on the mac host. | |
set -exo pipefail | |
# | |
### Basic user setup ################################################################ | |
TEST_USER=tester | |
TEST_USER_HOME="/opt/$TEST_USER" | |
REPO_NAME=${GITHUB_WORKSPACE##*/} | |
WORKSPACE_PARENT="/home/runner/work/${REPO_NAME}" | |
WORKSPACE="${WORKSPACE_PARENT}/${REPO_NAME}" | |
export WORKSPACE | |
# | |
mkdir -p "$TEST_USER_HOME" | |
pw adduser -n "$TEST_USER" -d "$TEST_USER_HOME" -c "Tester" -h - | |
chown -R "$TEST_USER":"$TEST_USER" "$TEST_USER_HOME" | |
chown -R "$TEST_USER":"$TEST_USER" "/$WORKSPACE_PARENT"/ | |
cat > /usr/local/etc/sudoers.d/wheel<<EOF | |
$TEST_USER ALL=(ALL) NOPASSWD: ALL | |
EOF | |
# | |
### Install rust stable from rustup ################################################ | |
su "$TEST_USER" -c "/bin/sh -exo pipefail" <<"EOH" | |
whoami | |
echo "$HOME" | |
fetch -o /tmp/rustup.sh https://sh.rustup.rs | |
sh /tmp/rustup.sh -y --profile=minimal | |
### Run tests ####################################################################### | |
. "$HOME/.cargo/env" | |
"$WORKSPACE/scripts/freebsd-ci-test.sh" | |
EOH | |
# end | |
- name: Upload failure | |
if: failure() | |
uses: ./.github/actions/artifact_failure | |
with: | |
name: test-freebsd-13.2-stable | |
release: | |
name: release | |
runs-on: ubuntu-latest | |
needs: [build, lint, test] | |
if: ${{ startsWith(github.ref, 'refs/tags/') }} | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Check versions | |
run: | | |
tag_name=${GITHUB_REF#refs/tags/} | |
v=$(grep -m 1 "^version" Cargo.toml|sed -e "s|version = \"\(.*\)\"|\1|") | |
if ! echo $tag_name|grep -q $v; then | |
echo "Mistmatch of the version:" | |
echo "Cargo.toml says $v while the tag is $tag_name" | |
exit 2 | |
fi | |
- name: Get artifacts | |
uses: actions/download-artifact@v4 | |
- name: Create release assets | |
run: | | |
for d in sccache-*; do | |
chmod +x "$d/sccache"* | |
cp README.md LICENSE "$d/" | |
tar -zcvf "$d.tar.gz" "$d" | |
echo -n "$(shasum -ba 256 "$d.tar.gz" | cut -d " " -f 1)" > "$d.tar.gz.sha256" | |
if [[ $d =~ (sccache-)(.*)?(x86_64-pc-windows)(.*)? ]]; then | |
zip -r "$d.zip" "$d" | |
echo -n "$(shasum -ba 256 "$d.zip" | cut -d " " -f 1)" > "$d.zip.sha256" | |
fi | |
done | |
- name: Create release | |
run: | | |
sudo apt-get update && sudo apt-get install -y hub | |
tag_name=${GITHUB_REF#refs/tags/} | |
for f in sccache-*.tar.gz* sccache-*.zip*; do | |
if [[ -f "$f" ]]; then | |
files="$files -a $f"; | |
fi | |
done | |
hub release create -m $tag_name $tag_name $files | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |