CI/CD Integration

Overview

The 4QA server accepts JUnit XML test results via a webhook endpoint and automatically creates execution items on your 4QA - Test Executions board. This lets you feed results from any CI/CD pipeline — GitHub Actions, GitLab CI, Jenkins, CircleCI, or any system that produces JUnit XML — directly into 4QA.

Webhook Endpoint

Send test results to:

POST /webhook/results

Request Format

The request body is JSON with the following fields:

Field Type Description
format string Must be "junit".
buildId string Identifier for the build or pipeline run (e.g. "build-123").
environment string Target environment (e.g. "staging", "production").
xml string The JUnit XML report as a string.

JUnit XML Format

The server parses standard JUnit XML. A minimal example:

<testsuites>
  <testsuite name="Login Tests" tests="3" failures="1">
    <testcase name="Login with valid credentials" time="1.2" />
    <testcase name="Login with invalid password" time="0.8">
      <failure message="Expected 401, got 500">Stack trace...</failure>
    </testcase>
    <testcase name="Login rate limiting" time="0.1">
      <skipped message="Not implemented yet" />
    </testcase>
  </testsuite>
</testsuites>

Curl Example

curl -X POST https://your-server-url/webhook/results \
  -H "Content-Type: application/json" \
  -d '{
    "format": "junit",
    "buildId": "build-123",
    "environment": "staging",
    "xml": "<testsuites>...</testsuites>"
  }'

Response Format

A successful response returns JSON with a summary of what was processed:

{
  "created": 2,
  "skipped": 1,
  "matched": 2,
  "unmatched": ["Some test name that had no match"]
}
Field Description
created Number of execution items created on the board.
skipped Number of test cases that were skipped in the XML.
matched Number of XML test case names that matched existing test cases on the board.
unmatched Array of test case names from the XML that could not be matched to any item on the Test Cases board.

Name Matching

Test case names in the JUnit XML are matched exactly against the item names on your 4QA - Test Cases board. Make sure the name attribute in each <testcase> element matches the test case item name in monday.com. Any unmatched names are returned in the unmatched array so you can correct them.

Health Check

Verify the server is running with:

GET /health

Returns:

{ "status": "ok" }