Convex - Smoke Test HTTP Action

Octopus.Script exported 2026-05-29 by itsmebenwalker belongs to ‘Convex’ category.

Performs a smoke test against a Convex HTTP action endpoint after a deployment. Validates that the deployment is live and responding correctly by checking the HTTP status code and optionally asserting on the response body.

Use this as a post-deploy verification step to catch failed or partial deployments early.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Deployment URL

ConvexSmokeTest.DeploymentUrl =

The base URL of your Convex deployment.

Example: “https://happy-animal-123.convex.site`

Find` this in your Convex dashboard under Settings → URL & Deploy Key.

Action Path

ConvexSmokeTest.ActionPath = /health

The path to the HTTP action endpoint to test.

Example: /health or /api/ping

This is the route registered in your Convex http.ts file.

HTTP Method

ConvexSmokeTest.HttpMethod = GET

The HTTP method to use for the request.

Expected HTTP Status Code

ConvexSmokeTest.ExpectedStatusCode = 200

The HTTP status code the endpoint should return for the test to pass. Defaults to 200.

Response Body Assertion

ConvexSmokeTest.ResponseBodyAssertion =

Optional. A string that must be present in the response body for the test to pass.

Example: {"status":"ok"} or simply ok

Leave blank to skip body assertion.

Request Body (JSON)

ConvexSmokeTest.RequestBody =

Optional. A JSON body to send with the request. Only relevant for POST or PUT requests.

Leave blank for GET requests.

Max Retries

ConvexSmokeTest.MaxRetries = 3

The number of times to retry the request if it fails. Useful for allowing a brief warm-up period after deployment. Defaults to 3.

Retry Delay (seconds)

ConvexSmokeTest.RetryDelay = 5

Seconds to wait between retry attempts. Defaults to 5.

Request Timeout (seconds)

ConvexSmokeTest.CurlTimeout = 30

Maximum seconds to wait for each individual HTTP request to complete. Defaults to 30.

Script body

Steps based on this template will execute the following Bash script.

deploymentUrl=$(get_octopusvariable "ConvexSmokeTest.DeploymentUrl")
actionPath=$(get_octopusvariable "ConvexSmokeTest.ActionPath")
expectedStatus=$(get_octopusvariable "ConvexSmokeTest.ExpectedStatusCode")
bodyAssertion=$(get_octopusvariable "ConvexSmokeTest.ResponseBodyAssertion")
httpMethod=$(get_octopusvariable "ConvexSmokeTest.HttpMethod")
requestBody=$(get_octopusvariable "ConvexSmokeTest.RequestBody")
maxRetries=$(get_octopusvariable "ConvexSmokeTest.MaxRetries")
retryDelay=$(get_octopusvariable "ConvexSmokeTest.RetryDelay")
curlTimeout=$(get_octopusvariable "ConvexSmokeTest.CurlTimeout")

if [ -z "$deploymentUrl" ]; then
  echo "ERROR: ConvexSmokeTest.DeploymentUrl is required."
  exit 1
fi

if [ -z "$actionPath" ]; then
  echo "ERROR: ConvexSmokeTest.ActionPath is required."
  exit 1
fi

if [ -z "$expectedStatus" ]; then
  expectedStatus="200"
fi

if [ -z "$httpMethod" ]; then
  httpMethod="GET"
fi

if [ -z "$maxRetries" ]; then
  maxRetries="3"
fi

if [ -z "$retryDelay" ]; then
  retryDelay="5"
fi

if [ -z "$curlTimeout" ]; then
  curlTimeout="30"
fi

deploymentUrl=$(echo "$deploymentUrl" | sed 's|/$||')
actionPath=$(echo "$actionPath" | sed 's|^/||')
targetUrl="${deploymentUrl}/${actionPath}"

echo "Smoke test target: $targetUrl"
echo "Method: $httpMethod | Expected status: $expectedStatus | Max retries: $maxRetries"

attempt=0
success=false

while [ $attempt -lt $maxRetries ]; do
  attempt=$((attempt + 1))
  echo "Attempt $attempt of $maxRetries..."

  curlArgs=(
    -s
    -o /tmp/convex_smoke_body
    -w "%{http_code}"
    -X "$httpMethod"
    --max-time "$curlTimeout"
  )

  if [ -n "$requestBody" ]; then
    curlArgs+=(-H "Content-Type: application/json" -d "$requestBody")
  fi

  actualStatus=$(curl "${curlArgs[@]}" "$targetUrl")
  responseBody=$(cat /tmp/convex_smoke_body)

  echo "Response status: $actualStatus"

  if [ "$actualStatus" != "$expectedStatus" ]; then
    echo "WARNING: Expected status $expectedStatus but got $actualStatus."
    echo "Response body: $responseBody"
    if [ $attempt -lt $maxRetries ]; then
      echo "Retrying in ${retryDelay}s..."
      sleep "$retryDelay"
    fi
    continue
  fi

  if [ -n "$bodyAssertion" ]; then
    if echo "$responseBody" | grep -qF "$bodyAssertion"; then
      echo "Body assertion passed: '$bodyAssertion' found in response."
    else
      echo "WARNING: Body assertion failed. '$bodyAssertion' not found in response."
      echo "Response body: $responseBody"
      if [ $attempt -lt $maxRetries ]; then
        echo "Retrying in ${retryDelay}s..."
        sleep "$retryDelay"
      fi
      continue
    fi
  fi

  success=true
  break
done

if [ "$success" = false ]; then
  echo "ERROR: Smoke test failed after $maxRetries attempt(s). Deployment may be unhealthy."
  exit 1
fi

echo "Smoke test passed. Convex deployment is healthy."

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "e4bb4066-1919-49a4-a6f6-61b1fd97bb1f",
  "Name": "Convex - Smoke Test HTTP Action",
  "Description": "Performs a smoke test against a Convex [HTTP action](https://docs.convex.dev/functions/http-actions) endpoint after a deployment. Validates that the deployment is live and responding correctly by checking the HTTP status code and optionally asserting on the response body.\n\nUse this as a post-deploy verification step to catch failed or partial deployments early.",
  "Version": 1,
  "ExportedAt": "2026-05-29T00:00:00.000Z",
  "ActionType": "Octopus.Script",
  "Author": "itsmebenwalker",
  "Packages": [],
  "Parameters": [
    {
      "Id": "8e928a76-2256-4b34-886f-473bf53a4e21",
      "Name": "ConvexSmokeTest.DeploymentUrl",
      "Label": "Deployment URL",
      "HelpText": "The base URL of your Convex deployment.\n\nExample: `https://happy-animal-123.convex.site`\n\nFind this in your Convex dashboard under **Settings → URL & Deploy Key**.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "8734c4d8-9d6c-4c33-93c8-66608f3c450e",
      "Name": "ConvexSmokeTest.ActionPath",
      "Label": "Action Path",
      "HelpText": "The path to the HTTP action endpoint to test.\n\nExample: `/health` or `/api/ping`\n\nThis is the route registered in your Convex `http.ts` file.",
      "DefaultValue": "/health",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "fc465072-d618-4487-ac00-95b40027d253",
      "Name": "ConvexSmokeTest.HttpMethod",
      "Label": "HTTP Method",
      "HelpText": "The HTTP method to use for the request.",
      "DefaultValue": "GET",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "GET|GET\nPOST|POST\nPUT|PUT\nDELETE|DELETE"
      }
    },
    {
      "Id": "961a2dc5-1bdf-46b7-bb63-08541f20c241",
      "Name": "ConvexSmokeTest.ExpectedStatusCode",
      "Label": "Expected HTTP Status Code",
      "HelpText": "The HTTP status code the endpoint should return for the test to pass. Defaults to `200`.",
      "DefaultValue": "200",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "313c7f55-0291-4591-a941-dab64822b6b2",
      "Name": "ConvexSmokeTest.ResponseBodyAssertion",
      "Label": "Response Body Assertion",
      "HelpText": "Optional. A string that must be present in the response body for the test to pass.\n\nExample: `{\"status\":\"ok\"}` or simply `ok`\n\nLeave blank to skip body assertion.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "e405bd82-b839-4de7-be5b-a6619b637631",
      "Name": "ConvexSmokeTest.RequestBody",
      "Label": "Request Body (JSON)",
      "HelpText": "Optional. A JSON body to send with the request. Only relevant for POST or PUT requests.\n\nLeave blank for GET requests.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "MultiLineText"
      }
    },
    {
      "Id": "2766feca-344e-45c9-b02b-e05b24725837",
      "Name": "ConvexSmokeTest.MaxRetries",
      "Label": "Max Retries",
      "HelpText": "The number of times to retry the request if it fails. Useful for allowing a brief warm-up period after deployment. Defaults to `3`.",
      "DefaultValue": "3",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "5f841ad3-12bd-4ba4-b065-26b15c1e5d71",
      "Name": "ConvexSmokeTest.RetryDelay",
      "Label": "Retry Delay (seconds)",
      "HelpText": "Seconds to wait between retry attempts. Defaults to `5`.",
      "DefaultValue": "5",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "f6063486-b004-4c6a-953d-2dc8190c8635",
      "Name": "ConvexSmokeTest.CurlTimeout",
      "Label": "Request Timeout (seconds)",
      "HelpText": "Maximum seconds to wait for each individual HTTP request to complete. Defaults to `30`.",
      "DefaultValue": "30",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "Bash",
    "Octopus.Action.Script.ScriptBody": "deploymentUrl=$(get_octopusvariable \"ConvexSmokeTest.DeploymentUrl\")\nactionPath=$(get_octopusvariable \"ConvexSmokeTest.ActionPath\")\nexpectedStatus=$(get_octopusvariable \"ConvexSmokeTest.ExpectedStatusCode\")\nbodyAssertion=$(get_octopusvariable \"ConvexSmokeTest.ResponseBodyAssertion\")\nhttpMethod=$(get_octopusvariable \"ConvexSmokeTest.HttpMethod\")\nrequestBody=$(get_octopusvariable \"ConvexSmokeTest.RequestBody\")\nmaxRetries=$(get_octopusvariable \"ConvexSmokeTest.MaxRetries\")\nretryDelay=$(get_octopusvariable \"ConvexSmokeTest.RetryDelay\")\ncurlTimeout=$(get_octopusvariable \"ConvexSmokeTest.CurlTimeout\")\n\nif [ -z \"$deploymentUrl\" ]; then\n  echo \"ERROR: ConvexSmokeTest.DeploymentUrl is required.\"\n  exit 1\nfi\n\nif [ -z \"$actionPath\" ]; then\n  echo \"ERROR: ConvexSmokeTest.ActionPath is required.\"\n  exit 1\nfi\n\nif [ -z \"$expectedStatus\" ]; then\n  expectedStatus=\"200\"\nfi\n\nif [ -z \"$httpMethod\" ]; then\n  httpMethod=\"GET\"\nfi\n\nif [ -z \"$maxRetries\" ]; then\n  maxRetries=\"3\"\nfi\n\nif [ -z \"$retryDelay\" ]; then\n  retryDelay=\"5\"\nfi\n\nif [ -z \"$curlTimeout\" ]; then\n  curlTimeout=\"30\"\nfi\n\ndeploymentUrl=$(echo \"$deploymentUrl\" | sed 's|/$||')\nactionPath=$(echo \"$actionPath\" | sed 's|^/||')\ntargetUrl=\"${deploymentUrl}/${actionPath}\"\n\necho \"Smoke test target: $targetUrl\"\necho \"Method: $httpMethod | Expected status: $expectedStatus | Max retries: $maxRetries\"\n\nattempt=0\nsuccess=false\n\nwhile [ $attempt -lt $maxRetries ]; do\n  attempt=$((attempt + 1))\n  echo \"Attempt $attempt of $maxRetries...\"\n\n  curlArgs=(\n    -s\n    -o /tmp/convex_smoke_body\n    -w \"%{http_code}\"\n    -X \"$httpMethod\"\n    --max-time \"$curlTimeout\"\n  )\n\n  if [ -n \"$requestBody\" ]; then\n    curlArgs+=(-H \"Content-Type: application/json\" -d \"$requestBody\")\n  fi\n\n  actualStatus=$(curl \"${curlArgs[@]}\" \"$targetUrl\")\n  responseBody=$(cat /tmp/convex_smoke_body)\n\n  echo \"Response status: $actualStatus\"\n\n  if [ \"$actualStatus\" != \"$expectedStatus\" ]; then\n    echo \"WARNING: Expected status $expectedStatus but got $actualStatus.\"\n    echo \"Response body: $responseBody\"\n    if [ $attempt -lt $maxRetries ]; then\n      echo \"Retrying in ${retryDelay}s...\"\n      sleep \"$retryDelay\"\n    fi\n    continue\n  fi\n\n  if [ -n \"$bodyAssertion\" ]; then\n    if echo \"$responseBody\" | grep -qF \"$bodyAssertion\"; then\n      echo \"Body assertion passed: '$bodyAssertion' found in response.\"\n    else\n      echo \"WARNING: Body assertion failed. '$bodyAssertion' not found in response.\"\n      echo \"Response body: $responseBody\"\n      if [ $attempt -lt $maxRetries ]; then\n        echo \"Retrying in ${retryDelay}s...\"\n        sleep \"$retryDelay\"\n      fi\n      continue\n    fi\n  fi\n\n  success=true\n  break\ndone\n\nif [ \"$success\" = false ]; then\n  echo \"ERROR: Smoke test failed after $maxRetries attempt(s). Deployment may be unhealthy.\"\n  exit 1\nfi\n\necho \"Smoke test passed. Convex deployment is healthy.\"\n"
  },
  "Category": "Convex",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates/convex-smoke-test-http-action.json",
  "Website": "/step-templates/e4bb4066-1919-49a4-a6f6-61b1fd97bb1f",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Friday, May 29, 2026