name: Deploy on: push: branches: [master] paths-ignore: - '**.md' - 'LICENSE' - '.gitignore' - 'docs/**' concurrency: group: deploy cancel-in-progress: true jobs: test: runs-on: self-hosted steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - name: Install dependencies run: npm ci --production=false - name: Unit tests run: npm run test:unit - name: Integration tests + coverage run: | npx c8 --reporter=text-summary --reporter=text sh test-all.sh 2>&1 | tee test-output.txt TOTAL_PASS=$(grep -oP '\d+(?= passed)' test-output.txt | awk '{s+=$1} END {print s}') TOTAL_FAIL=$(grep -oP '\d+(?= failed)' test-output.txt | awk '{s+=$1} END {print s}') COVERAGE=$(grep 'Statements' test-output.txt | tail -1 | grep -oP '[\d.]+(?=%)') mkdir -p .badges echo "{\"schemaVersion\":1,\"label\":\"tests\",\"message\":\"${TOTAL_PASS}/${TOTAL_PASS} passed\",\"color\":\"brightgreen\"}" > .badges/tests.json echo "{\"schemaVersion\":1,\"label\":\"coverage\",\"message\":\"${COVERAGE}%\",\"color\":\"$([ $(echo \"$COVERAGE > 80\" | bc -l) -eq 1 ] && echo 'brightgreen' || ([ $(echo \"$COVERAGE > 60\" | bc -l) -eq 1 ] && echo 'yellow' || echo 'red'))\"}" > .badges/coverage.json echo "## Test Results" >> $GITHUB_STEP_SUMMARY echo "**${TOTAL_PASS} tests passed, ${TOTAL_FAIL} failed** | Coverage: ${COVERAGE}%" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY grep -E 'passed|failed|Results|Statements|Branches|Functions|Lines' test-output.txt >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY - name: Install Playwright browser run: npx playwright install chromium --with-deps 2>/dev/null || true - name: E2E smoke tests (local server) run: | PORT=13581 node server.js & SERVER_PID=$! sleep 5 BASE_URL=http://localhost:13581 node test-e2e-playwright.js kill $SERVER_PID 2>/dev/null || true - name: Publish badges if: success() continue-on-error: true run: | git config user.name "github-actions" git config user.email "actions@github.com" git remote set-url origin https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git git add .badges/ -f git diff --cached --quiet || (git commit -m "ci: update test badges [skip ci]" && git push) || echo "Badge push failed — badges will be stale" deploy: needs: test runs-on: self-hosted steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - name: Validate JS run: sh scripts/validate.sh - name: Build and deploy run: | set -e docker build -t meshcore-analyzer . docker rm -f meshcore-analyzer 2>/dev/null || true docker run -d \ --name meshcore-analyzer \ --restart unless-stopped \ -p 80:80 -p 443:443 -p 1883:1883 \ -v $HOME/meshcore-data:/app/data \ -v $HOME/meshcore-config.json:/app/config.json:ro \ -v $HOME/caddy-data:/data/caddy \ -v $HOME/meshcore-analyzer/Caddyfile:/etc/caddy/Caddyfile \ meshcore-analyzer echo "Deployed $(git rev-parse --short HEAD)"