run_tests.yml

  1# Generated from xtask::workflows::run_tests
  2# Rebuild with `cargo xtask workflows`.
  3name: run_tests
  4env:
  5  CARGO_TERM_COLOR: always
  6  RUST_BACKTRACE: '1'
  7  CARGO_INCREMENTAL: '0'
  8on:
  9  pull_request:
 10    branches:
 11    - '**'
 12  push:
 13    branches:
 14    - main
 15    - v[0-9]+.[0-9]+.x
 16jobs:
 17  orchestrate:
 18    if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
 19    runs-on: namespace-profile-2x4-ubuntu-2404
 20    steps:
 21    - name: steps::checkout_repo
 22      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
 23      with:
 24        clean: false
 25        fetch-depth: ${{ github.ref == 'refs/heads/main' && 2 || 350 }}
 26    - id: filter
 27      name: filter
 28      run: |
 29        if [ -z "$GITHUB_BASE_REF" ]; then
 30          echo "Not in a PR context (i.e., push to main/stable/preview)"
 31          COMPARE_REV="$(git rev-parse HEAD~1)"
 32        else
 33          echo "In a PR context comparing to pull_request.base.ref"
 34          git fetch origin "$GITHUB_BASE_REF" --depth=350
 35          COMPARE_REV="$(git merge-base "origin/${GITHUB_BASE_REF}" HEAD)"
 36        fi
 37        CHANGED_FILES="$(git diff --name-only "$COMPARE_REV" ${{ github.sha }})"
 38
 39        check_pattern() {
 40          local output_name="$1"
 41          local pattern="$2"
 42          local grep_arg="$3"
 43
 44          echo "$CHANGED_FILES" | grep "$grep_arg" "$pattern" && \
 45            echo "${output_name}=true" >> "$GITHUB_OUTPUT" || \
 46            echo "${output_name}=false" >> "$GITHUB_OUTPUT"
 47        }
 48
 49        # Check for changes that require full rebuild (no filter)
 50        # Direct pushes to main/stable/preview always run full suite
 51        if [ -z "$GITHUB_BASE_REF" ]; then
 52          echo "Not a PR, running full test suite"
 53          echo "changed_packages=" >> "$GITHUB_OUTPUT"
 54        elif echo "$CHANGED_FILES" | grep -qP '^(rust-toolchain\.toml|\.cargo/|\.github/|Cargo\.(toml|lock)$)'; then
 55          echo "Toolchain, cargo config, or root Cargo files changed, will run all tests"
 56          echo "changed_packages=" >> "$GITHUB_OUTPUT"
 57        else
 58          # Extract changed directories from file paths
 59          CHANGED_DIRS=$(echo "$CHANGED_FILES" | \
 60            grep -oP '^(crates|tooling)/\K[^/]+' | \
 61            sort -u || true)
 62
 63          # Build directory-to-package mapping using cargo metadata
 64          DIR_TO_PKG=$(cargo metadata --format-version=1 --no-deps 2>/dev/null | \
 65            jq -r '.packages[] | select(.manifest_path | test("crates/|tooling/")) | "\(.manifest_path | capture("(crates|tooling)/(?<dir>[^/]+)") | .dir)=\(.name)"')
 66
 67          # Map directory names to package names
 68          FILE_CHANGED_PKGS=""
 69          for dir in $CHANGED_DIRS; do
 70            pkg=$(echo "$DIR_TO_PKG" | grep "^${dir}=" | cut -d= -f2 | head -1)
 71            if [ -n "$pkg" ]; then
 72              FILE_CHANGED_PKGS=$(printf '%s\n%s' "$FILE_CHANGED_PKGS" "$pkg")
 73            else
 74              # Fall back to directory name if no mapping found
 75              FILE_CHANGED_PKGS=$(printf '%s\n%s' "$FILE_CHANGED_PKGS" "$dir")
 76            fi
 77          done
 78          FILE_CHANGED_PKGS=$(echo "$FILE_CHANGED_PKGS" | grep -v '^$' | sort -u || true)
 79
 80          # If assets/ changed, add crates that depend on those assets
 81          if echo "$CHANGED_FILES" | grep -qP '^assets/'; then
 82            FILE_CHANGED_PKGS=$(printf '%s\n%s\n%s\n%s' "$FILE_CHANGED_PKGS" "settings" "storybook" "assets" | sort -u)
 83          fi
 84
 85          # Combine all changed packages
 86          ALL_CHANGED_PKGS=$(echo "$FILE_CHANGED_PKGS" | grep -v '^$' || true)
 87
 88          if [ -z "$ALL_CHANGED_PKGS" ]; then
 89            echo "No package changes detected, will run all tests"
 90            echo "changed_packages=" >> "$GITHUB_OUTPUT"
 91          else
 92            # Build nextest filterset with rdeps for each package
 93            FILTERSET=$(echo "$ALL_CHANGED_PKGS" | \
 94              sed 's/.*/rdeps(&)/' | \
 95              tr '\n' '|' | \
 96              sed 's/|$//')
 97            echo "Changed packages filterset: $FILTERSET"
 98            echo "changed_packages=$FILTERSET" >> "$GITHUB_OUTPUT"
 99          fi
100        fi
101
102        check_pattern "run_action_checks" '^\.github/(workflows/|actions/|actionlint.yml)|tooling/xtask|script/' -qP
103        check_pattern "run_docs" '^(docs/|crates/.*\.rs)' -qP
104        check_pattern "run_licenses" '^(Cargo.lock|script/.*licenses)' -qP
105        check_pattern "run_tests" '^(docs/|script/update_top_ranking_issues/|\.github/(ISSUE_TEMPLATE|workflows/(?!run_tests)))' -qvP
106    outputs:
107      changed_packages: ${{ steps.filter.outputs.changed_packages }}
108      run_action_checks: ${{ steps.filter.outputs.run_action_checks }}
109      run_docs: ${{ steps.filter.outputs.run_docs }}
110      run_licenses: ${{ steps.filter.outputs.run_licenses }}
111      run_tests: ${{ steps.filter.outputs.run_tests }}
112  check_style:
113    if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
114    runs-on: namespace-profile-4x8-ubuntu-2204
115    steps:
116    - name: steps::checkout_repo
117      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
118      with:
119        clean: false
120    - name: steps::cache_rust_dependencies_namespace
121      uses: namespacelabs/nscloud-cache-action@v1
122      with:
123        cache: rust
124        path: ~/.rustup
125    - name: steps::setup_pnpm
126      uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2
127      with:
128        version: '9'
129    - name: steps::prettier
130      run: ./script/prettier
131    - name: steps::cargo_fmt
132      run: cargo fmt --all -- --check
133    - name: ./script/check-todos
134      run: ./script/check-todos
135    - name: ./script/check-keymaps
136      run: ./script/check-keymaps
137    - name: run_tests::check_style::check_for_typos
138      uses: crate-ci/typos@2d0ce569feab1f8752f1dde43cc2f2aa53236e06
139      with:
140        config: ./typos.toml
141    timeout-minutes: 60
142  clippy_windows:
143    needs:
144    - orchestrate
145    if: needs.orchestrate.outputs.run_tests == 'true'
146    runs-on: self-32vcpu-windows-2022
147    steps:
148    - name: steps::checkout_repo
149      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
150      with:
151        clean: false
152    - name: steps::setup_cargo_config
153      run: |
154        New-Item -ItemType Directory -Path "./../.cargo" -Force
155        Copy-Item -Path "./.cargo/ci-config.toml" -Destination "./../.cargo/config.toml"
156      shell: pwsh
157    - name: steps::clippy
158      run: ./script/clippy.ps1
159      shell: pwsh
160    timeout-minutes: 60
161  clippy_linux:
162    needs:
163    - orchestrate
164    if: needs.orchestrate.outputs.run_tests == 'true'
165    runs-on: namespace-profile-16x32-ubuntu-2204
166    steps:
167    - name: steps::checkout_repo
168      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
169      with:
170        clean: false
171    - name: steps::setup_cargo_config
172      run: |
173        mkdir -p ./../.cargo
174        cp ./.cargo/ci-config.toml ./../.cargo/config.toml
175    - name: steps::cache_rust_dependencies_namespace
176      uses: namespacelabs/nscloud-cache-action@v1
177      with:
178        cache: rust
179        path: ~/.rustup
180    - name: steps::setup_linux
181      run: ./script/linux
182    - name: steps::install_mold
183      run: ./script/install-mold
184    - name: steps::download_wasi_sdk
185      run: ./script/download-wasi-sdk
186    - name: steps::clippy
187      run: ./script/clippy
188    timeout-minutes: 60
189  clippy_mac:
190    needs:
191    - orchestrate
192    if: needs.orchestrate.outputs.run_tests == 'true'
193    runs-on: namespace-profile-mac-large
194    steps:
195    - name: steps::checkout_repo
196      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
197      with:
198        clean: false
199    - name: steps::setup_cargo_config
200      run: |
201        mkdir -p ./../.cargo
202        cp ./.cargo/ci-config.toml ./../.cargo/config.toml
203    - name: steps::cache_rust_dependencies_namespace
204      uses: namespacelabs/nscloud-cache-action@v1
205      with:
206        cache: rust
207        path: ~/.rustup
208    - name: steps::clippy
209      run: ./script/clippy
210    timeout-minutes: 60
211  run_tests_windows:
212    needs:
213    - orchestrate
214    if: needs.orchestrate.outputs.run_tests == 'true'
215    runs-on: self-32vcpu-windows-2022
216    steps:
217    - name: steps::checkout_repo
218      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
219      with:
220        clean: false
221    - name: steps::setup_cargo_config
222      run: |
223        New-Item -ItemType Directory -Path "./../.cargo" -Force
224        Copy-Item -Path "./.cargo/ci-config.toml" -Destination "./../.cargo/config.toml"
225      shell: pwsh
226    - name: steps::setup_node
227      uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
228      with:
229        node-version: '20'
230    - name: steps::clear_target_dir_if_large
231      run: ./script/clear-target-dir-if-larger-than.ps1 250
232      shell: pwsh
233    - name: steps::cargo_nextest
234      run: cargo nextest run --workspace --no-fail-fast${{ needs.orchestrate.outputs.changed_packages && format(' -E "{0}"', needs.orchestrate.outputs.changed_packages) || '' }}
235      shell: pwsh
236    - name: steps::cleanup_cargo_config
237      if: always()
238      run: |
239        Remove-Item -Recurse -Path "./../.cargo" -Force -ErrorAction SilentlyContinue
240      shell: pwsh
241    timeout-minutes: 60
242  run_tests_linux:
243    needs:
244    - orchestrate
245    if: needs.orchestrate.outputs.run_tests == 'true'
246    runs-on: namespace-profile-16x32-ubuntu-2204
247    steps:
248    - name: steps::checkout_repo
249      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
250      with:
251        clean: false
252    - name: steps::setup_cargo_config
253      run: |
254        mkdir -p ./../.cargo
255        cp ./.cargo/ci-config.toml ./../.cargo/config.toml
256    - name: steps::cache_rust_dependencies_namespace
257      uses: namespacelabs/nscloud-cache-action@v1
258      with:
259        cache: rust
260        path: ~/.rustup
261    - name: steps::setup_linux
262      run: ./script/linux
263    - name: steps::install_mold
264      run: ./script/install-mold
265    - name: steps::download_wasi_sdk
266      run: ./script/download-wasi-sdk
267    - name: steps::setup_node
268      uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
269      with:
270        node-version: '20'
271    - name: steps::cargo_install_nextest
272      uses: taiki-e/install-action@nextest
273    - name: steps::clear_target_dir_if_large
274      run: ./script/clear-target-dir-if-larger-than 250
275    - name: steps::cargo_nextest
276      run: cargo nextest run --workspace --no-fail-fast${{ needs.orchestrate.outputs.changed_packages && format(' -E "{0}"', needs.orchestrate.outputs.changed_packages) || '' }}
277    - name: steps::cleanup_cargo_config
278      if: always()
279      run: |
280        rm -rf ./../.cargo
281    timeout-minutes: 60
282    services:
283      postgres:
284        image: postgres:15
285        env:
286          POSTGRES_HOST_AUTH_METHOD: trust
287        ports:
288        - 5432:5432
289        options: --health-cmd pg_isready --health-interval 500ms --health-timeout 5s --health-retries 10
290  run_tests_mac:
291    needs:
292    - orchestrate
293    if: needs.orchestrate.outputs.run_tests == 'true'
294    runs-on: namespace-profile-mac-large
295    steps:
296    - name: steps::checkout_repo
297      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
298      with:
299        clean: false
300    - name: steps::setup_cargo_config
301      run: |
302        mkdir -p ./../.cargo
303        cp ./.cargo/ci-config.toml ./../.cargo/config.toml
304    - name: steps::cache_rust_dependencies_namespace
305      uses: namespacelabs/nscloud-cache-action@v1
306      with:
307        cache: rust
308        path: ~/.rustup
309    - name: steps::setup_node
310      uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
311      with:
312        node-version: '20'
313    - name: steps::cargo_install_nextest
314      uses: taiki-e/install-action@nextest
315    - name: steps::clear_target_dir_if_large
316      run: ./script/clear-target-dir-if-larger-than 300
317    - name: steps::cargo_nextest
318      run: cargo nextest run --workspace --no-fail-fast${{ needs.orchestrate.outputs.changed_packages && format(' -E "{0}"', needs.orchestrate.outputs.changed_packages) || '' }}
319    - name: steps::cleanup_cargo_config
320      if: always()
321      run: |
322        rm -rf ./../.cargo
323    timeout-minutes: 60
324  doctests:
325    needs:
326    - orchestrate
327    if: needs.orchestrate.outputs.run_tests == 'true'
328    runs-on: namespace-profile-16x32-ubuntu-2204
329    steps:
330    - name: steps::checkout_repo
331      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
332      with:
333        clean: false
334    - name: steps::cache_rust_dependencies_namespace
335      uses: namespacelabs/nscloud-cache-action@v1
336      with:
337        cache: rust
338        path: ~/.rustup
339    - name: steps::setup_linux
340      run: ./script/linux
341    - name: steps::install_mold
342      run: ./script/install-mold
343    - name: steps::download_wasi_sdk
344      run: ./script/download-wasi-sdk
345    - name: steps::setup_cargo_config
346      run: |
347        mkdir -p ./../.cargo
348        cp ./.cargo/ci-config.toml ./../.cargo/config.toml
349    - id: run_doctests
350      name: run_tests::doctests::run_doctests
351      run: |
352        cargo test --workspace --doc --no-fail-fast
353    - name: steps::cleanup_cargo_config
354      if: always()
355      run: |
356        rm -rf ./../.cargo
357    timeout-minutes: 60
358  check_workspace_binaries:
359    needs:
360    - orchestrate
361    if: needs.orchestrate.outputs.run_tests == 'true'
362    runs-on: namespace-profile-8x16-ubuntu-2204
363    steps:
364    - name: steps::checkout_repo
365      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
366      with:
367        clean: false
368    - name: steps::setup_cargo_config
369      run: |
370        mkdir -p ./../.cargo
371        cp ./.cargo/ci-config.toml ./../.cargo/config.toml
372    - name: steps::cache_rust_dependencies_namespace
373      uses: namespacelabs/nscloud-cache-action@v1
374      with:
375        cache: rust
376        path: ~/.rustup
377    - name: steps::setup_linux
378      run: ./script/linux
379    - name: steps::install_mold
380      run: ./script/install-mold
381    - name: steps::download_wasi_sdk
382      run: ./script/download-wasi-sdk
383    - name: cargo build -p collab
384      run: cargo build -p collab
385    - name: cargo build --workspace --bins --examples
386      run: cargo build --workspace --bins --examples
387    - name: steps::cleanup_cargo_config
388      if: always()
389      run: |
390        rm -rf ./../.cargo
391    timeout-minutes: 60
392  check_dependencies:
393    needs:
394    - orchestrate
395    if: needs.orchestrate.outputs.run_tests == 'true'
396    runs-on: namespace-profile-2x4-ubuntu-2404
397    steps:
398    - name: steps::checkout_repo
399      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
400      with:
401        clean: false
402    - name: steps::cache_rust_dependencies_namespace
403      uses: namespacelabs/nscloud-cache-action@v1
404      with:
405        cache: rust
406        path: ~/.rustup
407    - name: run_tests::check_dependencies::install_cargo_machete
408      uses: clechasseur/rs-cargo@8435b10f6e71c2e3d4d3b7573003a8ce4bfc6386
409      with:
410        command: install
411        args: cargo-machete@0.7.0
412    - name: run_tests::check_dependencies::run_cargo_machete
413      uses: clechasseur/rs-cargo@8435b10f6e71c2e3d4d3b7573003a8ce4bfc6386
414      with:
415        command: machete
416    - name: run_tests::check_dependencies::check_cargo_lock
417      run: cargo update --locked --workspace
418    - name: run_tests::check_dependencies::check_vulnerable_dependencies
419      if: github.event_name == 'pull_request'
420      uses: actions/dependency-review-action@67d4f4bd7a9b17a0db54d2a7519187c65e339de8
421      with:
422        license-check: false
423    timeout-minutes: 60
424  check_docs:
425    needs:
426    - orchestrate
427    if: needs.orchestrate.outputs.run_docs == 'true'
428    runs-on: namespace-profile-8x16-ubuntu-2204
429    steps:
430    - name: steps::checkout_repo
431      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
432      with:
433        clean: false
434    - name: steps::setup_cargo_config
435      run: |
436        mkdir -p ./../.cargo
437        cp ./.cargo/ci-config.toml ./../.cargo/config.toml
438    - name: steps::cache_rust_dependencies_namespace
439      uses: namespacelabs/nscloud-cache-action@v1
440      with:
441        cache: rust
442        path: ~/.rustup
443    - name: run_tests::check_docs::lychee_link_check
444      uses: lycheeverse/lychee-action@82202e5e9c2f4ef1a55a3d02563e1cb6041e5332
445      with:
446        args: --no-progress --exclude '^http' './docs/src/**/*'
447        fail: true
448        jobSummary: false
449    - name: steps::setup_linux
450      run: ./script/linux
451    - name: steps::install_mold
452      run: ./script/install-mold
453    - name: steps::download_wasi_sdk
454      run: ./script/download-wasi-sdk
455    - name: ./script/generate-action-metadata
456      run: ./script/generate-action-metadata
457    - name: run_tests::check_docs::install_mdbook
458      uses: peaceiris/actions-mdbook@ee69d230fe19748b7abf22df32acaa93833fad08
459      with:
460        mdbook-version: 0.4.37
461    - name: run_tests::check_docs::build_docs
462      run: |
463        mkdir -p target/deploy
464        mdbook build ./docs --dest-dir=../target/deploy/docs/
465    - name: run_tests::check_docs::lychee_link_check
466      uses: lycheeverse/lychee-action@82202e5e9c2f4ef1a55a3d02563e1cb6041e5332
467      with:
468        args: --no-progress --exclude '^http' 'target/deploy/docs'
469        fail: true
470        jobSummary: false
471    timeout-minutes: 60
472  check_licenses:
473    needs:
474    - orchestrate
475    if: needs.orchestrate.outputs.run_licenses == 'true'
476    runs-on: namespace-profile-2x4-ubuntu-2404
477    steps:
478    - name: steps::checkout_repo
479      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
480      with:
481        clean: false
482    - name: steps::cache_rust_dependencies_namespace
483      uses: namespacelabs/nscloud-cache-action@v1
484      with:
485        cache: rust
486        path: ~/.rustup
487    - name: ./script/check-licenses
488      run: ./script/check-licenses
489    - name: ./script/generate-licenses
490      run: ./script/generate-licenses
491  check_scripts:
492    needs:
493    - orchestrate
494    if: needs.orchestrate.outputs.run_action_checks == 'true'
495    runs-on: namespace-profile-2x4-ubuntu-2404
496    steps:
497    - name: steps::checkout_repo
498      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
499      with:
500        clean: false
501    - name: run_tests::check_scripts::run_shellcheck
502      run: ./script/shellcheck-scripts error
503    - id: get_actionlint
504      name: run_tests::check_scripts::download_actionlint
505      run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
506    - name: run_tests::check_scripts::run_actionlint
507      run: |
508        ${{ steps.get_actionlint.outputs.executable }} -color
509    - name: run_tests::check_scripts::check_xtask_workflows
510      run: |
511        cargo xtask workflows
512        if ! git diff --exit-code .github; then
513          echo "Error: .github directory has uncommitted changes after running 'cargo xtask workflows'"
514          echo "Please run 'cargo xtask workflows' locally and commit the changes"
515          exit 1
516        fi
517    timeout-minutes: 60
518  check_postgres_and_protobuf_migrations:
519    needs:
520    - orchestrate
521    if: needs.orchestrate.outputs.run_tests == 'true'
522    runs-on: namespace-profile-16x32-ubuntu-2204
523    env:
524      GIT_AUTHOR_NAME: Protobuf Action
525      GIT_AUTHOR_EMAIL: ci@zed.dev
526      GIT_COMMITTER_NAME: Protobuf Action
527      GIT_COMMITTER_EMAIL: ci@zed.dev
528    steps:
529    - name: steps::checkout_repo
530      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
531      with:
532        fetch-depth: 0
533    - name: run_tests::check_postgres_and_protobuf_migrations::remove_untracked_files
534      run: git clean -df
535    - name: run_tests::check_postgres_and_protobuf_migrations::ensure_fresh_merge
536      run: |
537        if [ -z "$GITHUB_BASE_REF" ];
538        then
539          echo "BUF_BASE_BRANCH=$(git merge-base origin/main HEAD)" >> "$GITHUB_ENV"
540        else
541          git checkout -B temp
542          git merge -q "origin/$GITHUB_BASE_REF" -m "merge main into temp"
543          echo "BUF_BASE_BRANCH=$GITHUB_BASE_REF" >> "$GITHUB_ENV"
544        fi
545    - name: run_tests::check_postgres_and_protobuf_migrations::bufbuild_setup_action
546      uses: bufbuild/buf-setup-action@v1
547      with:
548        version: v1.29.0
549        github_token: ${{ secrets.GITHUB_TOKEN }}
550    - name: run_tests::check_postgres_and_protobuf_migrations::bufbuild_breaking_action
551      uses: bufbuild/buf-breaking-action@v1
552      with:
553        input: crates/proto/proto/
554        against: https://github.com/${GITHUB_REPOSITORY}.git#branch=${BUF_BASE_BRANCH},subdir=crates/proto/proto/
555    timeout-minutes: 60
556  tests_pass:
557    needs:
558    - orchestrate
559    - check_style
560    - clippy_windows
561    - clippy_linux
562    - clippy_mac
563    - run_tests_windows
564    - run_tests_linux
565    - run_tests_mac
566    - doctests
567    - check_workspace_binaries
568    - check_dependencies
569    - check_docs
570    - check_licenses
571    - check_scripts
572    if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions') && always()
573    runs-on: namespace-profile-2x4-ubuntu-2404
574    steps:
575    - name: run_tests::tests_pass
576      run: |
577        set +x
578        EXIT_CODE=0
579
580        check_result() {
581          echo "* $1: $2"
582          if [[ "$2" != "skipped" && "$2" != "success" ]]; then EXIT_CODE=1; fi
583        }
584
585        check_result "orchestrate" "${{ needs.orchestrate.result }}"
586        check_result "check_style" "${{ needs.check_style.result }}"
587        check_result "clippy_windows" "${{ needs.clippy_windows.result }}"
588        check_result "clippy_linux" "${{ needs.clippy_linux.result }}"
589        check_result "clippy_mac" "${{ needs.clippy_mac.result }}"
590        check_result "run_tests_windows" "${{ needs.run_tests_windows.result }}"
591        check_result "run_tests_linux" "${{ needs.run_tests_linux.result }}"
592        check_result "run_tests_mac" "${{ needs.run_tests_mac.result }}"
593        check_result "doctests" "${{ needs.doctests.result }}"
594        check_result "check_workspace_binaries" "${{ needs.check_workspace_binaries.result }}"
595        check_result "check_dependencies" "${{ needs.check_dependencies.result }}"
596        check_result "check_docs" "${{ needs.check_docs.result }}"
597        check_result "check_licenses" "${{ needs.check_licenses.result }}"
598        check_result "check_scripts" "${{ needs.check_scripts.result }}"
599
600        exit $EXIT_CODE
601concurrency:
602  group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.ref_name == 'main' && github.sha || 'anysha' }}
603  cancel-in-progress: true
604defaults:
605  run:
606    shell: bash -euxo pipefail {0}