name: CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
RUSTFLAGS: -Dwarnings
RUST_BACKTRACE: 1
rust_min: "1.90.0"
defaults:
run:
shell: bash
jobs:
fmt:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- uses: taiki-e/install-action@just
- run: just fmt-check
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@just
- run: just clippy
doc:
name: Documentation
runs-on: ubuntu-latest
env:
RUSTDOCFLAGS: -Dwarnings
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@just
- run: just doc-check
mdbook:
name: mdbook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@mdbook
- uses: taiki-e/install-action@just
- run: cargo install mdbook-mermaid-mmdr
- run: just book
basics:
name: Basics
runs-on: ubuntu-latest
needs: [fmt, clippy, doc]
steps:
- run: exit 0
test:
name: Test
runs-on: ubuntu-latest
needs: [basics]
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@nextest
- uses: taiki-e/install-action@just
- run: just test-all
coverage:
name: Coverage
runs-on: ubuntu-latest
needs: [basics]
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
components: llvm-tools-preview
- uses: Swatinem/rust-cache@v2
with:
prefix-key: coverage
- uses: taiki-e/install-action@cargo-llvm-cov
- uses: taiki-e/install-action@nextest
- uses: taiki-e/install-action@just
- run: just coverage-lcov
- uses: codecov/codecov-action@v6
with:
files: coverage/lcov.info
fail_ci_if_error: false
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
msrv:
name: MSRV
runs-on: ubuntu-latest
needs: [basics]
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.rust_min }}
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@just
- run: just msrv
golden-build:
name: Golden Build (${{ matrix.generator }})
runs-on: ubuntu-latest
needs: [basics]
strategy:
fail-fast: false
matrix:
include:
- generator: typescript-fetch-tsc
cmd: just golden-typescript::build-tsc
- generator: typescript-fetch-vp
cmd: just golden-typescript::build-vp
- generator: go-http
cmd: just golden-go::build
- generator: rust-reqwest
cmd: just golden-rust::build-reqwest
- generator: rust-ureq
cmd: just golden-rust::build-ureq
- generator: rust-aioduct
cmd: just golden-rust::build-aioduct
- generator: python-httpx
cmd: just golden-python::build-httpx
- generator: python-requests
cmd: just golden-python::build-requests
- generator: java-okhttp
cmd: just golden-java::build
- generator: kotlin-okhttp
cmd: just golden-kotlin::build
steps:
- uses: actions/checkout@v6
- uses: taiki-e/install-action@just
- uses: dtolnay/rust-toolchain@stable
if: contains(matrix.generator, 'rust-')
- uses: Swatinem/rust-cache@v2
if: contains(matrix.generator, 'rust-')
- uses: actions/setup-node@v6
if: contains(matrix.generator, 'typescript-fetch')
with:
node-version: 'lts/*'
- if: contains(matrix.generator, 'typescript-fetch')
run: npm install -g typescript vite-plus
- uses: actions/setup-go@v6
if: matrix.generator == 'go-http'
with:
go-version: 'stable'
- uses: actions/setup-python@v6
if: contains(matrix.generator, 'python-')
with:
python-version: '3.12'
- uses: actions/setup-node@v6
if: contains(matrix.generator, 'python-')
with:
node-version: '20'
- uses: actions/setup-java@v5
if: contains(matrix.generator, 'java-') || contains(matrix.generator, 'kotlin-')
with:
distribution: 'temurin'
java-version: '17'
- uses: gradle/actions/setup-gradle@v6
if: contains(matrix.generator, 'java-') || contains(matrix.generator, 'kotlin-')
- run: ${{ matrix.cmd }}
release:
name: Release ${{ matrix.target }}
runs-on: ${{ matrix.os }}
needs: [basics]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact_name: openapi-nexus-linux-x86_64-gnu
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
artifact_name: openapi-nexus-linux-aarch64-gnu
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
artifact_name: openapi-nexus-linux-x86_64-musl
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
artifact_name: openapi-nexus-linux-aarch64-musl
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: openapi-nexus-macos-aarch64
steps:
- uses: actions/checkout@v6
- name: Build release binary
uses: houseabsolute/actions-rust-cross@v1
with:
command: build
target: ${{ matrix.target }}
toolchain: "1.90"
args: "--release --bin openapi-nexus"
- name: Prepare artifact
run: |
if [[ "${{ runner.os }}" == "Linux" ]]; then
chmod +x target/${{ matrix.target }}/release/openapi-nexus
fi
mkdir -p artifacts
cp target/${{ matrix.target }}/release/openapi-nexus artifacts/${{ matrix.artifact_name }}
- uses: actions/upload-artifact@v7
with:
name: ${{ matrix.artifact_name }}
path: artifacts/${{ matrix.artifact_name }}
retention-days: 3