shovel ui: render runtime view + client-side message rate #8937
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| pull_request: | |
| paths: | |
| - Makefile | |
| - 'src/**' | |
| - 'spec/**' | |
| - 'shard.*' | |
| - 'static/**' | |
| - 'views/**' | |
| - '.github/workflows/ci.yml' | |
| - 'build/build_docs_in_ci' | |
| - 'openapi/**' | |
| push: | |
| branches: | |
| - main | |
| - 'v[0-9]+.[0-9]+.x' | |
| paths: | |
| - Makefile | |
| - 'src/**' | |
| - 'spec/**' | |
| - 'shard.*' | |
| - 'static/**' | |
| - 'views/**' | |
| - '.github/workflows/ci.yml' | |
| - 'build/build_docs_in_ci' | |
| - 'openapi/**' | |
| workflow_dispatch: | |
| jobs: | |
| format: | |
| name: Format check | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| container: 84codes/crystal:latest-ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - run: crystal tool format --check | |
| lint: | |
| name: Lint check | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| container: 84codes/crystal:latest-ubuntu-24.04 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - run: shards install | |
| - run: make lint | |
| lint-js: | |
| name: Lint javascript | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: latest | |
| - name: Run standard | |
| run: make lint-js | |
| lint-openapi: | |
| name: Lint OpenAPI | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: latest | |
| - name: Run spectral | |
| run: make lint-openapi | |
| spec: | |
| name: Spec | |
| runs-on: ubuntu-latest | |
| container: 84codes/crystal:latest-ubuntu-24.04 | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Print Crystal version | |
| run: crystal -v | |
| - name: Install dependencies | |
| run: apt-get update && apt-get install -y liblz4-dev etcd-server | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - name: Spec | |
| run: make test | |
| spec_osx: | |
| name: Spec macOS | |
| runs-on: macos-15-xlarge | |
| if: github.repository == 'cloudamqp/lavinmq' | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Install dependencies | |
| run: | | |
| brew update | |
| brew install crystal etcd | |
| echo "/opt/homebrew/opt/etcd/bin" >> $GITHUB_PATH | |
| env: | |
| HOMEBREW_NO_AUTO_UPDATE: 1 | |
| HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1 | |
| - run: crystal --version | |
| - uses: actions/checkout@v6 | |
| - name: Spec | |
| run: make test | |
| compile-changed-files: | |
| name: Compile changed *.cr files independently | |
| runs-on: ubuntu-latest | |
| container: 84codes/crystal:latest-ubuntu-24.04 | |
| steps: | |
| - name: Install dependencies | |
| run: apt-get update && apt-get install -y liblz4-dev git | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - name: Configure git safe directory | |
| run: git config --global --add safe.directory "$GITHUB_WORKSPACE" | |
| - name: Install shards | |
| run: shards install --without-development | |
| - name: Determine changed *.cr files | |
| id: changed | |
| run: | | |
| if [ "${{ github.event_name }}" = "pull_request" ]; then | |
| base="${{ github.event.pull_request.base.sha }}" | |
| head="${{ github.event.pull_request.head.sha }}" | |
| else | |
| base="${{ github.event.before }}" | |
| head="${{ github.sha }}" | |
| fi | |
| if [ -z "$base" ] || [ "$base" = "0000000000000000000000000000000000000000" ]; then | |
| base="$(git rev-parse "$head^")" | |
| fi | |
| files=$(git diff --name-only --diff-filter=ACMR "$base" "$head" -- 'src/**/*.cr' | tr '\n' ' ') | |
| echo "files=$files" >> "$GITHUB_OUTPUT" | |
| echo "Changed files: $files" | |
| - name: Compile each changed file independently | |
| if: steps.changed.outputs.files != '' | |
| run: | | |
| status=0 | |
| for f in ${{ steps.changed.outputs.files }}; do | |
| if [ -f "$f" ]; then | |
| echo "::group::crystal build --no-codegen $f" | |
| crystal build --no-codegen --error-on-warnings -Dpreview_mt -Dexecution_context "$f" || status=1 | |
| echo "::endgroup::" | |
| fi | |
| done | |
| exit $status | |
| compile: | |
| name: Compile LavinMQ | |
| runs-on: ubuntu-latest | |
| container: 84codes/crystal:latest-ubuntu-24.04 | |
| steps: | |
| - name: Install dependencies | |
| run: apt-get update && apt-get install -y liblz4-dev | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| fetch-tags: true | |
| - name: Configure git safe directory | |
| run: git config --global --add safe.directory "$GITHUB_WORKSPACE" | |
| - name: Build lavinmq | |
| run: make -j bin/lavinmq bin/lavinmqctl bin/stress DOCS= CRYSTAL_FLAGS="--release --error-on-warnings" | |
| - name: Print build info | |
| run: bin/lavinmq --build-info | |
| - name: Upload bin/ | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: bin | |
| path: bin/ | |
| path_filter: | |
| name: Filters for frontend specs | |
| runs-on: ubuntu-latest | |
| outputs: | |
| frontend_changed: ${{ steps.changes.outputs.js == 'true' || steps.changes.outputs.views == 'true' }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - uses: dorny/paths-filter@v4 | |
| id: changes | |
| with: | |
| filters: | | |
| views: | |
| - 'views/**' | |
| js: | |
| - '**/*.js' | |
| spec_frontend: | |
| name: Frontend specs | |
| runs-on: ubuntu-24.04 | |
| needs: [compile, path_filter] | |
| if: ${{ github.ref_name == 'main' || needs.path_filter.outputs.frontend_changed == 'true' }} | |
| steps: | |
| - name: Install LavinMQ dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y make liblz4-1 | |
| - name: Download lavinmq | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: bin | |
| path: bin | |
| - name: Run LavinMQ in background | |
| run: | | |
| chmod +x bin/* | |
| bin/lavinmq --data-dir=/tmp/amqp --bind=:: & | |
| - uses: actions/checkout@v6 | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: 24 | |
| - name: Install playwright | |
| run: npm install @playwright/test | |
| - name: Install browsers | |
| run: npx playwright install --with-deps | |
| - name: Run tests | |
| run: npx playwright test --config ./spec/frontend/playwright.config.js --reporter list | |
| - uses: actions/upload-artifact@v7 | |
| if: ${{ !cancelled() }} | |
| with: | |
| name: playwright-report | |
| path: playwright-report/ | |
| retention-days: 10 | |
| java-client-test: | |
| name: RabbitMQ java client test | |
| runs-on: ubuntu-24.04 | |
| needs: compile | |
| continue-on-error: true | |
| steps: | |
| - name: Install LavinMQ dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y make openjdk-21-jre-headless liblz4-1 | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| name: bin | |
| path: bin | |
| - name: Run LavinMQ in background | |
| run: | | |
| chmod +x bin/* | |
| bin/lavinmq --data-dir=/tmp/amqp --bind=:: & | |
| - name: Clone java client | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: rabbitmq/rabbitmq-java-client | |
| ref: v5.25.0 | |
| path: rabbitmq-java-client | |
| - name: Get patch file | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: cloudamqp/lavinmq | |
| path: lavinmq | |
| # only checkout the lint rules | |
| sparse-checkout: | | |
| .github/rabbitmq-java-client.patch | |
| sparse-checkout-cone-mode: false | |
| - name: Patch tests | |
| run: | | |
| cd rabbitmq-java-client | |
| git apply ../lavinmq/.github/rabbitmq-java-client.patch | |
| - name: Run tests | |
| id: test | |
| continue-on-error: true | |
| run: | | |
| cd rabbitmq-java-client | |
| make deps | |
| ./mvnw verify -Dtest-broker.A.nodename=lavin@testhost -Dit.test=ClientTestSuite,FunctionalTestSuite -Drabbitmqctl.bin=../bin/lavinmqctl | |
| - name: >- | |
| Test outcome: ${{ steps.test.outcome }} | |
| run: echo NOOP | |
| bunny-test: | |
| name: Bunny client test | |
| runs-on: ubuntu-24.04 | |
| needs: compile | |
| steps: | |
| - name: Install LavinMQ dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y liblz4-1 | |
| - name: Checkout LavinMQ for bunny_definitions.json | |
| uses: actions/checkout@v6 | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| name: bin | |
| path: bin | |
| - name: Run LavinMQ in background | |
| run: | | |
| chmod +x bin/lavinmq | |
| bin/lavinmq --data-dir /tmp/amqp & | |
| - name: Import definitions | |
| run: | | |
| chmod +x bin/lavinmqctl | |
| bin/lavinmqctl import_definitions .github/bunny_definitions.json | |
| - name: Clone Bunny | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: ruby-amqp/bunny | |
| path: bunny | |
| fetch-depth: 0 | |
| ref: 55bb3d2accc293911120ea7dc7330cf06eda41c2 | |
| - name: Setup ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| working-directory: bunny | |
| ruby-version: ruby | |
| - name: Run specs | |
| run: | | |
| cd bunny | |
| sed -i /rabbitmq_http_api_client/d Gemfile | |
| bundle add rabbitmq_http_api_client --version=">= 3" --group=test --require=rabbitmq/http/client | |
| bundle install | |
| sed -i '211,212d' spec/lower_level_api/integration/queue_declare_spec.rb | |
| sed -i '112,146d' spec/lower_level_api/integration/queue_declare_spec.rb | |
| bundle exec rspec \ | |
| --pattern "spec/*/integration/*_spec.rb, spec/issues/*_spec.rb" \ | |
| --exclude-pattern "**/*/tls_*, **/*/connection_recovery_*, **/*/default_queue_type*" | |
| ruby-http-api-test: | |
| name: RabbitMQ HTTP API Ruby client test | |
| runs-on: ubuntu-24.04 | |
| needs: compile | |
| continue-on-error: true | |
| if: github.event.pull_request.head.repo.full_name == github.repository | |
| steps: | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y liblz4-1 | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| name: bin | |
| path: bin | |
| - name: Run LavinMQ in background | |
| run: | | |
| chmod +x bin/lavinmq | |
| bin/lavinmq --data-dir /tmp/amqp & | |
| - name: Clone HTTP API client | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: cloudamqp/rabbitmq_http_api_client | |
| token: ${{ secrets.PRIVATE_REPO_ACCESS }} | |
| path: rabbitmq_http_api_client | |
| - name: Setup ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| working-directory: rabbitmq_http_api_client | |
| ruby-version: 2.7.1 | |
| bundler-cache: true | |
| - name: Run specs | |
| run: | | |
| cd rabbitmq_http_api_client | |
| bundle exec rspec | |
| go-http-api-test: | |
| name: RabbitMQ HTTP API Go client test | |
| runs-on: ubuntu-24.04 | |
| needs: compile | |
| continue-on-error: true | |
| steps: | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y liblz4-1 | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| name: bin | |
| path: bin | |
| - name: Run LavinMQ in background | |
| run: | | |
| chmod +x bin/* | |
| bin/lavinmq --data-dir /tmp/amqp & | |
| - name: Install Go | |
| uses: actions/setup-go@v6 | |
| with: | |
| go-version: 1.26.3 | |
| - name: Clone http client | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: michaelklishin/rabbit-hole | |
| ref: 2ed025ce479a5dfeaa6493eaa05f50284eb97c88 | |
| path: rabbit-hole | |
| - name: Get patch file | |
| uses: actions/checkout@v6 | |
| with: | |
| repository: cloudamqp/lavinmq | |
| path: lavinmq | |
| # only checkout the lint rules | |
| sparse-checkout: | | |
| .github/rabbit-hole.patch | |
| sparse-checkout-cone-mode: false | |
| - name: Setup rabbit-hole | |
| run: | | |
| cd rabbit-hole | |
| git apply ../lavinmq/.github/rabbit-hole.patch | |
| bash bin/ci/before_build.sh | |
| env: | |
| RABBITHOLE_LAVINMQCTL: ../bin/lavinmqctl | |
| - name: Run specs | |
| run: | | |
| cd rabbit-hole | |
| go test -v ./... | |
| release-mode-test: | |
| name: Test in release mode | |
| runs-on: ubuntu-24.04 | |
| needs: compile | |
| continue-on-error: true | |
| steps: | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y liblz4-1 | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| name: bin | |
| path: bin | |
| - name: Run LavinMQ in background | |
| run: | | |
| chmod +x bin/lavinmq | |
| bin/lavinmq --data-dir /tmp/amqp & | |
| - name: Test the static HTTP controller | |
| run: ./extras/static_requests.sh | |
| freebsd-test: | |
| if: false # Crystal is outdated in FreeBSD | |
| name: Spec FreeBSD | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Spec | |
| uses: vmactions/freebsd-vm@v1 | |
| with: | |
| usesh: true | |
| prepare: pkg install -y crystal shards security/openssl curl gmake coreos-etcd34 | |
| run: gmake test | |
| continue-on-error: true | |
| stress: | |
| name: Stress test | |
| runs-on: ubuntu-24.04 | |
| needs: compile | |
| steps: | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y liblz4-1 | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| name: bin | |
| path: bin | |
| - name: Run LavinMQ in background | |
| run: | | |
| chmod +x bin/lavinmq | |
| bin/lavinmq --data-dir /tmp/amqp --pidfile /tmp/lavinmq.pid >lavinmq.log 2>&1 & | |
| - name: Run stress test | |
| run: | | |
| chmod +x bin/stress | |
| bin/stress | |
| - name: Shutdown LavinMQ | |
| run: | | |
| pid=$(cat /tmp/lavinmq.pid) | |
| kill "$pid" | |
| for _ in $(seq 1 10); do | |
| kill -0 "$pid" 2>/dev/null || exit 0 | |
| sleep 1 | |
| done | |
| echo "::warning::LavinMQ did not exit within 10s, sending SIGKILL" | |
| kill -9 "$pid" | |
| exit 1 | |
| - name: Print LavinMQ log | |
| if: ${{ !cancelled() }} | |
| run: cat lavinmq.log | |
| - name: Check LavinMQ log for errors | |
| if: ${{ !cancelled() }} | |
| run: | | |
| if grep -E '^[^ ]+ +(ERROR|FATAL) |^Unhandled exception' lavinmq.log; then | |
| echo "::error::Found errors in LavinMQ log" | |
| exit 1 | |
| fi |