juniper/.github/workflows/ci.yml
Kai Ren f3df70693c
Improve CI (#1113)
- switch to `dtolnay/rust-toolchain` GitHub action
- restore release Git tag format and correct `cargo-release` integration
- enable MSRV check
- integrate `cargo-careful`
2022-10-21 16:07:17 +00:00

434 lines
11 KiB
YAML

name: CI
on:
push:
branches: ["master"]
tags: ["juniper*"]
pull_request:
branches: ["master"]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
RUST_BACKTRACE: 1
jobs:
################
# Pull Request #
################
pr:
if: ${{ github.event_name == 'pull_request' }}
needs:
- bench
- clippy
- example
- feature
- msrv
- release-check
- rustfmt
- test
- test-book
- wasm
runs-on: ubuntu-latest
steps:
- run: true
##########################
# Linting and formatting #
##########################
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
components: clippy
- run: make cargo.lint
rustfmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: nightly
components: rustfmt
- run: make cargo.fmt check=yes
###########
# Testing #
###########
bench:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- run: cargo clippy -p juniper_benchmarks --benches -- -D warnings
- run: cargo bench -p juniper_benchmarks
example:
strategy:
fail-fast: false
matrix:
example:
- actix_subscriptions
- basic_subscriptions
- warp_async
- warp_subscriptions
os:
- ubuntu
- macOS
- windows
toolchain:
- stable
- beta
- nightly
runs-on: ${{ matrix.os }}-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
- run: rustup default ${{ matrix.toolchain }}
- run: cargo check -p example_${{ matrix.example }}
feature:
strategy:
fail-fast: false
matrix:
include:
- { feature: <none>, crate: juniper }
- { feature: bigdecimal, crate: juniper }
- { feature: bson, crate: juniper }
- { feature: chrono, crate: juniper }
- { feature: chrono-clock, crate: juniper }
- { feature: chrono-tz, crate: juniper }
- { feature: expose-test-schema, crate: juniper }
- { feature: graphql-parser, crate: juniper }
- { feature: rust_decimal, crate: juniper }
- { feature: schema-language, crate: juniper }
- { feature: serde_json, crate: juniper }
- { feature: time, crate: juniper }
- { feature: url, crate: juniper }
- { feature: uuid, crate: juniper }
- { feature: <none>, crate: juniper_actix }
- { feature: subscriptions, crate: juniper_actix }
- { feature: <none>, crate: juniper_warp }
- { feature: subscriptions, crate: juniper_warp }
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: nightly
- run: cargo +nightly update -Z minimal-versions
- run: cargo check -p ${{ matrix.crate }} --no-default-features
${{ matrix.feature != '<none>'
&& format('--features {0}', matrix.feature)
|| '' }}
env:
RUSTFLAGS: -D warnings
msrv:
name: MSRV
strategy:
fail-fast: false
matrix:
msrv: ["1.62.0"]
crate:
- juniper_codegen
- juniper
- juniper_subscriptions
- juniper_graphql_ws
- juniper_actix
- juniper_hyper
#- juniper_iron
- juniper_rocket
- juniper_warp
os:
- ubuntu
- macOS
- windows
runs-on: ${{ matrix.os }}-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.msrv }}
- run: rustup default ${{ matrix.msrv }}
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: nightly
- run: cargo +nightly update -Z minimal-versions
- run: make test.cargo crate=${{ matrix.crate }}
package:
if: ${{ startsWith(github.ref, 'refs/tags/juniper') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- name: Parse crate name and version from Git tag
id: tag
uses: actions-ecosystem/action-regex-match@v2
with:
text: ${{ github.ref }}
regex: '^refs/tags/(([a-z_]+)-v([0-9]+\.[0-9]+\.[0-9]+(-.+)?))$'
- run: cargo package -p ${{ steps.tag.outputs.group2 }}
test:
strategy:
fail-fast: false
matrix:
crate:
- juniper_codegen
- juniper
- juniper_subscriptions
- juniper_graphql_ws
- juniper_integration_tests
- juniper_codegen_tests
- juniper_actix
- juniper_hyper
- juniper_iron
- juniper_rocket
- juniper_warp
os:
- ubuntu
- macOS
- windows
toolchain:
- stable
- beta
- nightly
exclude:
- crate: juniper_codegen_tests
toolchain: stable
- crate: juniper_codegen_tests
toolchain: beta
- crate: juniper_codegen_tests
os: macOS
- crate: juniper_codegen_tests
os: windows
runs-on: ${{ matrix.os }}-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
components: rust-src
- run: rustup default ${{ matrix.toolchain }}
- run: cargo install cargo-careful
if: ${{ matrix.toolchain == 'nightly' }}
- run: make test.cargo crate=${{ matrix.crate }}
careful=${{ (matrix.toolchain == 'nightly' && 'yes')
|| 'no' }}
test-book:
name: test Book
strategy:
fail-fast: false
matrix:
os:
- ubuntu
- macOS
# TODO: Re-enable once rust-lang/rust#99466 is fixed:
# https://github.com/rust-lang/rust/issues/99466
#- windows
toolchain:
- stable
- beta
- nightly
runs-on: ${{ matrix.os }}-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
- run: rustup default ${{ matrix.toolchain }}
- run: cargo install mdbook
- run: make test.book
wasm:
strategy:
fail-fast: false
matrix:
crate:
- juniper_codegen
- juniper
toolchain:
- stable
- beta
- nightly
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
target: wasm32-unknown-unknown
- run: rustup default ${{ matrix.toolchain }}
- run: cargo check --target wasm32-unknown-unknown -p ${{ matrix.crate }}
#############
# Releasing #
#############
release-check:
name: check release
if: ${{ !startsWith(github.ref, 'refs/tags/juniper') }}
strategy:
fail-fast: false
matrix:
crate:
- juniper_codegen
- juniper
- juniper_subscriptions
- juniper_graphql_ws
- juniper_actix
- juniper_hyper
- juniper_iron
- juniper_rocket
- juniper_warp
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- run: cargo install cargo-release
- run: make cargo.release crate=${{ matrix.crate }} ver=minor
exec=no install=no
release-crate:
name: release on crates.io
needs: ["release-github"]
if: ${{ startsWith(github.ref, 'refs/tags/juniper') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: stable
- name: Parse crate name and version from Git tag
id: tag
uses: actions-ecosystem/action-regex-match@v2
with:
text: ${{ github.ref }}
regex: '^refs/tags/(([a-z_]+)-v([0-9]+\.[0-9]+\.[0-9]+(-.+)?))$'
- name: Publish `${{ steps.tag.outputs.group2 }}` crate
run: cargo publish -p ${{ steps.tag.outputs.group2 }}
--token ${{ secrets.CRATESIO_TOKEN }}
release-github:
name: release on GitHub
needs:
- bench
- clippy
- example
- feature
- msrv
- package
- rustfmt
- test
- test-book
- wasm
if: ${{ startsWith(github.ref, 'refs/tags/juniper') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Parse crate name and version from Git tag
id: tag
uses: actions-ecosystem/action-regex-match@v2
with:
text: ${{ github.ref }}
regex: '^refs/tags/(([a-z_]+)-v([0-9]+\.[0-9]+\.[0-9]+(-.+)?))$'
- name: Verify release version matches crate's Cargo manifest
run: |
test "${{ steps.tag.outputs.group3 }}" \
== "$(grep -m1 'version = "' \
${{ steps.tag.outputs.group2 }}/Cargo.toml \
| cut -d '"' -f2)"
- name: Parse CHANGELOG link
id: changelog
run: echo ::set-output
name=link::${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.tag.outputs.group1 }}/${{ steps.tag.outputs.group2 }}/CHANGELOG.md#$(sed -n '/^## \[${{ steps.tag.outputs.group3 }}\]/{s/^## \[\(.*\)\][^0-9]*\([0-9].*\)/\1--\2/;s/[^0-9a-z-]*//g;p;}' ${{ steps.tag.outputs.group2 }}/CHANGELOG.md)
- uses: softprops/action-gh-release@v1
with:
name: ${{ steps.tag.outputs.group2 }} ${{ steps.tag.outputs.group3 }}
body: |
[API docs](https://docs.rs/${{ steps.tag.outputs.group2 }}/${{ steps.tag.outputs.group3 }})
[Changelog](${{ steps.changelog.outputs.link }})
prerelease: ${{ contains(steps.tag.outputs.group3, '-') }}
##########
# Deploy #
##########
deploy-book:
name: deploy Book
needs: ["test", "test-book"]
if: ${{ github.ref == 'refs/heads/master'
|| startsWith(github.ref, 'refs/tags/juniper@') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: peaceiris/actions-mdbook@v1
- run: make book.build out=gh-pages${{ (github.ref == 'refs/heads/master'
&& '/master')
|| '' }}
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
keep_files: true
publish_dir: book/gh-pages