Skip to content

CI

CI #28

Workflow file for this run

name: CI
on:
pull_request:
branches:
- main
- 'feat/**'
merge_group:
types: [checks_requested]
schedule:
- cron: '0 0 * * 0' # at midnight of each sunday
workflow_dispatch:
jobs:
skip-check:
permissions:
actions: write
contents: read
runs-on: ubuntu-latest
outputs:
should_skip: ${{ steps.skip_check.outputs.should_skip }}
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
cancel_others: true
paths_ignore: '["*.md"]'
python:
needs: skip-check
if: needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: taiki-e/install-action@just
- uses: astral-sh/setup-uv@v7
- run: just ci-python
rust:
needs: skip-check
if: needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
toolchain:
- 1.92.0 # MSRV
- stable
- nightly
steps:
- uses: actions/checkout@v6
- uses: taiki-e/install-action@just
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- run: just ci-rust
cross-test:
needs: skip-check
if: needs.skip-check.outputs.should_skip != 'true'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- windows-latest
- macos-latest
steps:
- uses: actions/checkout@v6
- uses: taiki-e/install-action@just
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: just test
wasm-test:
needs: skip-check
if: needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: taiki-e/install-action@just
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@wasm-pack
- uses: taiki-e/install-action@wasm-bindgen-cli
- name: wasm-pack test
run: |
cd crates/s3s-wasm
wasm-pack test --node
coverage:
needs: skip-check
if: needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@just
- uses: taiki-e/install-action@cargo-llvm-cov
- run: |
cargo llvm-cov -p s3s --all-features --codecov --output-path target/codecov.json
- uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: target/codecov.json
mint-proxy-minio:
name: e2e (mint, s3s-proxy, minio)
needs: skip-check
if: github.event_name != 'pull_request' && needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/setup
- run: docker pull minio/mint:edge
- run: docker pull minio/minio:latest
- run: just install s3s-proxy
- run: ./scripts/e2e-mint.sh
- run: ./scripts/report-mint.py /tmp/mint/log.json
- uses: actions/upload-artifact@v7
with:
name: mint-proxy-minio.logs
path: ./target/s3s-proxy.log
e2e-fs:
name: e2e (s3s-e2e, s3s-fs)
needs: skip-check
if: github.event_name != 'pull_request' && needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/setup
- run: just install s3s-e2e
- run: just install s3s-fs
- run: ./scripts/e2e-fs.sh --filter '^Basic'
- uses: actions/upload-artifact@v7
with:
name: e2e-fs.logs
path: ./target/s3s-fs.log
e2e-boto3-fs:
name: e2e (boto3, s3s-fs)
needs: skip-check
if: github.event_name != 'pull_request' && needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/setup
- run: uv sync
- run: just install s3s-fs
- run: ./scripts/e2e-boto3-fs.sh
- uses: actions/upload-artifact@v7
if: always()
with:
name: e2e-boto3-fs.logs
path: ./target/s3s-fs-boto3.log
e2e-boto3-minio:
name: e2e (boto3, minio)
needs: skip-check
if: github.event_name != 'pull_request' && needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/setup
- run: uv sync
- run: docker pull minio/minio:latest
- run: ./scripts/e2e-boto3-minio.sh
e2e-minio:
name: e2e (s3s-e2e, minio)
needs: skip-check
if: github.event_name != 'pull_request' && needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/setup
- run: docker pull minio/minio:latest
- run: just install s3s-e2e
- run: ./scripts/e2e-minio.sh
s3tests-proxy-minio:
name: e2e (s3-tests, s3s-proxy, minio)
needs: skip-check
if: github.event_name != 'pull_request' && needs.skip-check.outputs.should_skip != 'true'
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/setup
- name: Clone s3-tests
run: git clone --depth 1 https://github.com/ceph/s3-tests.git /tmp/s3-tests
- name: Get s3-tests requirements hash
id: s3tests-hash
run: echo "hash=$(sha256sum /tmp/s3-tests/requirements.txt | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
- name: Get Python version
id: python-version
run: python3 -c "import sys, os; f=open(os.environ['GITHUB_OUTPUT'],'a'); f.write(f'version={sys.version_info[0]}.{sys.version_info[1]}\n'); f.close()"
- name: Restore s3tests venv cache
uses: actions/cache@v5
with:
path: /tmp/s3-tests/.venv
key: s3tests-venv-${{ runner.os }}-py${{ steps.python-version.outputs.version }}-${{ steps.s3tests-hash.outputs.hash }}
- run: docker pull minio/minio:latest
- run: just install s3s-proxy
- run: ./scripts/e2e-s3tests.sh
- uses: actions/upload-artifact@v7
with:
name: e2e-s3tests.logs
path: |
./target/s3-tests.log
./target/s3-tests.junit.xml
./target/s3s-proxy.log
status-check:
if: always()
needs:
- python
- rust
- cross-test
- wasm-test
- coverage
- e2e-fs
- e2e-boto3-fs
- e2e-boto3-minio
- e2e-minio
- mint-proxy-minio
- s3tests-proxy-minio
runs-on: ubuntu-latest
steps:
- name: Check all jobs
run: |
# Check if any required job failed
if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
echo "At least one required job failed"
exit 1
fi
# Check if any required job was cancelled
if [[ "${{ contains(needs.*.result, 'cancelled') }}" == "true" ]]; then
echo "At least one required job was cancelled"
exit 1
fi
echo "All jobs passed or were skipped"
exit 0