name: Rust
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
concurrency:
group: rust-${{ github.ref }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
jobs:
lint:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v3
- name: Setup Rust
run: rustup toolchain install stable --profile minimal --component clippy
- name: Rust Cache
uses: Swatinem/rust-cache@v2
- name: Install SARIF utils
run: cargo install clippy-sarif sarif-fmt
- name: Run clippy
run: cargo clippy --all-features --message-format=json | clippy-sarif | tee results.sarif | sarif-fmt
- uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: results.sarif
wait-for-processing: true
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Rust
run: rustup toolchain install stable --profile minimal
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- name: Rust Cache
uses: Swatinem/rust-cache@v2
- name: Run tests
run: cargo llvm-cov --all-features --workspace --codecov --output-path codecov-unit.json
- name: Test docs
run: cargo test --doc
- name: Upload coverage
uses: actions/upload-artifact@v3
with:
name: codecov-unit
path: codecov-unit.json
publish-crates:
if: ${{ github.event_name == 'push' }}
name: Publish to crates.io
runs-on: ubuntu-latest
environment: crates.io
needs: [lint, unit-tests]
permissions:
contents: write
steps:
- uses: actions/checkout@v3
- name: Setup Rust
run: rustup toolchain install stable --profile minimal
- name: Rust Cache
uses: Swatinem/rust-cache@v2
- name: Read version
id: status
run: |
VERSION=$(cargo metadata -q --format-version 1 | jq -r '.packages | map(select(.name == "pythagore")) | .[0].version')
TAG="v$VERSION"
echo "::group::Load tags"
git fetch --tags
echo "::endgroup::"
if [[ $(git tag -l $TAG) == $TAG ]]; then
echo "::notice::Version $VERSION already published"
else
echo "publish=true" >> $GITHUB_OUTPUT
fi
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Run semver-checks
if: ${{ steps.status.outputs.publish }}
run: |
cargo install cargo-semver-checks --locked
cargo semver-checks check-release --all-features
- name: Publish
if: ${{ steps.status.outputs.publish }}
uses: katyo/publish-crates@v2
with:
registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Tag ${{ steps.status.outputs.version }}
if: ${{ steps.status.outputs.publish }}
run: |
git config user.name github-actions
git config user.email github-actions@github.com
git tag ${{ steps.status.outputs.tag }}
git push --tags
- name: Release notes
if: ${{ steps.status.outputs.publish }}
uses: softprops/action-gh-release@v1
with:
name: ${{ steps.status.outputs.version }}
tag_name: ${{ steps.status.outputs.tag }}
draft: true
generate_release_notes: true
publish-npm:
if: ${{ github.event_name == 'push' }}
name: Publish to npm
runs-on: ubuntu-latest
environment: npm
needs: [lint, unit-tests]
permissions:
contents: write
steps:
- uses: actions/checkout@v3
- name: Setup Node.js 18.x
uses: actions/setup-node@v3.7.0
with:
node-version: 18.x
registry-url: https://registry.npmjs.org
- name: Setup Rust stable
run: rustup toolchain install stable --profile minimal
- name: Install wasm-pack
uses: taiki-e/install-action@wasm-pack
- name: Rust Cache
uses: Swatinem/rust-cache@v2
- name: Build
run: wasm-pack build --all-features --scope jujulego --weak-refs
- name: Publish
run: yarn npm publish --access public --tolerate-republish
working-directory: pkg
env:
YARN_NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
codecov:
if: ${{ !startsWith(github.head_ref, 'renovate/') }}
runs-on: ubuntu-latest
needs: [unit-tests]
steps:
- uses: actions/checkout@v3
- name: Download unit coverage
uses: actions/download-artifact@v3
with:
name: codecov-unit
- name: Upload unit coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: codecov-unit.json
flags: unit
fail_ci_if_error: true