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" }