ZuploZuplo
LoginSign Up
  • Documentation
  • API Reference
Introduction
Getting Started
    Develop using the Portal
      1 - Setup Your Gateway2 - Rate Limiting3 - API Key Auth4 - Deploy5 - Dynamic Rate LimitingMCP - Quick start
    Develop Locally
      1 - Setup Your Gateway2 - Rate Limiting3 - API Key Auth
Concepts
Development
Policies
Handlers
API Keys
MCP Server
MCP Gateway
AI Gateway
Developer Portal
Monetization
Deploying & Source Control
    Overview
    GitHub
      SetupTesting Deployments
      Custom CI/CD
        Basic DeploymentDeploy and TestPR Preview EnvironmentsLocal Testing in CITag-Based ReleasesMulti-Stage DeploymentAutomatic Cleanup
    GitLab
    Bitbucket
    Azure DevOps
    CircleCI
    Custom CI/CDMonorepo DeploymentRename/Move Project
Observability
Networking & Infrastructure
Account Management
Programming API
Build with AI
Zuplo CLI
Migration Guides
Platform LimitsSecuritySupportTrust & ComplianceChangelog
powered by Zudoku
Custom CI/CD

GitHub Actions: Deploy and Test

Run your test suite against the deployed environment to validate changes before considering them complete.

.github/workflows/deploy-and-test.yaml
name: Deploy and Test on: push: branches: - main pull_request: jobs: deploy-and-test: runs-on: ubuntu-latest env: ZUPLO_API_KEY: ${{ secrets.ZUPLO_API_KEY }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - name: Install dependencies run: npm install - name: Deploy to Zuplo id: deploy shell: bash run: | # Capture deployment output OUTPUT=$(npx zuplo deploy --api-key "$ZUPLO_API_KEY" 2>&1) echo "$OUTPUT" # Extract the deployment URL DEPLOYMENT_URL=$(echo "$OUTPUT" | grep -oP 'Deployed to \K(https://[^ ]+)') echo "url=$DEPLOYMENT_URL" >> $GITHUB_OUTPUT - name: Run tests run: npx zuplo test --endpoint "${{ steps.deploy.outputs.url }}"

This workflow:

  1. Deploys to Zuplo and captures the deployment URL
  2. Runs your test suite against the live deployment
  3. Fails the workflow if any tests fail

Writing Tests

Place test files in the tests folder with the .test.ts extension:

tests/api.test.ts
import { describe, it } from "@zuplo/test"; import { expect } from "chai"; describe("API", () => { it("returns 200 for health check", async () => { const response = await fetch(`${ZUPLO_TEST_URL}/health`); expect(response.status).to.equal(200); }); it("requires authentication", async () => { const response = await fetch(`${ZUPLO_TEST_URL}/protected`); expect(response.status).to.equal(401); }); });

The ZUPLO_TEST_URL variable is automatically set to the --endpoint value.

Next Steps

  • Add PR preview environments with automatic cleanup
  • Run local tests before deploying
Edit this page
Last modified on April 24, 2026
Basic DeploymentPR Preview Environments
On this page
  • Writing Tests
  • Next Steps
YAML
TypeScript