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: cargo check -p example_${{ matrix.example }} feature: strategy: fail-fast: false matrix: include: - { feature: , 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: , crate: juniper_actix } - { feature: subscriptions, crate: juniper_actix } - { feature: , crate: juniper_warp } - { feature: subscriptions, crate: juniper_warp } runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@v1 with: toolchain: nightly - uses: dtolnay/rust-toolchain@v1 with: toolchain: stable - run: cargo +nightly update -Z minimal-versions - run: cargo check -p ${{ matrix.crate }} --no-default-features ${{ matrix.feature != '' && format('--features {0}', matrix.feature) || '' }} env: RUSTFLAGS: -D warnings msrv: name: MSRV strategy: fail-fast: false matrix: msrv: ["1.65.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: nightly - uses: dtolnay/rust-toolchain@v1 with: toolchain: ${{ matrix.msrv }} - 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: 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 - windows toolchain: - stable - beta - nightly runs-on: ${{ matrix.os }}-latest steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@v1 with: toolchain: ${{ matrix.toolchain }} - uses: peaceiris/actions-mdbook@v1 - 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: 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 "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)" >> $GITHUB_OUTPUT - 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