Skip to content

feat: add /mesh explainer page and CTA button in infrastructure section #27

feat: add /mesh explainer page and CTA button in infrastructure section

feat: add /mesh explainer page and CTA button in infrastructure section #27

name: Deploy Services to Fly.io
on:
push:
branches: [main]
tags: ['v*']
workflow_dispatch:
permissions:
contents: read
concurrency:
group: deploy-fly-${{ github.ref_name }}
cancel-in-progress: false
jobs:
deploy-registry:
name: Deploy mesh-registry
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup flyctl
uses: superfly/flyctl-actions/setup-flyctl@master
- name: Deploy registry to Fly.io
run: flyctl deploy --remote-only
working-directory: registry
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
deploy-packages-website:
name: Deploy mesh-packages website
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup flyctl
uses: superfly/flyctl-actions/setup-flyctl@master
- name: Deploy packages website to Fly.io
run: flyctl deploy --remote-only
working-directory: packages-website
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
deploy-hyperpush-landing:
name: Deploy hyperpush landing
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup flyctl
uses: superfly/flyctl-actions/setup-flyctl@master
- name: Deploy landing to Fly.io
run: flyctl deploy --remote-only
working-directory: mesher/landing
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
health-check:
name: Post-deploy health checks
needs: [deploy-registry, deploy-packages-website, deploy-hyperpush-landing]
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Verify public surface contract
shell: bash
timeout-minutes: 8
run: |
set -euo pipefail
python3 scripts/lib/m034_public_surface_contract.py public-http --root "$GITHUB_WORKSPACE" --artifact-dir "$RUNNER_TEMP/m034-public-surface-contract"
- name: Verify hyperpush landing
shell: bash
timeout-minutes: 5
run: |
set -euo pipefail
curl -fsSL https://hyperpush-landing.fly.dev > "$RUNNER_TEMP/hyperpush-landing.html"
grep -q "hyperpush" "$RUNNER_TEMP/hyperpush-landing.html"
grep -q "Open Source Error Tracking" "$RUNNER_TEMP/hyperpush-landing.html"
- name: Verify blog API is live
shell: bash
timeout-minutes: 3
run: |
set -euo pipefail
POSTS=$(curl -fsSL https://hyperpush-landing.fly.dev/api/blog/posts)
echo "$POSTS" | python3 -c "
import json, sys
d = json.load(sys.stdin)
assert 'posts' in d, 'missing posts key'
assert isinstance(d['posts'], list), 'posts is not a list'
print('blog API ok --', len(d['posts']), 'published post(s)')
"
- name: Verify blog listing page renders
shell: bash
timeout-minutes: 3
run: |
set -euo pipefail
curl -fsSL https://hyperpush-landing.fly.dev/community/blog > "$RUNNER_TEMP/blog-listing.html"
grep -q "Blog" "$RUNNER_TEMP/blog-listing.html"
- name: Verify admin endpoint is auth-gated
shell: bash
timeout-minutes: 2
run: |
set -euo pipefail
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
"https://hyperpush-landing.fly.dev/api/blog/posts?status=all")
if [ "$STATUS" != "401" ]; then
echo "ERROR: admin endpoint returned $STATUS (expected 401)"
exit 1
fi
echo "admin endpoint correctly returns 401 without credentials"