CI integration

Run shuttle doctor in CI with your download token. No public GitHub Action.

There is no public GitHub Action anymore: the deploy-shuttle repository is private, so uses: dev-toolings/deploy-shuttle@v1 no longer resolves. Wiring doctor into CI is a couple of plain shell steps instead: download the binary with your download token (see Install for the full download/verify pattern), then run shuttle doctor and act on its exit code or score.

Minimal workflow

name: Production readiness

on:
  pull_request:
    branches: [main]
  schedule:
    - cron: '0 7 * * 1' # Monday 07:00 UTC

jobs:
  doctor:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install shuttle
        env:
          SHUTTLE_DOWNLOAD_TOKEN: ${{ secrets.SHUTTLE_DOWNLOAD_TOKEN }}
        run: |
          release=$(curl -fsSL \
            -H "Authorization: Bearer $SHUTTLE_DOWNLOAD_TOKEN" \
            https://deployshuttle.pulseview.app/releases/latest)
          url=$(echo "$release" | jq -r '.urls["shuttle-linux-x64"]')
          expected_sha256=$(echo "$release" | jq -r '.sha256["shuttle-linux-x64"]')
          curl -fsSL -o shuttle "$url"
          echo "$expected_sha256  shuttle" | sha256sum -c -
          chmod +x shuttle
          sudo mv shuttle /usr/local/bin/shuttle

      - name: Run Shuttle Doctor
        run: |
          shuttle doctor \
            --target "$SSH_TARGET" \
            --format json \
            --output report.json \
            --fail-below 80
        env:
          SSH_TARGET: ${{ secrets.SSH_TARGET }}

      - name: Upload report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: readiness-report
          path: report.json

SSH access

If --target points at a remote host, add a step before shuttle doctor to make the deploy key available:

      - name: Set up SSH
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          SSH_TARGET: ${{ secrets.SSH_TARGET }}
        run: |
          mkdir -p ~/.ssh
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -H "$(echo "$SSH_TARGET" | cut -d@ -f2 | cut -d: -f1)" >> ~/.ssh/known_hosts

Reading the result

doctor --format json writes score, level, and findings to the output file: read .score / .level with jq for a job summary, or rely on the process exit code: 0 when the score clears --fail-below, 1 on any critical finding or a threshold miss.

Self-hosted runners

The workflow above assumes bash, curl, jq, and sha256sum (use shasum -a 256 instead on macOS runners) are available, which is true on stock GitHub-hosted ubuntu-latest runners.