[{"data":1,"prerenderedAt":5738},["ShallowReactive",2],{"/blog/streamline-test-management-with-the-smartbear-qmetry-gitlab-component":3,"navigation-en-us":4950,"banner-en-us":5376,"footer-en-us":5386,"blog-post-authors-en-us-Matt Genelin|Matt Bonner":5630,"blog-related-posts-en-us-streamline-test-management-with-the-smartbear-qmetry-gitlab-component":5657,"blog-promotions-en-us":5676,"next-steps-en-us":5728},{"id":4,"title":5,"authors":6,"body":9,"category":4931,"date":4932,"description":4933,"extension":4934,"externalUrl":4935,"faq":4935,"featured":1391,"heroImage":4936,"meta":4937,"navigation":1391,"path":4938,"seo":4939,"slug":4943,"stem":4944,"tags":4945,"template":4948,"updatedDate":4935,"__hash__":4949},"blogPosts/en-us/blog/streamline-test-management-with-the-smartbear-qmetry-gitlab-component.md","Streamline test management with the SmartBear QMetry GitLab component",[7,8],"Matt Genelin","Matt Bonner",{"type":10,"value":11,"toc":4872},"minimark",[12,16,19,22,25,40,43,46,65,68,75,80,83,88,91,94,100,104,107,110,114,117,120,124,127,130,136,140,143,146,152,156,159,162,166,169,212,216,219,252,255,259,262,266,292,296,330,339,343,346,356,359,365,368,372,375,379,405,409,412,477,483,487,490,543,547,552,578,582,585,589,596,606,926,929,985,989,996,1095,1101,1121,1125,1128,1132,1142,1233,1236,1352,1356,1362,1622,1626,1629,1674,1681,1685,1688,1693,1708,1713,2056,2061,2075,2079,2086,2174,2179,2199,2203,2206,2524,2528,2531,2619,2623,2626,2711,2714,2746,2750,2761,2856,2859,2863,2866,2870,2873,2878,2910,2916,2933,2938,3153,3158,3190,3194,3197,3202,3234,3240,3978,3982,3987,4004,4009,4026,4031,4189,4193,4196,4201,4227,4232,4258,4262,4265,4544,4548,4551,4554,4587,4591,4617,4621,4647,4651,4680,4684,4687,4717,4721,4724,4741,4745,4748,4774,4778,4782,4822,4826,4831,4847,4852,4868],[13,14,15],"p",{},"In modern software development, test management and continuous integration are two sides of the same coin. DevSecOps teams need seamless integration between their CI/CD pipelines and test management platforms to maintain visibility, traceability, and compliance across the software development lifecycle.",[13,17,18],{},"This becomes even more important as testing scales across automated pipelines, where execution data is spread across tools and harder to track in one place.",[13,20,21],{},"For organizations using GitLab for CI/CD and SmartBear QMetry for test management, manually uploading test results creates friction, delays feedback loops, and makes it harder to maintain a reliable, centralized view of testing.",[13,23,24],{},"What if you could automatically publish your JUnit, TestNG, or other test results directly from your GitLab pipeline to QMetry with just a few lines of configuration?",[13,26,27,28,32,33,39],{},"That's exactly what the new ",[29,30,31],"strong",{},"QMetry GitLab Component"," enables. This reusable CI/CD component, now available in the ",[34,35,38],"a",{"href":36,"rel":37},"https://gitlab.com/explore/catalog",[],"GitLab CI/CD Catalog",", eliminates the manual overhead of test result management by automatically uploading test execution data to QMetry.  This is an AI-enabled, enterprise-grade test management platform that brings together test planning, execution, tracking, and reporting in one place.",[13,41,42],{},"As a centralized system of record for testing, QMetry helps teams understand coverage, track execution, and make more reliable release decisions.",[13,44,45],{},"In this guide, you'll learn:",[47,48,49,53,56,59,62],"ul",{},[50,51,52],"li",{},"How to set up the QMetry GitLab Component in your pipeline",[50,54,55],{},"How to configure automated test result uploads",[50,57,58],{},"Advanced configuration options for enterprise requirements",[50,60,61],{},"A real-world aerospace industry use case",[50,63,64],{},"Best practices for test management automation",[13,66,67],{},"By the end of this article, your GitLab pipelines will automatically feed test results into QMetry, giving your QA teams instant visibility into test execution and helping them make faster, more confident release decisions.",[13,69,70],{},[71,72],"img",{"alt":73,"src":74},"SmartBear QMetry GitLab integration","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775488045/ojt707rzxnm2yr3vqxdh.png",[76,77,79],"h2",{"id":78},"why-integrate-gitlab-with-qmetry","Why integrate GitLab with QMetry?",[13,81,82],{},"Before diving into the technical implementation, let's understand the value this integration delivers:",[84,85,87],"h3",{"id":86},"eliminate-manual-test-result-uploads","Eliminate manual test result uploads",[13,89,90],{},"DevSecOps engineers and QA teams no longer need to manually export test results from CI/CD runs and import them into test management systems. The component handles this automatically after every pipeline execution.",[13,92,93],{},"This reduces manual effort while ensuring test data stays consistent, up to date, and easy to access across teams.",[13,95,96],{},[71,97],{"alt":98,"src":99},"Test results with SmartBear QMetry GitLab integration","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775488045/ajx64sihup2nursdpnxz.png",[84,101,103],{"id":102},"enable-end-to-end-traceability","Enable end-to-end traceability",[13,105,106],{},"By connecting GitLab's CI/CD execution data with QMetry's test management capabilities, teams gain complete traceability from requirements through test cases to actual test execution results. This is critical for regulated industries like financial services, aerospace, medical devices, and automotive, where audit trails are mandatory and regulatory compliance depends on demonstrating complete test coverage.",[13,108,109],{},"It also gives teams a clearer view of coverage and risk across releases, making it easier to understand what’s been tested and what still needs attention.",[84,111,113],{"id":112},"accelerate-feedback-loops","Accelerate feedback loops",[13,115,116],{},"Automated test result uploads mean QA teams, product managers, and stakeholders see test execution results immediately after pipeline completion – no waiting for manual data entry or report generation.",[13,118,119],{},"With faster access to results, teams can act immediately, reduce delays, and make quicker, more informed release decisions.",[84,121,123],{"id":122},"support-compliance-and-audit-requirements","Support compliance and audit requirements",[13,125,126],{},"For organizations in regulated industries, maintaining comprehensive test records with proper versioning and traceability is non-negotiable. This integration ensures you can document every test execution properly in QMetry with links back to the specific GitLab pipeline, commit, and build.",[13,128,129],{},"This creates an audit-ready record of testing activity without adding manual overhead.",[13,131,132],{},[71,133],{"alt":134,"src":135},"Audit-ready record of testing with SmartBear QMetry GitLab integration","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775488045/q2tbaw5otgdywjkcquqx.png",[84,137,139],{"id":138},"leverage-ai-powered-test-insights","Leverage AI-powered test insights",[13,141,142],{},"QMetry uses AI to analyze test execution patterns, identify flaky tests, predict test failures, and recommend optimization opportunities. Feeding it real-time data from GitLab pipelines maximizes the value of these AI capabilities.",[13,144,145],{},"With continuous data flowing in, teams get more accurate insights and can focus their efforts where it matters most.",[13,147,148],{},[71,149],{"alt":150,"src":151},"Accurage insights with SmartBear QMetry GitLab integration","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775488045/pl7ru4wx8ixnheedfyrs.png",[76,153,155],{"id":154},"about-the-gitlab-and-smartbear-partnership","About the GitLab and SmartBear partnership",[13,157,158],{},"This component represents a growing partnership between GitLab and SmartBear to better connect CI/CD execution with test management in a single workflow. SmartBear brings deep expertise in testing, API management, and quality automation, while GitLab provides the most comprehensive AI-powered DevSecOps platform. Together, they help teams streamline how testing fits into the development lifecycle while maintaining the quality, security, and compliance standards their industries require.",[13,160,161],{},"Whether you're managing test execution for aerospace flight control systems, financial services platforms, automotive safety applications, or medical device software, the combination of GitLab's CI/CD capabilities and QMetry's test management gives teams a centralized, reliable view of testing across the lifecycle, helping them track execution, maintain traceability, and make more confident release decisions.",[76,163,165],{"id":164},"what-youll-need","What you'll need",[13,167,168],{},"Before getting started, ensure you have:",[47,170,171,177,183,189,195,206],{},[50,172,173,176],{},[29,174,175],{},"A GitLab account"," with a project containing automated tests that generate test result files (JUnit XML, TestNG XML, etc.)",[50,178,179,182],{},[29,180,181],{},"QMetry Test Management Enterprise"," account with API access enabled",[50,184,185,188],{},[29,186,187],{},"QMetry API Key"," generated  from your QMetry instance (we'll cover this shortly)",[50,190,191,194],{},[29,192,193],{},"QMetry Project"," already created where you will upload test results",[50,196,197,200,201,205],{},[29,198,199],{},"Familiarity with GitLab CI/CD",", including understanding of basic ",[202,203,204],"code",{},".gitlab-ci.yml"," syntax and pipeline concepts",[50,207,208,211],{},[29,209,210],{},"Test suite configuration"," in QMetry (optional but recommended for better organization)",[84,213,215],{"id":214},"understanding-the-test-result-flow","Understanding the test result flow",[13,217,218],{},"Here's what happens when you integrate this component:",[220,221,222,228,234,240,246],"ol",{},[50,223,224,227],{},[29,225,226],{},"Test execution",": Your GitLab CI/CD pipeline runs automated tests (unit tests, integration tests, E2E tests, etc.).",[50,229,230,233],{},[29,231,232],{},"Result generation",": Tests produce output files in formats like JUnit XML, TestNG XML, or other supported formats.",[50,235,236,239],{},[29,237,238],{},"Component invocation",": The QMetry component executes as a job in your pipeline.",[50,241,242,245],{},[29,243,244],{},"Automatic upload",": The component reads your test result files and uploads them to QMetry via API.",[50,247,248,251],{},[29,249,250],{},"QMetry processing",": QMetry receives the results, processes them, and makes them available for reporting and analysis.",[13,253,254],{},"The beauty of this integration is that it happens automatically, with no manual intervention required once configured.",[76,256,258],{"id":257},"part-1-getting-your-qmetry-api-credentials","Part 1: Getting your QMetry API credentials",[13,260,261],{},"Before configuring the GitLab component, you need to obtain API access credentials from your QMetry instance. Here are the steps to follow:",[84,263,265],{"id":264},"_1-access-qmetry-settings","1. Access QMetry settings",[220,267,268,274,281],{},[50,269,270,271,273],{},"Log in to your ",[29,272,181],{}," instance.",[50,275,276,277,280],{},"Navigate to your ",[29,278,279],{},"user profile"," (typically in the top-right corner).",[50,282,283,284,287,288,291],{},"Select ",[29,285,286],{},"Settings"," or ",[29,289,290],{},"API Access"," from the dropdown menu.",[84,293,295],{"id":294},"_2-generate-an-api-key","2. Generate an API key",[220,297,298,304,311,318,324],{},[50,299,300,301],{},"In the API Access section, click ",[29,302,303],{},"Generate New API Key.",[50,305,306,307,310],{},"Provide a descriptive ",[29,308,309],{},"name"," for the key (e.g., \"GitLab CI/CD Integration\").",[50,312,313,314,317],{},"Set appropriate ",[29,315,316],{},"permissions",". The key needs write access to upload test results.",[50,319,320,321],{},"Click ",[29,322,323],{},"Generate.",[50,325,326,329],{},[29,327,328],{},"Copy the API key immediately"," as it will only be displayed once.",[13,331,332,335,336,338],{},[29,333,334],{},"Important security note",": Treat your API key like a password. Never commit it directly to your ",[202,337,204],{}," file or store it in plain text. We'll use GitLab CI/CD variables to store it securely.",[84,340,342],{"id":341},"_3-note-your-qmetry-instance-url","3. Note your QMetry instance URL",[13,344,345],{},"You'll also need your QMetry instance URL, which typically follows this format:",[347,348,354],"pre",{"className":349,"code":351,"language":352,"meta":353},[350],"language-text","https://your-company.qmetry.com\n","text","",[202,355,351],{"__ignoreMap":353},[13,357,358],{},"or, for self-hosted instances:",[347,360,363],{"className":361,"code":362,"language":352,"meta":353},[350],"https://qmetry.your-company.com\n",[202,364,362],{"__ignoreMap":353},[13,366,367],{},"Make note of this URL because you'll need it in the next section.",[76,369,371],{"id":370},"part-2-configuring-gitlab-cicd-variables","Part 2: Configuring GitLab CI/CD variables",[13,373,374],{},"Now that you have your QMetry credentials, let's store them securely in GitLab. Here are the next steps to follow:",[84,376,378],{"id":377},"_4-navigate-to-cicd-settings","4. Navigate to CI/CD settings",[220,380,381,387,393,400],{},[50,382,383,384],{},"Open your ",[29,385,386],{},"GitLab project.",[50,388,389,390],{},"In the left sidebar, navigate to ",[29,391,392],{},"Settings > CI/CD.",[50,394,395,396,399],{},"Expand the ",[29,397,398],{},"Variables"," section.",[50,401,320,402],{},[29,403,404],{},"Add variable.",[84,406,408],{"id":407},"_5-add-the-qmetry-api-key","5. Add the QMetry API key",[13,410,411],{},"Configure the API key variable:",[413,414,415,428],"table",{},[416,417,418],"thead",{},[419,420,421,425],"tr",{},[422,423,424],"th",{},"Field",[422,426,427],{},"Value",[429,430,431,444,453,463],"tbody",{},[419,432,433,439],{},[434,435,436],"td",{},[29,437,438],{},"Key",[434,440,441],{},[202,442,443],{},"QMETRY_API_KEY",[419,445,446,450],{},[434,447,448],{},[29,449,427],{},[434,451,452],{},"Your QMetry API key from Step 2",[419,454,455,460],{},[434,456,457],{},[29,458,459],{},"Type",[434,461,462],{},"Variable",[419,464,465,470],{},[434,466,467],{},[29,468,469],{},"Flags",[434,471,472,473,476],{},"✅ Mask variable",[474,475],"br",{},"✅ Protect variable (recommended)",[13,478,320,479,482],{},[29,480,481],{},"Add variable"," to save.",[84,484,486],{"id":485},"_6-add-the-qmetry-instance-url","6. Add the QMetry instance URL",[13,488,489],{},"Add a second variable for your instance URL:",[413,491,492,500],{},[416,493,494],{},[419,495,496,498],{},[422,497,424],{},[422,499,427],{},[429,501,502,513,526,534],{},[419,503,504,508],{},[434,505,506],{},[29,507,438],{},[434,509,510],{},[202,511,512],{},"INSTANCE_URL",[419,514,515,519],{},[434,516,517],{},[29,518,427],{},[434,520,521,522,525],{},"Your QMetry instance URL (e.g., ",[202,523,524],{},"https://your-company.qmetry.com",")",[419,527,528,532],{},[434,529,530],{},[29,531,459],{},[434,533,462],{},[419,535,536,540],{},[434,537,538],{},[29,539,469],{},[434,541,542],{},"(optional: Protect variable)",[13,544,320,545,482],{},[29,546,481],{},[13,548,549],{},[29,550,551],{},"Why use CI/CD variables?",[47,553,554,560,566,572],{},[50,555,556,559],{},[29,557,558],{},"Security",": Masked variables are hidden in job logs.",[50,561,562,565],{},[29,563,564],{},"Reusability",": You can use the same credentials across multiple pipelines.",[50,567,568,571],{},[29,569,570],{},"Flexibility",": It is easy to rotate credentials without modifying pipeline code.",[50,573,574,577],{},[29,575,576],{},"Access control",": Protected variables are only available on protected branches.",[76,579,581],{"id":580},"part-3-understanding-your-test-result-files","Part 3: Understanding your test result files",[13,583,584],{},"Before integrating the component, ensure your tests generate output files that QMetry can process. Here are the next steps to follow:",[84,586,588],{"id":587},"_7-verify-test-output-format","7. Verify test output format",[13,590,591,592,595],{},"The QMetry component supports multiple test result formats. The most common is ",[29,593,594],{},"JUnit XML",", which most testing frameworks can generate:",[13,597,598,601,602,605],{},[29,599,600],{},"Example JUnit XML output"," (",[202,603,604],{},"results.xml","):",[347,607,611],{"className":608,"code":609,"language":610,"meta":353,"style":353},"language-xml shiki shiki-themes github-light","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Ctestsuites>\n  \u003Ctestsuite name=\"Flight Control System Tests\" tests=\"15\" failures=\"1\" errors=\"0\" time=\"45.231\">\n    \u003Ctestcase classname=\"FlightControlTests\" name=\"testAltitudeHold\" time=\"2.341\">\n      \u003Csystem-out>Altitude hold engaged at 10,000 feet\u003C/system-out>\n    \u003C/testcase>\n    \u003Ctestcase classname=\"FlightControlTests\" name=\"testAutopilotEngagement\" time=\"3.125\">\n      \u003Csystem-out>Autopilot engaged successfully\u003C/system-out>\n    \u003C/testcase>\n    \u003Ctestcase classname=\"FlightControlTests\" name=\"testEmergencyLanding\" time=\"5.892\">\n      \u003Cfailure message=\"Landing gear failed to deploy\">\n        Expected: Landing gear deployed\n        Actual: Landing gear malfunction detected\n      \u003C/failure>\n    \u003C/testcase>\n    \u003C!-- Additional test cases... -->\n  \u003C/testsuite>\n\u003C/testsuites>\n","xml",[202,612,613,647,659,710,743,759,769,798,812,821,850,868,874,880,890,899,906,916],{"__ignoreMap":353},[614,615,618,622,625,629,632,636,639,641,644],"span",{"class":616,"line":617},"line",1,[614,619,621],{"class":620},"sgsFI","\u003C?",[614,623,610],{"class":624},"shJU0",[614,626,628],{"class":627},"s7eDp"," version",[614,630,631],{"class":620},"=",[614,633,635],{"class":634},"sYBdl","\"1.0\"",[614,637,638],{"class":627}," encoding",[614,640,631],{"class":620},[614,642,643],{"class":634},"\"UTF-8\"",[614,645,646],{"class":620},"?>\n",[614,648,650,653,656],{"class":616,"line":649},2,[614,651,652],{"class":620},"\u003C",[614,654,655],{"class":624},"testsuites",[614,657,658],{"class":620},">\n",[614,660,662,665,668,671,673,676,679,681,684,687,689,692,695,697,700,703,705,708],{"class":616,"line":661},3,[614,663,664],{"class":620},"  \u003C",[614,666,667],{"class":624},"testsuite",[614,669,670],{"class":627}," name",[614,672,631],{"class":620},[614,674,675],{"class":634},"\"Flight Control System Tests\"",[614,677,678],{"class":627}," tests",[614,680,631],{"class":620},[614,682,683],{"class":634},"\"15\"",[614,685,686],{"class":627}," failures",[614,688,631],{"class":620},[614,690,691],{"class":634},"\"1\"",[614,693,694],{"class":627}," errors",[614,696,631],{"class":620},[614,698,699],{"class":634},"\"0\"",[614,701,702],{"class":627}," time",[614,704,631],{"class":620},[614,706,707],{"class":634},"\"45.231\"",[614,709,658],{"class":620},[614,711,713,716,719,722,724,727,729,731,734,736,738,741],{"class":616,"line":712},4,[614,714,715],{"class":620},"    \u003C",[614,717,718],{"class":624},"testcase",[614,720,721],{"class":627}," classname",[614,723,631],{"class":620},[614,725,726],{"class":634},"\"FlightControlTests\"",[614,728,670],{"class":627},[614,730,631],{"class":620},[614,732,733],{"class":634},"\"testAltitudeHold\"",[614,735,702],{"class":627},[614,737,631],{"class":620},[614,739,740],{"class":634},"\"2.341\"",[614,742,658],{"class":620},[614,744,746,749,752,755,757],{"class":616,"line":745},5,[614,747,748],{"class":620},"      \u003C",[614,750,751],{"class":624},"system-out",[614,753,754],{"class":620},">Altitude hold engaged at 10,000 feet\u003C/",[614,756,751],{"class":624},[614,758,658],{"class":620},[614,760,762,765,767],{"class":616,"line":761},6,[614,763,764],{"class":620},"    \u003C/",[614,766,718],{"class":624},[614,768,658],{"class":620},[614,770,772,774,776,778,780,782,784,786,789,791,793,796],{"class":616,"line":771},7,[614,773,715],{"class":620},[614,775,718],{"class":624},[614,777,721],{"class":627},[614,779,631],{"class":620},[614,781,726],{"class":634},[614,783,670],{"class":627},[614,785,631],{"class":620},[614,787,788],{"class":634},"\"testAutopilotEngagement\"",[614,790,702],{"class":627},[614,792,631],{"class":620},[614,794,795],{"class":634},"\"3.125\"",[614,797,658],{"class":620},[614,799,801,803,805,808,810],{"class":616,"line":800},8,[614,802,748],{"class":620},[614,804,751],{"class":624},[614,806,807],{"class":620},">Autopilot engaged successfully\u003C/",[614,809,751],{"class":624},[614,811,658],{"class":620},[614,813,815,817,819],{"class":616,"line":814},9,[614,816,764],{"class":620},[614,818,718],{"class":624},[614,820,658],{"class":620},[614,822,824,826,828,830,832,834,836,838,841,843,845,848],{"class":616,"line":823},10,[614,825,715],{"class":620},[614,827,718],{"class":624},[614,829,721],{"class":627},[614,831,631],{"class":620},[614,833,726],{"class":634},[614,835,670],{"class":627},[614,837,631],{"class":620},[614,839,840],{"class":634},"\"testEmergencyLanding\"",[614,842,702],{"class":627},[614,844,631],{"class":620},[614,846,847],{"class":634},"\"5.892\"",[614,849,658],{"class":620},[614,851,853,855,858,861,863,866],{"class":616,"line":852},11,[614,854,748],{"class":620},[614,856,857],{"class":624},"failure",[614,859,860],{"class":627}," message",[614,862,631],{"class":620},[614,864,865],{"class":634},"\"Landing gear failed to deploy\"",[614,867,658],{"class":620},[614,869,871],{"class":616,"line":870},12,[614,872,873],{"class":620},"        Expected: Landing gear deployed\n",[614,875,877],{"class":616,"line":876},13,[614,878,879],{"class":620},"        Actual: Landing gear malfunction detected\n",[614,881,883,886,888],{"class":616,"line":882},14,[614,884,885],{"class":620},"      \u003C/",[614,887,857],{"class":624},[614,889,658],{"class":620},[614,891,893,895,897],{"class":616,"line":892},15,[614,894,764],{"class":620},[614,896,718],{"class":624},[614,898,658],{"class":620},[614,900,902],{"class":616,"line":901},16,[614,903,905],{"class":904},"sAwPA","    \u003C!-- Additional test cases... -->\n",[614,907,909,912,914],{"class":616,"line":908},17,[614,910,911],{"class":620},"  \u003C/",[614,913,667],{"class":624},[614,915,658],{"class":620},[614,917,919,922,924],{"class":616,"line":918},18,[614,920,921],{"class":620},"\u003C/",[614,923,655],{"class":624},[614,925,658],{"class":620},[13,927,928],{},"Most testing frameworks generate this format automatically:",[47,930,931,937,947,957,966,976],{},[50,932,933,936],{},[29,934,935],{},"JUnit"," (Java): Native format",[50,938,939,942,943,946],{},[29,940,941],{},"pytest"," (Python): Use ",[202,944,945],{},"--junitxml=results.xml"," flag",[50,948,949,952,953,956],{},[29,950,951],{},"Jest"," (JavaScript): Use ",[202,954,955],{},"jest-junit"," reporter",[50,958,959,962,963],{},[29,960,961],{},"RSpec"," (Ruby): Use ",[202,964,965],{},"rspec_junit_formatter",[50,967,968,971,972,975],{},[29,969,970],{},"NUnit"," (.NET): Use ",[202,973,974],{},"nunit-console"," with XML output",[50,977,978,981,982],{},[29,979,980],{},"Go test",": Use ",[202,983,984],{},"go-junit-report",[84,986,988],{"id":987},"_8-confirm-test-artifact-configuration","8. Confirm test artifact configuration",[13,990,991,992,995],{},"Ensure your existing pipeline saves test results as ",[29,993,994],{},"artifacts",". This allows the QMetry component to access them:",[347,997,1001],{"className":998,"code":999,"language":1000,"meta":353,"style":353},"language-yaml shiki shiki-themes github-light","test:\n  stage: test\n  script:\n    - npm install\n    - npm test -- --reporter=junit --reporter-options=output=results.xml\n  artifacts:\n    reports:\n      junit: results.xml\n    paths:\n      - results.xml\n    when: always  # Upload even if tests fail\n","yaml",[202,1002,1003,1011,1022,1029,1037,1044,1051,1058,1068,1075,1082],{"__ignoreMap":353},[614,1004,1005,1008],{"class":616,"line":617},[614,1006,1007],{"class":624},"test",[614,1009,1010],{"class":620},":\n",[614,1012,1013,1016,1019],{"class":616,"line":649},[614,1014,1015],{"class":624},"  stage",[614,1017,1018],{"class":620},": ",[614,1020,1021],{"class":634},"test\n",[614,1023,1024,1027],{"class":616,"line":661},[614,1025,1026],{"class":624},"  script",[614,1028,1010],{"class":620},[614,1030,1031,1034],{"class":616,"line":712},[614,1032,1033],{"class":620},"    - ",[614,1035,1036],{"class":634},"npm install\n",[614,1038,1039,1041],{"class":616,"line":745},[614,1040,1033],{"class":620},[614,1042,1043],{"class":634},"npm test -- --reporter=junit --reporter-options=output=results.xml\n",[614,1045,1046,1049],{"class":616,"line":761},[614,1047,1048],{"class":624},"  artifacts",[614,1050,1010],{"class":620},[614,1052,1053,1056],{"class":616,"line":771},[614,1054,1055],{"class":624},"    reports",[614,1057,1010],{"class":620},[614,1059,1060,1063,1065],{"class":616,"line":800},[614,1061,1062],{"class":624},"      junit",[614,1064,1018],{"class":620},[614,1066,1067],{"class":634},"results.xml\n",[614,1069,1070,1073],{"class":616,"line":814},[614,1071,1072],{"class":624},"    paths",[614,1074,1010],{"class":620},[614,1076,1077,1080],{"class":616,"line":823},[614,1078,1079],{"class":620},"      - ",[614,1081,1067],{"class":634},[614,1083,1084,1087,1089,1092],{"class":616,"line":852},[614,1085,1086],{"class":624},"    when",[614,1088,1018],{"class":620},[614,1090,1091],{"class":634},"always",[614,1093,1094],{"class":904},"  # Upload even if tests fail\n",[13,1096,1097,1100],{},[29,1098,1099],{},"Key points",":",[47,1102,1103,1109,1115],{},[50,1104,1105,1108],{},[202,1106,1107],{},"artifacts.reports.junit"," makes results visible in GitLab's test report UI.",[50,1110,1111,1114],{},[202,1112,1113],{},"artifacts.paths"," ensures the file is available to downstream jobs.",[50,1116,1117,1120],{},[202,1118,1119],{},"when: always"," ensures results upload even if tests fail.",[76,1122,1124],{"id":1123},"part-4-integrating-the-qmetry-component","Part 4: Integrating the QMetry component",[13,1126,1127],{},"Now for the main event – adding the QMetry component to your pipeline. Here are the next steps to follow:",[84,1129,1131],{"id":1130},"_9-basic-component-integration","9. Basic component integration",[13,1133,1134,1135,1137,1138,1141],{},"Add the component to your ",[202,1136,204],{}," file. The component should run ",[29,1139,1140],{},"after"," your tests complete:",[347,1143,1145],{"className":998,"code":1144,"language":1000,"meta":353,"style":353},"include:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      project: \"Aerospace Flight Control System\"\n      file_name: \"results.xml\"\n      testing_type: \"JUNIT\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,1146,1147,1154,1167,1174,1183,1193,1203,1213,1223],{"__ignoreMap":353},[614,1148,1149,1152],{"class":616,"line":617},[614,1150,1151],{"class":624},"include",[614,1153,1010],{"class":620},[614,1155,1156,1159,1162,1164],{"class":616,"line":649},[614,1157,1158],{"class":620},"  - ",[614,1160,1161],{"class":624},"component",[614,1163,1018],{"class":620},[614,1165,1166],{"class":634},"gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n",[614,1168,1169,1172],{"class":616,"line":661},[614,1170,1171],{"class":624},"    inputs",[614,1173,1010],{"class":620},[614,1175,1176,1179,1181],{"class":616,"line":712},[614,1177,1178],{"class":624},"      stage",[614,1180,1018],{"class":620},[614,1182,1021],{"class":634},[614,1184,1185,1188,1190],{"class":616,"line":745},[614,1186,1187],{"class":624},"      project",[614,1189,1018],{"class":620},[614,1191,1192],{"class":634},"\"Aerospace Flight Control System\"\n",[614,1194,1195,1198,1200],{"class":616,"line":761},[614,1196,1197],{"class":624},"      file_name",[614,1199,1018],{"class":620},[614,1201,1202],{"class":634},"\"results.xml\"\n",[614,1204,1205,1208,1210],{"class":616,"line":771},[614,1206,1207],{"class":624},"      testing_type",[614,1209,1018],{"class":620},[614,1211,1212],{"class":634},"\"JUNIT\"\n",[614,1214,1215,1218,1220],{"class":616,"line":800},[614,1216,1217],{"class":624},"      instance_url",[614,1219,1018],{"class":620},[614,1221,1222],{"class":634},"${INSTANCE_URL}\n",[614,1224,1225,1228,1230],{"class":616,"line":814},[614,1226,1227],{"class":624},"      api_key",[614,1229,1018],{"class":620},[614,1231,1232],{"class":634},"${QMETRY_API_KEY}\n",[13,1234,1235],{},"Let's break down each input parameter:",[413,1237,1238,1251],{},[416,1239,1240],{},[419,1241,1242,1245,1248],{},[422,1243,1244],{},"Parameter",[422,1246,1247],{},"Description",[422,1249,1250],{},"Example",[429,1252,1253,1267,1282,1297,1321,1337],{},[419,1254,1255,1260,1263],{},[434,1256,1257],{},[202,1258,1259],{},"stage",[434,1261,1262],{},"Which CI/CD stage runs the upload job",[434,1264,1265],{},[202,1266,1007],{},[419,1268,1269,1274,1277],{},[434,1270,1271],{},[202,1272,1273],{},"project",[434,1275,1276],{},"Your QMetry project name or key",[434,1278,1279],{},[202,1280,1281],{},"\"Aerospace Flight Control System\"",[419,1283,1284,1289,1292],{},[434,1285,1286],{},[202,1287,1288],{},"file_name",[434,1290,1291],{},"Path to your test results file",[434,1293,1294],{},[202,1295,1296],{},"\"results.xml\"",[419,1298,1299,1304,1307],{},[434,1300,1301],{},[202,1302,1303],{},"testing_type",[434,1305,1306],{},"Format of your test results",[434,1308,1309,1312,1313,1316,1317,1320],{},[202,1310,1311],{},"\"JUNIT\""," (also supports: ",[202,1314,1315],{},"TESTNG",", ",[202,1318,1319],{},"NUNIT",", etc.)",[419,1322,1323,1328,1331],{},[434,1324,1325],{},[202,1326,1327],{},"instance_url",[434,1329,1330],{},"Your QMetry instance URL",[434,1332,1333,1336],{},[202,1334,1335],{},"${INSTANCE_URL}"," (from CI/CD variables)",[419,1338,1339,1344,1347],{},[434,1340,1341],{},[202,1342,1343],{},"api_key",[434,1345,1346],{},"QMetry API key for authentication",[434,1348,1349,1336],{},[202,1350,1351],{},"${QMETRY_API_KEY}",[84,1353,1355],{"id":1354},"_10-complete-pipeline-example","10. Complete pipeline example",[13,1357,1358,1359,1361],{},"Here's a complete ",[202,1360,204],{}," example showing test execution followed by QMetry upload:",[347,1363,1365],{"className":998,"code":1364,"language":1000,"meta":353,"style":353},"stages:\n  - test\n  - report\n\nvariables:\n  # Your app-specific variables\n  NODE_VERSION: \"18\"\n\n# Run your automated tests\nunit-tests:\n  stage: test\n  image: node:${NODE_VERSION}\n  script:\n    - npm ci\n    - npm run test:unit -- --reporter=junit --reporter-options=output=results.xml\n  artifacts:\n    reports:\n      junit: results.xml\n    paths:\n      - results.xml\n    when: always\n  tags:\n    - docker\n\n# Upload results to QMetry\ninclude:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test  # Runs in same stage as tests\n      project: \"Aerospace Flight Control System\"\n      file_name: \"results.xml\"\n      testing_type: \"JUNIT\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,1366,1367,1374,1380,1387,1393,1400,1405,1415,1419,1424,1431,1439,1449,1455,1462,1469,1475,1481,1489,1496,1503,1513,1521,1529,1534,1540,1547,1558,1565,1577,1586,1595,1604,1613],{"__ignoreMap":353},[614,1368,1369,1372],{"class":616,"line":617},[614,1370,1371],{"class":624},"stages",[614,1373,1010],{"class":620},[614,1375,1376,1378],{"class":616,"line":649},[614,1377,1158],{"class":620},[614,1379,1021],{"class":634},[614,1381,1382,1384],{"class":616,"line":661},[614,1383,1158],{"class":620},[614,1385,1386],{"class":634},"report\n",[614,1388,1389],{"class":616,"line":712},[614,1390,1392],{"emptyLinePlaceholder":1391},true,"\n",[614,1394,1395,1398],{"class":616,"line":745},[614,1396,1397],{"class":624},"variables",[614,1399,1010],{"class":620},[614,1401,1402],{"class":616,"line":761},[614,1403,1404],{"class":904},"  # Your app-specific variables\n",[614,1406,1407,1410,1412],{"class":616,"line":771},[614,1408,1409],{"class":624},"  NODE_VERSION",[614,1411,1018],{"class":620},[614,1413,1414],{"class":634},"\"18\"\n",[614,1416,1417],{"class":616,"line":800},[614,1418,1392],{"emptyLinePlaceholder":1391},[614,1420,1421],{"class":616,"line":814},[614,1422,1423],{"class":904},"# Run your automated tests\n",[614,1425,1426,1429],{"class":616,"line":823},[614,1427,1428],{"class":624},"unit-tests",[614,1430,1010],{"class":620},[614,1432,1433,1435,1437],{"class":616,"line":852},[614,1434,1015],{"class":624},[614,1436,1018],{"class":620},[614,1438,1021],{"class":634},[614,1440,1441,1444,1446],{"class":616,"line":870},[614,1442,1443],{"class":624},"  image",[614,1445,1018],{"class":620},[614,1447,1448],{"class":634},"node:${NODE_VERSION}\n",[614,1450,1451,1453],{"class":616,"line":876},[614,1452,1026],{"class":624},[614,1454,1010],{"class":620},[614,1456,1457,1459],{"class":616,"line":882},[614,1458,1033],{"class":620},[614,1460,1461],{"class":634},"npm ci\n",[614,1463,1464,1466],{"class":616,"line":892},[614,1465,1033],{"class":620},[614,1467,1468],{"class":634},"npm run test:unit -- --reporter=junit --reporter-options=output=results.xml\n",[614,1470,1471,1473],{"class":616,"line":901},[614,1472,1048],{"class":624},[614,1474,1010],{"class":620},[614,1476,1477,1479],{"class":616,"line":908},[614,1478,1055],{"class":624},[614,1480,1010],{"class":620},[614,1482,1483,1485,1487],{"class":616,"line":918},[614,1484,1062],{"class":624},[614,1486,1018],{"class":620},[614,1488,1067],{"class":634},[614,1490,1492,1494],{"class":616,"line":1491},19,[614,1493,1072],{"class":624},[614,1495,1010],{"class":620},[614,1497,1499,1501],{"class":616,"line":1498},20,[614,1500,1079],{"class":620},[614,1502,1067],{"class":634},[614,1504,1506,1508,1510],{"class":616,"line":1505},21,[614,1507,1086],{"class":624},[614,1509,1018],{"class":620},[614,1511,1512],{"class":634},"always\n",[614,1514,1516,1519],{"class":616,"line":1515},22,[614,1517,1518],{"class":624},"  tags",[614,1520,1010],{"class":620},[614,1522,1524,1526],{"class":616,"line":1523},23,[614,1525,1033],{"class":620},[614,1527,1528],{"class":634},"docker\n",[614,1530,1532],{"class":616,"line":1531},24,[614,1533,1392],{"emptyLinePlaceholder":1391},[614,1535,1537],{"class":616,"line":1536},25,[614,1538,1539],{"class":904},"# Upload results to QMetry\n",[614,1541,1543,1545],{"class":616,"line":1542},26,[614,1544,1151],{"class":624},[614,1546,1010],{"class":620},[614,1548,1550,1552,1554,1556],{"class":616,"line":1549},27,[614,1551,1158],{"class":620},[614,1553,1161],{"class":624},[614,1555,1018],{"class":620},[614,1557,1166],{"class":634},[614,1559,1561,1563],{"class":616,"line":1560},28,[614,1562,1171],{"class":624},[614,1564,1010],{"class":620},[614,1566,1568,1570,1572,1574],{"class":616,"line":1567},29,[614,1569,1178],{"class":624},[614,1571,1018],{"class":620},[614,1573,1007],{"class":634},[614,1575,1576],{"class":904},"  # Runs in same stage as tests\n",[614,1578,1580,1582,1584],{"class":616,"line":1579},30,[614,1581,1187],{"class":624},[614,1583,1018],{"class":620},[614,1585,1192],{"class":634},[614,1587,1589,1591,1593],{"class":616,"line":1588},31,[614,1590,1197],{"class":624},[614,1592,1018],{"class":620},[614,1594,1202],{"class":634},[614,1596,1598,1600,1602],{"class":616,"line":1597},32,[614,1599,1207],{"class":624},[614,1601,1018],{"class":620},[614,1603,1212],{"class":634},[614,1605,1607,1609,1611],{"class":616,"line":1606},33,[614,1608,1217],{"class":624},[614,1610,1018],{"class":620},[614,1612,1222],{"class":634},[614,1614,1616,1618,1620],{"class":616,"line":1615},34,[614,1617,1227],{"class":624},[614,1619,1018],{"class":620},[614,1621,1232],{"class":634},[84,1623,1625],{"id":1624},"_11-run-your-pipeline","11. Run your pipeline",[13,1627,1628],{},"Commit and push your changes:",[347,1630,1634],{"className":1631,"code":1632,"language":1633,"meta":353,"style":353},"language-shell shiki shiki-themes github-light","git add .gitlab-ci.yml\ngit commit -m \"Add QMetry test result integration\"\ngit push origin main\n","shell",[202,1635,1636,1647,1661],{"__ignoreMap":353},[614,1637,1638,1641,1644],{"class":616,"line":617},[614,1639,1640],{"class":627},"git",[614,1642,1643],{"class":634}," add",[614,1645,1646],{"class":634}," .gitlab-ci.yml\n",[614,1648,1649,1651,1654,1658],{"class":616,"line":649},[614,1650,1640],{"class":627},[614,1652,1653],{"class":634}," commit",[614,1655,1657],{"class":1656},"sYu0t"," -m",[614,1659,1660],{"class":634}," \"Add QMetry test result integration\"\n",[614,1662,1663,1665,1668,1671],{"class":616,"line":661},[614,1664,1640],{"class":627},[614,1666,1667],{"class":634}," push",[614,1669,1670],{"class":634}," origin",[614,1672,1673],{"class":634}," main\n",[13,1675,1676,1677,1680],{},"Navigate to your GitLab project's ",[29,1678,1679],{},"CI/CD > Pipelines"," to watch the execution.",[84,1682,1684],{"id":1683},"_12-verify-successful-upload","12. Verify successful upload",[13,1686,1687],{},"After the pipeline completes, you should see:",[13,1689,1690,1100],{},[29,1691,1692],{},"In GitLab",[220,1694,1695,1702,1705],{},[50,1696,1697,1698,1701],{},"A new job in your pipeline named ",[202,1699,1700],{},"qmetry-import"," (or similar)",[50,1703,1704],{},"Job logs showing successful API communication",[50,1706,1707],{},"Green checkmark indicating successful upload",[13,1709,1710,1100],{},[29,1711,1712],{},"Example successful job log",[347,1714,1718],{"className":1715,"code":1716,"language":1717,"meta":353,"style":353},"language-json shiki shiki-themes github-light","$ curl -X POST https://your-company.qmetry.com/api/v3/test-results/import \\\n  -H \"Authorization: Bearer ${QMETRY_API_KEY}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d @payload.json\n\n{\n  \"status\": \"success\",\n  \"message\": \"Test results uploaded successfully\",\n  \"results_processed\": 15,\n  \"test_cases_created\": 3,\n  \"test_cases_updated\": 12,\n  \"execution_id\": \"EXE-12345\"\n}\n\nJob succeeded ```\n\n**In QMetry**:\n\n1. Navigate to your project dashboard.  \n2. Check the **Test Executions** section.  \n3. You should see a new test execution with results from your GitLab pipeline.  \n4. Click into the execution to see detailed test case results.\n\n\n## Part 5: Advanced configuration options\n\nNow that you have the basic integration working, let's explore advanced configuration for enterprise requirements. Here are the next steps to follow:\n\n### 13. Organizing results with test suites\n\nFor better organization, you can specify which QMetry test suite should receive results:\n\n```yaml\ninclude:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      project: \"Aerospace Flight Control System\"\n      file_name: \"results.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_name: \"Sprint 23 Regression Tests\"\n      testsuite_id: \"TS-456\"  # Optional: Use existing test suite ID\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n","json",[202,1719,1720,1728,1739,1748,1753,1757,1762,1775,1787,1799,1811,1823,1833,1838,1842,1847,1851,1856,1860,1868,1876,1883,1891,1895,1899,1910,1914,1919,1923,1934,1938,1943,1947,1952,1957,1978,1984,1990,1998,2006,2014,2023,2035,2046],{"__ignoreMap":353},[614,1721,1722,1725],{"class":616,"line":617},[614,1723,1724],{"class":620},"$ curl -X POST https:",[614,1726,1727],{"class":904},"//your-company.qmetry.com/api/v3/test-results/import \\\n",[614,1729,1730,1733,1736],{"class":616,"line":649},[614,1731,1732],{"class":620},"  -H ",[614,1734,1735],{"class":634},"\"Authorization: Bearer ${QMETRY_API_KEY}\"",[614,1737,1738],{"class":620}," \\\n",[614,1740,1741,1743,1746],{"class":616,"line":661},[614,1742,1732],{"class":620},[614,1744,1745],{"class":634},"\"Content-Type: application/json\"",[614,1747,1738],{"class":620},[614,1749,1750],{"class":616,"line":712},[614,1751,1752],{"class":620},"  -d @payload.json\n",[614,1754,1755],{"class":616,"line":745},[614,1756,1392],{"emptyLinePlaceholder":1391},[614,1758,1759],{"class":616,"line":761},[614,1760,1761],{"class":620},"{\n",[614,1763,1764,1767,1769,1772],{"class":616,"line":771},[614,1765,1766],{"class":1656},"  \"status\"",[614,1768,1018],{"class":620},[614,1770,1771],{"class":634},"\"success\"",[614,1773,1774],{"class":620},",\n",[614,1776,1777,1780,1782,1785],{"class":616,"line":800},[614,1778,1779],{"class":1656},"  \"message\"",[614,1781,1018],{"class":620},[614,1783,1784],{"class":634},"\"Test results uploaded successfully\"",[614,1786,1774],{"class":620},[614,1788,1789,1792,1794,1797],{"class":616,"line":814},[614,1790,1791],{"class":1656},"  \"results_processed\"",[614,1793,1018],{"class":620},[614,1795,1796],{"class":1656},"15",[614,1798,1774],{"class":620},[614,1800,1801,1804,1806,1809],{"class":616,"line":823},[614,1802,1803],{"class":1656},"  \"test_cases_created\"",[614,1805,1018],{"class":620},[614,1807,1808],{"class":1656},"3",[614,1810,1774],{"class":620},[614,1812,1813,1816,1818,1821],{"class":616,"line":852},[614,1814,1815],{"class":1656},"  \"test_cases_updated\"",[614,1817,1018],{"class":620},[614,1819,1820],{"class":1656},"12",[614,1822,1774],{"class":620},[614,1824,1825,1828,1830],{"class":616,"line":870},[614,1826,1827],{"class":1656},"  \"execution_id\"",[614,1829,1018],{"class":620},[614,1831,1832],{"class":634},"\"EXE-12345\"\n",[614,1834,1835],{"class":616,"line":876},[614,1836,1837],{"class":620},"}\n",[614,1839,1840],{"class":616,"line":882},[614,1841,1392],{"emptyLinePlaceholder":1391},[614,1843,1844],{"class":616,"line":892},[614,1845,1846],{"class":620},"Job succeeded ```\n",[614,1848,1849],{"class":616,"line":901},[614,1850,1392],{"emptyLinePlaceholder":1391},[614,1852,1853],{"class":616,"line":908},[614,1854,1855],{"class":620},"**In QMetry**:\n",[614,1857,1858],{"class":616,"line":918},[614,1859,1392],{"emptyLinePlaceholder":1391},[614,1861,1862,1865],{"class":616,"line":1491},[614,1863,1864],{"class":1656},"1",[614,1866,1867],{"class":620},". Navigate to your project dashboard.  \n",[614,1869,1870,1873],{"class":616,"line":1498},[614,1871,1872],{"class":1656},"2",[614,1874,1875],{"class":620},". Check the **Test Executions** section.  \n",[614,1877,1878,1880],{"class":616,"line":1505},[614,1879,1808],{"class":1656},[614,1881,1882],{"class":620},". You should see a new test execution with results from your GitLab pipeline.  \n",[614,1884,1885,1888],{"class":616,"line":1515},[614,1886,1887],{"class":1656},"4",[614,1889,1890],{"class":620},". Click into the execution to see detailed test case results.\n",[614,1892,1893],{"class":616,"line":1523},[614,1894,1392],{"emptyLinePlaceholder":1391},[614,1896,1897],{"class":616,"line":1531},[614,1898,1392],{"emptyLinePlaceholder":1391},[614,1900,1901,1904,1907],{"class":616,"line":1536},[614,1902,1903],{"class":620},"## Part ",[614,1905,1906],{"class":1656},"5",[614,1908,1909],{"class":620},": Advanced configuration options\n",[614,1911,1912],{"class":616,"line":1542},[614,1913,1392],{"emptyLinePlaceholder":1391},[614,1915,1916],{"class":616,"line":1549},[614,1917,1918],{"class":620},"Now that you have the basic integration working, let's explore advanced configuration for enterprise requirements. Here are the next steps to follow:\n",[614,1920,1921],{"class":616,"line":1560},[614,1922,1392],{"emptyLinePlaceholder":1391},[614,1924,1925,1928,1931],{"class":616,"line":1567},[614,1926,1927],{"class":620},"### ",[614,1929,1930],{"class":1656},"13",[614,1932,1933],{"class":620},". Organizing results with test suites\n",[614,1935,1936],{"class":616,"line":1579},[614,1937,1392],{"emptyLinePlaceholder":1391},[614,1939,1940],{"class":616,"line":1588},[614,1941,1942],{"class":620},"For better organization, you can specify which QMetry test suite should receive results:\n",[614,1944,1945],{"class":616,"line":1597},[614,1946,1392],{"emptyLinePlaceholder":1391},[614,1948,1949],{"class":616,"line":1606},[614,1950,1951],{"class":620},"```yaml\n",[614,1953,1954],{"class":616,"line":1615},[614,1955,1956],{"class":620},"include:\n",[614,1958,1960,1963,1966,1969,1972,1975],{"class":616,"line":1959},35,[614,1961,1962],{"class":620},"  - component: gitlab.com/sb",[614,1964,1965],{"class":1656},"9945614",[614,1967,1968],{"class":620},"/qtm-gitlab-component/qmetry-import@",[614,1970,1971],{"class":1656},"1.0",[614,1973,1974],{"class":620},".",[614,1976,1977],{"class":1656},"5\n",[614,1979,1981],{"class":616,"line":1980},36,[614,1982,1983],{"class":620},"    inputs:\n",[614,1985,1987],{"class":616,"line":1986},37,[614,1988,1989],{"class":620},"      stage: test\n",[614,1991,1993,1996],{"class":616,"line":1992},38,[614,1994,1995],{"class":620},"      project: ",[614,1997,1192],{"class":634},[614,1999,2001,2004],{"class":616,"line":2000},39,[614,2002,2003],{"class":620},"      file_name: ",[614,2005,1202],{"class":634},[614,2007,2009,2012],{"class":616,"line":2008},40,[614,2010,2011],{"class":620},"      testing_type: ",[614,2013,1212],{"class":634},[614,2015,2017,2020],{"class":616,"line":2016},41,[614,2018,2019],{"class":620},"      testsuite_name: ",[614,2021,2022],{"class":634},"\"Sprint 23 Regression Tests\"\n",[614,2024,2026,2029,2032],{"class":616,"line":2025},42,[614,2027,2028],{"class":620},"      testsuite_id: ",[614,2030,2031],{"class":634},"\"TS-456\"",[614,2033,2034],{"class":620},"  # Optional: Use existing test suite ID\n",[614,2036,2038,2041,2044],{"class":616,"line":2037},43,[614,2039,2040],{"class":620},"      instance_url: ${",[614,2042,512],{"class":2043},"sB1qb",[614,2045,1837],{"class":620},[614,2047,2049,2052,2054],{"class":616,"line":2048},44,[614,2050,2051],{"class":620},"      api_key: ${",[614,2053,443],{"class":2043},[614,2055,1837],{"class":620},[13,2057,2058,1100],{},[29,2059,2060],{},"When to use test suites",[47,2062,2063,2066,2069,2072],{},[50,2064,2065],{},"Organizing tests by sprint or release",[50,2067,2068],{},"Separating regression tests from new feature tests",[50,2070,2071],{},"Grouping tests by component or subsystem",[50,2073,2074],{},"Creating test execution hierarchies for reporting",[84,2076,2078],{"id":2077},"_14-configuring-automation-hierarchy-levels","14. Configuring automation hierarchy levels",[13,2080,2081,2082,2085],{},"QMetry supports hierarchical test organization. Use the ",[202,2083,2084],{},"automation_hierarchy"," parameter to specify the organization level:",[347,2087,2089],{"className":998,"code":2088,"language":1000,"meta":353,"style":353},"include:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      project: \"Aerospace Flight Control System\"\n      file_name: \"results.xml\"\n      testing_type: \"JUNIT\"\n      automation_hierarchy: \"2\"  # Level 2 hierarchy\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,2090,2091,2097,2107,2113,2121,2129,2137,2145,2158,2166],{"__ignoreMap":353},[614,2092,2093,2095],{"class":616,"line":617},[614,2094,1151],{"class":624},[614,2096,1010],{"class":620},[614,2098,2099,2101,2103,2105],{"class":616,"line":649},[614,2100,1158],{"class":620},[614,2102,1161],{"class":624},[614,2104,1018],{"class":620},[614,2106,1166],{"class":634},[614,2108,2109,2111],{"class":616,"line":661},[614,2110,1171],{"class":624},[614,2112,1010],{"class":620},[614,2114,2115,2117,2119],{"class":616,"line":712},[614,2116,1178],{"class":624},[614,2118,1018],{"class":620},[614,2120,1021],{"class":634},[614,2122,2123,2125,2127],{"class":616,"line":745},[614,2124,1187],{"class":624},[614,2126,1018],{"class":620},[614,2128,1192],{"class":634},[614,2130,2131,2133,2135],{"class":616,"line":761},[614,2132,1197],{"class":624},[614,2134,1018],{"class":620},[614,2136,1202],{"class":634},[614,2138,2139,2141,2143],{"class":616,"line":771},[614,2140,1207],{"class":624},[614,2142,1018],{"class":620},[614,2144,1212],{"class":634},[614,2146,2147,2150,2152,2155],{"class":616,"line":800},[614,2148,2149],{"class":624},"      automation_hierarchy",[614,2151,1018],{"class":620},[614,2153,2154],{"class":634},"\"2\"",[614,2156,2157],{"class":904},"  # Level 2 hierarchy\n",[614,2159,2160,2162,2164],{"class":616,"line":814},[614,2161,1217],{"class":624},[614,2163,1018],{"class":620},[614,2165,1222],{"class":634},[614,2167,2168,2170,2172],{"class":616,"line":823},[614,2169,1227],{"class":624},[614,2171,1018],{"class":620},[614,2173,1232],{"class":634},[13,2175,2176,1100],{},[29,2177,2178],{},"Hierarchy levels explained",[47,2180,2181,2187,2193],{},[50,2182,2183,2186],{},[29,2184,2185],{},"Level 1",": Top-level test suites (e.g., \"All Regression Tests\")",[50,2188,2189,2192],{},[29,2190,2191],{},"Level 2",": Sub-suites (e.g., \"Flight Control Tests\" under \"Regression Tests\")",[50,2194,2195,2198],{},[29,2196,2197],{},"Level 3",": Granular test groups (e.g., \"Altitude Hold Tests\" under \"Flight Control\")",[84,2200,2202],{"id":2201},"_15-multiple-test-result-files","15. Multiple test result files",[13,2204,2205],{},"For complex projects with multiple test jobs, you can invoke the component multiple times:",[347,2207,2209],{"className":998,"code":2208,"language":1000,"meta":353,"style":353},"stages:\n  - test\n\n# Unit tests\nunit-tests:\n  stage: test\n  script:\n    - npm run test:unit\n  artifacts:\n    paths:\n      - unit-results.xml\n    when: always\n\n# Integration tests\nintegration-tests:\n  stage: test\n  script:\n    - npm run test:integration\n  artifacts:\n    paths:\n      - integration-results.xml\n    when: always\n\n# Upload unit test results\ninclude:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      project: \"Aerospace Flight Control System\"\n      file_name: \"unit-results.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_name: \"Unit Tests - Sprint 23\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n\n  # Upload integration test results\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      project: \"Aerospace Flight Control System\"\n      file_name: \"integration-results.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_name: \"Integration Tests - Sprint 23\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,2210,2211,2217,2223,2227,2232,2238,2246,2252,2259,2265,2271,2278,2286,2290,2295,2302,2310,2316,2323,2329,2335,2342,2350,2354,2359,2365,2375,2381,2389,2397,2406,2414,2424,2432,2440,2444,2449,2459,2465,2473,2481,2490,2498,2507,2515],{"__ignoreMap":353},[614,2212,2213,2215],{"class":616,"line":617},[614,2214,1371],{"class":624},[614,2216,1010],{"class":620},[614,2218,2219,2221],{"class":616,"line":649},[614,2220,1158],{"class":620},[614,2222,1021],{"class":634},[614,2224,2225],{"class":616,"line":661},[614,2226,1392],{"emptyLinePlaceholder":1391},[614,2228,2229],{"class":616,"line":712},[614,2230,2231],{"class":904},"# Unit tests\n",[614,2233,2234,2236],{"class":616,"line":745},[614,2235,1428],{"class":624},[614,2237,1010],{"class":620},[614,2239,2240,2242,2244],{"class":616,"line":761},[614,2241,1015],{"class":624},[614,2243,1018],{"class":620},[614,2245,1021],{"class":634},[614,2247,2248,2250],{"class":616,"line":771},[614,2249,1026],{"class":624},[614,2251,1010],{"class":620},[614,2253,2254,2256],{"class":616,"line":800},[614,2255,1033],{"class":620},[614,2257,2258],{"class":634},"npm run test:unit\n",[614,2260,2261,2263],{"class":616,"line":814},[614,2262,1048],{"class":624},[614,2264,1010],{"class":620},[614,2266,2267,2269],{"class":616,"line":823},[614,2268,1072],{"class":624},[614,2270,1010],{"class":620},[614,2272,2273,2275],{"class":616,"line":852},[614,2274,1079],{"class":620},[614,2276,2277],{"class":634},"unit-results.xml\n",[614,2279,2280,2282,2284],{"class":616,"line":870},[614,2281,1086],{"class":624},[614,2283,1018],{"class":620},[614,2285,1512],{"class":634},[614,2287,2288],{"class":616,"line":876},[614,2289,1392],{"emptyLinePlaceholder":1391},[614,2291,2292],{"class":616,"line":882},[614,2293,2294],{"class":904},"# Integration tests\n",[614,2296,2297,2300],{"class":616,"line":892},[614,2298,2299],{"class":624},"integration-tests",[614,2301,1010],{"class":620},[614,2303,2304,2306,2308],{"class":616,"line":901},[614,2305,1015],{"class":624},[614,2307,1018],{"class":620},[614,2309,1021],{"class":634},[614,2311,2312,2314],{"class":616,"line":908},[614,2313,1026],{"class":624},[614,2315,1010],{"class":620},[614,2317,2318,2320],{"class":616,"line":918},[614,2319,1033],{"class":620},[614,2321,2322],{"class":634},"npm run test:integration\n",[614,2324,2325,2327],{"class":616,"line":1491},[614,2326,1048],{"class":624},[614,2328,1010],{"class":620},[614,2330,2331,2333],{"class":616,"line":1498},[614,2332,1072],{"class":624},[614,2334,1010],{"class":620},[614,2336,2337,2339],{"class":616,"line":1505},[614,2338,1079],{"class":620},[614,2340,2341],{"class":634},"integration-results.xml\n",[614,2343,2344,2346,2348],{"class":616,"line":1515},[614,2345,1086],{"class":624},[614,2347,1018],{"class":620},[614,2349,1512],{"class":634},[614,2351,2352],{"class":616,"line":1523},[614,2353,1392],{"emptyLinePlaceholder":1391},[614,2355,2356],{"class":616,"line":1531},[614,2357,2358],{"class":904},"# Upload unit test results\n",[614,2360,2361,2363],{"class":616,"line":1536},[614,2362,1151],{"class":624},[614,2364,1010],{"class":620},[614,2366,2367,2369,2371,2373],{"class":616,"line":1542},[614,2368,1158],{"class":620},[614,2370,1161],{"class":624},[614,2372,1018],{"class":620},[614,2374,1166],{"class":634},[614,2376,2377,2379],{"class":616,"line":1549},[614,2378,1171],{"class":624},[614,2380,1010],{"class":620},[614,2382,2383,2385,2387],{"class":616,"line":1560},[614,2384,1178],{"class":624},[614,2386,1018],{"class":620},[614,2388,1021],{"class":634},[614,2390,2391,2393,2395],{"class":616,"line":1567},[614,2392,1187],{"class":624},[614,2394,1018],{"class":620},[614,2396,1192],{"class":634},[614,2398,2399,2401,2403],{"class":616,"line":1579},[614,2400,1197],{"class":624},[614,2402,1018],{"class":620},[614,2404,2405],{"class":634},"\"unit-results.xml\"\n",[614,2407,2408,2410,2412],{"class":616,"line":1588},[614,2409,1207],{"class":624},[614,2411,1018],{"class":620},[614,2413,1212],{"class":634},[614,2415,2416,2419,2421],{"class":616,"line":1597},[614,2417,2418],{"class":624},"      testsuite_name",[614,2420,1018],{"class":620},[614,2422,2423],{"class":634},"\"Unit Tests - Sprint 23\"\n",[614,2425,2426,2428,2430],{"class":616,"line":1606},[614,2427,1217],{"class":624},[614,2429,1018],{"class":620},[614,2431,1222],{"class":634},[614,2433,2434,2436,2438],{"class":616,"line":1615},[614,2435,1227],{"class":624},[614,2437,1018],{"class":620},[614,2439,1232],{"class":634},[614,2441,2442],{"class":616,"line":1959},[614,2443,1392],{"emptyLinePlaceholder":1391},[614,2445,2446],{"class":616,"line":1980},[614,2447,2448],{"class":904},"  # Upload integration test results\n",[614,2450,2451,2453,2455,2457],{"class":616,"line":1986},[614,2452,1158],{"class":620},[614,2454,1161],{"class":624},[614,2456,1018],{"class":620},[614,2458,1166],{"class":634},[614,2460,2461,2463],{"class":616,"line":1992},[614,2462,1171],{"class":624},[614,2464,1010],{"class":620},[614,2466,2467,2469,2471],{"class":616,"line":2000},[614,2468,1178],{"class":624},[614,2470,1018],{"class":620},[614,2472,1021],{"class":634},[614,2474,2475,2477,2479],{"class":616,"line":2008},[614,2476,1187],{"class":624},[614,2478,1018],{"class":620},[614,2480,1192],{"class":634},[614,2482,2483,2485,2487],{"class":616,"line":2016},[614,2484,1197],{"class":624},[614,2486,1018],{"class":620},[614,2488,2489],{"class":634},"\"integration-results.xml\"\n",[614,2491,2492,2494,2496],{"class":616,"line":2025},[614,2493,1207],{"class":624},[614,2495,1018],{"class":620},[614,2497,1212],{"class":634},[614,2499,2500,2502,2504],{"class":616,"line":2037},[614,2501,2418],{"class":624},[614,2503,1018],{"class":620},[614,2505,2506],{"class":634},"\"Integration Tests - Sprint 23\"\n",[614,2508,2509,2511,2513],{"class":616,"line":2048},[614,2510,1217],{"class":624},[614,2512,1018],{"class":620},[614,2514,1222],{"class":634},[614,2516,2518,2520,2522],{"class":616,"line":2517},45,[614,2519,1227],{"class":624},[614,2521,1018],{"class":620},[614,2523,1232],{"class":634},[84,2525,2527],{"id":2526},"_16-custom-runner-tags","16. Custom runner tags",[13,2529,2530],{},"For enterprise environments with dedicated runners, specify runner tags:",[347,2532,2534],{"className":998,"code":2533,"language":1000,"meta":353,"style":353},"include:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      runner_tag: \"production-runners\"  # Use specific runner pool\n      project: \"Aerospace Flight Control System\"\n      file_name: \"results.xml\"\n      testing_type: \"JUNIT\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,2535,2536,2542,2552,2558,2566,2579,2587,2595,2603,2611],{"__ignoreMap":353},[614,2537,2538,2540],{"class":616,"line":617},[614,2539,1151],{"class":624},[614,2541,1010],{"class":620},[614,2543,2544,2546,2548,2550],{"class":616,"line":649},[614,2545,1158],{"class":620},[614,2547,1161],{"class":624},[614,2549,1018],{"class":620},[614,2551,1166],{"class":634},[614,2553,2554,2556],{"class":616,"line":661},[614,2555,1171],{"class":624},[614,2557,1010],{"class":620},[614,2559,2560,2562,2564],{"class":616,"line":712},[614,2561,1178],{"class":624},[614,2563,1018],{"class":620},[614,2565,1021],{"class":634},[614,2567,2568,2571,2573,2576],{"class":616,"line":745},[614,2569,2570],{"class":624},"      runner_tag",[614,2572,1018],{"class":620},[614,2574,2575],{"class":634},"\"production-runners\"",[614,2577,2578],{"class":904},"  # Use specific runner pool\n",[614,2580,2581,2583,2585],{"class":616,"line":761},[614,2582,1187],{"class":624},[614,2584,1018],{"class":620},[614,2586,1192],{"class":634},[614,2588,2589,2591,2593],{"class":616,"line":771},[614,2590,1197],{"class":624},[614,2592,1018],{"class":620},[614,2594,1202],{"class":634},[614,2596,2597,2599,2601],{"class":616,"line":800},[614,2598,1207],{"class":624},[614,2600,1018],{"class":620},[614,2602,1212],{"class":634},[614,2604,2605,2607,2609],{"class":616,"line":814},[614,2606,1217],{"class":624},[614,2608,1018],{"class":620},[614,2610,1222],{"class":634},[614,2612,2613,2615,2617],{"class":616,"line":823},[614,2614,1227],{"class":624},[614,2616,1018],{"class":620},[614,2618,1232],{"class":634},[84,2620,2622],{"id":2621},"_17-custom-test-suite-folders","17. Custom test suite folders",[13,2624,2625],{},"Organize test suites into folders for better project structure:",[347,2627,2629],{"className":998,"code":2628,"language":1000,"meta":353,"style":353},"include:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      project: \"Aerospace Flight Control System\"\n      file_name: \"results.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_folder_path: \"/Regression/Sprint-23/Flight-Controls\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,2630,2631,2637,2647,2653,2661,2669,2677,2685,2695,2703],{"__ignoreMap":353},[614,2632,2633,2635],{"class":616,"line":617},[614,2634,1151],{"class":624},[614,2636,1010],{"class":620},[614,2638,2639,2641,2643,2645],{"class":616,"line":649},[614,2640,1158],{"class":620},[614,2642,1161],{"class":624},[614,2644,1018],{"class":620},[614,2646,1166],{"class":634},[614,2648,2649,2651],{"class":616,"line":661},[614,2650,1171],{"class":624},[614,2652,1010],{"class":620},[614,2654,2655,2657,2659],{"class":616,"line":712},[614,2656,1178],{"class":624},[614,2658,1018],{"class":620},[614,2660,1021],{"class":634},[614,2662,2663,2665,2667],{"class":616,"line":745},[614,2664,1187],{"class":624},[614,2666,1018],{"class":620},[614,2668,1192],{"class":634},[614,2670,2671,2673,2675],{"class":616,"line":761},[614,2672,1197],{"class":624},[614,2674,1018],{"class":620},[614,2676,1202],{"class":634},[614,2678,2679,2681,2683],{"class":616,"line":771},[614,2680,1207],{"class":624},[614,2682,1018],{"class":620},[614,2684,1212],{"class":634},[614,2686,2687,2690,2692],{"class":616,"line":800},[614,2688,2689],{"class":624},"      testsuite_folder_path",[614,2691,1018],{"class":620},[614,2693,2694],{"class":634},"\"/Regression/Sprint-23/Flight-Controls\"\n",[614,2696,2697,2699,2701],{"class":616,"line":814},[614,2698,1217],{"class":624},[614,2700,1018],{"class":620},[614,2702,1222],{"class":634},[614,2704,2705,2707,2709],{"class":616,"line":823},[614,2706,1227],{"class":624},[614,2708,1018],{"class":620},[614,2710,1232],{"class":634},[13,2712,2713],{},"This creates a folder hierarchy in QMetry:",[347,2715,2719],{"className":2716,"code":2717,"language":2718,"meta":353,"style":353},"language-none shiki shiki-themes github-light","Aerospace Flight Control System/\n└── Regression/\n    └── Sprint-23/\n        └── Flight-Controls/\n            └── [Your test execution]\n","none",[202,2720,2721,2726,2731,2736,2741],{"__ignoreMap":353},[614,2722,2723],{"class":616,"line":617},[614,2724,2725],{},"Aerospace Flight Control System/\n",[614,2727,2728],{"class":616,"line":649},[614,2729,2730],{},"└── Regression/\n",[614,2732,2733],{"class":616,"line":661},[614,2734,2735],{},"    └── Sprint-23/\n",[614,2737,2738],{"class":616,"line":712},[614,2739,2740],{},"        └── Flight-Controls/\n",[614,2742,2743],{"class":616,"line":745},[614,2744,2745],{},"            └── [Your test execution]\n",[84,2747,2749],{"id":2748},"_18-advanced-field-mapping","18. Advanced field mapping",[13,2751,2752,2753,2756,2757,2760],{},"For enterprise QMetry instances with custom fields, use the ",[202,2754,2755],{},"testcase_fields"," and ",[202,2758,2759],{},"testsuite_fields"," parameters:",[347,2762,2764],{"className":998,"code":2763,"language":1000,"meta":353,"style":353},"include:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: test\n      project: \"Aerospace Flight Control System\"\n      file_name: \"results.xml\"\n      testing_type: \"JUNIT\"\n      testcase_fields: \"priority=P1,component=FlightControl,certification=DO-178C\"\n      testsuite_fields: \"release=v2.4.0,sprint=23\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,2765,2766,2772,2782,2788,2796,2804,2812,2820,2830,2840,2848],{"__ignoreMap":353},[614,2767,2768,2770],{"class":616,"line":617},[614,2769,1151],{"class":624},[614,2771,1010],{"class":620},[614,2773,2774,2776,2778,2780],{"class":616,"line":649},[614,2775,1158],{"class":620},[614,2777,1161],{"class":624},[614,2779,1018],{"class":620},[614,2781,1166],{"class":634},[614,2783,2784,2786],{"class":616,"line":661},[614,2785,1171],{"class":624},[614,2787,1010],{"class":620},[614,2789,2790,2792,2794],{"class":616,"line":712},[614,2791,1178],{"class":624},[614,2793,1018],{"class":620},[614,2795,1021],{"class":634},[614,2797,2798,2800,2802],{"class":616,"line":745},[614,2799,1187],{"class":624},[614,2801,1018],{"class":620},[614,2803,1192],{"class":634},[614,2805,2806,2808,2810],{"class":616,"line":761},[614,2807,1197],{"class":624},[614,2809,1018],{"class":620},[614,2811,1202],{"class":634},[614,2813,2814,2816,2818],{"class":616,"line":771},[614,2815,1207],{"class":624},[614,2817,1018],{"class":620},[614,2819,1212],{"class":634},[614,2821,2822,2825,2827],{"class":616,"line":800},[614,2823,2824],{"class":624},"      testcase_fields",[614,2826,1018],{"class":620},[614,2828,2829],{"class":634},"\"priority=P1,component=FlightControl,certification=DO-178C\"\n",[614,2831,2832,2835,2837],{"class":616,"line":814},[614,2833,2834],{"class":624},"      testsuite_fields",[614,2836,1018],{"class":620},[614,2838,2839],{"class":634},"\"release=v2.4.0,sprint=23\"\n",[614,2841,2842,2844,2846],{"class":616,"line":823},[614,2843,1217],{"class":624},[614,2845,1018],{"class":620},[614,2847,1222],{"class":634},[614,2849,2850,2852,2854],{"class":616,"line":852},[614,2851,1227],{"class":624},[614,2853,1018],{"class":620},[614,2855,1232],{"class":634},[13,2857,2858],{},"This adds custom metadata to test cases and suites for enhanced filtering and reporting.",[76,2860,2862],{"id":2861},"part-6-real-world-use-cases","Part 6: Real-world use cases",[13,2864,2865],{},"Let's explore how organizations across different industries are using this integration to solve critical quality and compliance challenges.",[84,2867,2869],{"id":2868},"financial-services-enterprise-banking-platforms","Financial services: Enterprise banking platforms",[13,2871,2872],{},"Leading financial institutions are evolving their engineering practices with integrated DevOps platforms. These organizations face unique challenges when managing test automation at scale.",[13,2874,2875,1100],{},[29,2876,2877],{},"The challenge for financial services",[47,2879,2880,2886,2892,2898,2904],{},[50,2881,2882,2885],{},[29,2883,2884],{},"Regulatory compliance",": Financial services must maintain detailed audit trails for all testing activities.",[50,2887,2888,2891],{},[29,2889,2890],{},"Multiple compliance frameworks",": Firms must adhere to FCA, PSD2, GDPR, and internal risk management policies.",[50,2893,2894,2897],{},[29,2895,2896],{},"High-frequency deployments",": Multiple production deployments are required daily across microservices.",[50,2899,2900,2903],{},[29,2901,2902],{},"Zero-tolerance for failures",": Banking systems require extremely high reliability.",[50,2905,2906,2909],{},[29,2907,2908],{},"Distributed teams",": QA teams need real-time visibility across global engineering teams.",[13,2911,2912,2915],{},[29,2913,2914],{},"The solution",": Financial services organizations implementing the QMetry GitLab Component can automate test result uploads across their CI/CD pipelines for:",[47,2917,2918,2921,2924,2927,2930],{},[50,2919,2920],{},"Unit tests for hundreds of microservices",[50,2922,2923],{},"API contract tests for inter-service communication",[50,2925,2926],{},"End-to-end transaction flow tests",[50,2928,2929],{},"Security and compliance scanning results",[50,2931,2932],{},"Performance and load testing results",[13,2934,2935,1100],{},[29,2936,2937],{},"Example implementation approach",[347,2939,2941],{"className":998,"code":2940,"language":1000,"meta":353,"style":353},"# Financial services approach: Separate test uploads by test type\nstages:\n  - test\n  - security\n  - report\n\n# Unit tests for payment processing service\nunit-tests:\n  stage: test\n  script:\n    - mvn clean test\n  artifacts:\n    paths:\n      - target/surefire-reports/TEST-*.xml\n    when: always\n\n# Upload to QMetry with compliance metadata\ninclude:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: report\n      project: \"Payment Processing Platform\"\n      file_name: \"target/surefire-reports/TEST-*.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_name: \"Payment Services - Unit Tests\"\n      testsuite_folder_path: \"/Regulatory/FCA-Compliance/Unit-Tests\"\n      testcase_fields: \"compliance=FCA,risk_level=high,service=payments\"\n      automation_hierarchy: \"2\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,2942,2943,2948,2954,2960,2967,2973,2977,2982,2988,2996,3002,3009,3015,3021,3028,3036,3040,3045,3051,3061,3067,3075,3084,3093,3101,3110,3119,3128,3137,3145],{"__ignoreMap":353},[614,2944,2945],{"class":616,"line":617},[614,2946,2947],{"class":904},"# Financial services approach: Separate test uploads by test type\n",[614,2949,2950,2952],{"class":616,"line":649},[614,2951,1371],{"class":624},[614,2953,1010],{"class":620},[614,2955,2956,2958],{"class":616,"line":661},[614,2957,1158],{"class":620},[614,2959,1021],{"class":634},[614,2961,2962,2964],{"class":616,"line":712},[614,2963,1158],{"class":620},[614,2965,2966],{"class":634},"security\n",[614,2968,2969,2971],{"class":616,"line":745},[614,2970,1158],{"class":620},[614,2972,1386],{"class":634},[614,2974,2975],{"class":616,"line":761},[614,2976,1392],{"emptyLinePlaceholder":1391},[614,2978,2979],{"class":616,"line":771},[614,2980,2981],{"class":904},"# Unit tests for payment processing service\n",[614,2983,2984,2986],{"class":616,"line":800},[614,2985,1428],{"class":624},[614,2987,1010],{"class":620},[614,2989,2990,2992,2994],{"class":616,"line":814},[614,2991,1015],{"class":624},[614,2993,1018],{"class":620},[614,2995,1021],{"class":634},[614,2997,2998,3000],{"class":616,"line":823},[614,2999,1026],{"class":624},[614,3001,1010],{"class":620},[614,3003,3004,3006],{"class":616,"line":852},[614,3005,1033],{"class":620},[614,3007,3008],{"class":634},"mvn clean test\n",[614,3010,3011,3013],{"class":616,"line":870},[614,3012,1048],{"class":624},[614,3014,1010],{"class":620},[614,3016,3017,3019],{"class":616,"line":876},[614,3018,1072],{"class":624},[614,3020,1010],{"class":620},[614,3022,3023,3025],{"class":616,"line":882},[614,3024,1079],{"class":620},[614,3026,3027],{"class":634},"target/surefire-reports/TEST-*.xml\n",[614,3029,3030,3032,3034],{"class":616,"line":892},[614,3031,1086],{"class":624},[614,3033,1018],{"class":620},[614,3035,1512],{"class":634},[614,3037,3038],{"class":616,"line":901},[614,3039,1392],{"emptyLinePlaceholder":1391},[614,3041,3042],{"class":616,"line":908},[614,3043,3044],{"class":904},"# Upload to QMetry with compliance metadata\n",[614,3046,3047,3049],{"class":616,"line":918},[614,3048,1151],{"class":624},[614,3050,1010],{"class":620},[614,3052,3053,3055,3057,3059],{"class":616,"line":1491},[614,3054,1158],{"class":620},[614,3056,1161],{"class":624},[614,3058,1018],{"class":620},[614,3060,1166],{"class":634},[614,3062,3063,3065],{"class":616,"line":1498},[614,3064,1171],{"class":624},[614,3066,1010],{"class":620},[614,3068,3069,3071,3073],{"class":616,"line":1505},[614,3070,1178],{"class":624},[614,3072,1018],{"class":620},[614,3074,1386],{"class":634},[614,3076,3077,3079,3081],{"class":616,"line":1515},[614,3078,1187],{"class":624},[614,3080,1018],{"class":620},[614,3082,3083],{"class":634},"\"Payment Processing Platform\"\n",[614,3085,3086,3088,3090],{"class":616,"line":1523},[614,3087,1197],{"class":624},[614,3089,1018],{"class":620},[614,3091,3092],{"class":634},"\"target/surefire-reports/TEST-*.xml\"\n",[614,3094,3095,3097,3099],{"class":616,"line":1531},[614,3096,1207],{"class":624},[614,3098,1018],{"class":620},[614,3100,1212],{"class":634},[614,3102,3103,3105,3107],{"class":616,"line":1536},[614,3104,2418],{"class":624},[614,3106,1018],{"class":620},[614,3108,3109],{"class":634},"\"Payment Services - Unit Tests\"\n",[614,3111,3112,3114,3116],{"class":616,"line":1542},[614,3113,2689],{"class":624},[614,3115,1018],{"class":620},[614,3117,3118],{"class":634},"\"/Regulatory/FCA-Compliance/Unit-Tests\"\n",[614,3120,3121,3123,3125],{"class":616,"line":1549},[614,3122,2824],{"class":624},[614,3124,1018],{"class":620},[614,3126,3127],{"class":634},"\"compliance=FCA,risk_level=high,service=payments\"\n",[614,3129,3130,3132,3134],{"class":616,"line":1560},[614,3131,2149],{"class":624},[614,3133,1018],{"class":620},[614,3135,3136],{"class":634},"\"2\"\n",[614,3138,3139,3141,3143],{"class":616,"line":1567},[614,3140,1217],{"class":624},[614,3142,1018],{"class":620},[614,3144,1222],{"class":634},[614,3146,3147,3149,3151],{"class":616,"line":1579},[614,3148,1227],{"class":624},[614,3150,1018],{"class":620},[614,3152,1232],{"class":634},[13,3154,3155,1100],{},[29,3156,3157],{},"Potential business outcomes for financial services",[47,3159,3160,3166,3172,3178,3184],{},[50,3161,3162,3165],{},[29,3163,3164],{},"Significant reduction"," in manual test reporting time",[50,3167,3168,3171],{},[29,3169,3170],{},"Complete audit trail coverage"," for regulatory reviews",[50,3173,3174,3177],{},[29,3175,3176],{},"Real-time visibility"," for distributed QA teams",[50,3179,3180,3183],{},[29,3181,3182],{},"Faster time-to-production"," with automated quality gates",[50,3185,3186,3189],{},[29,3187,3188],{},"Enhanced compliance posture"," with complete traceability from requirements to test execution",[84,3191,3193],{"id":3192},"aerospace-flight-control-testing","Aerospace flight control testing",[13,3195,3196],{},"Let's explore how an aerospace company might use this integration for critical flight control system testing.",[13,3198,3199],{},[29,3200,3201],{},"Aerospace software development faces unique requirements and challenges:",[47,3203,3204,3210,3216,3222,3228],{},[50,3205,3206,3209],{},[29,3207,3208],{},"DO-178C compliance",": Aviation software must follow strict certification standards",[50,3211,3212,3215],{},[29,3213,3214],{},"Complete traceability",": Every requirement must link to test cases and execution results",[50,3217,3218,3221],{},[29,3219,3220],{},"Audit trails",": Regulators require detailed records of all testing activities",[50,3223,3224,3227],{},[29,3225,3226],{},"Safety-critical quality",": Failures can have catastrophic consequences",[50,3229,3230,3233],{},[29,3231,3232],{},"Multiple test levels",": Unit, integration, system, and certification tests",[13,3235,3236,3239],{},[29,3237,3238],{},"The solution:"," By integrating GitLab CI/CD with QMetry, the aerospace engineering team achieves automated test execution and reporting.",[347,3241,3243],{"className":998,"code":3242,"language":1000,"meta":353,"style":353},"stages:\n  - build\n  - unit-test\n  - integration-test\n  - system-test\n  - report\n\n# Build flight control firmware\nbuild-firmware:\n  stage: build\n  script:\n    - make clean\n    - make build TARGET=flight-control\n  artifacts:\n    paths:\n      - build/flight-control.bin\n\n# Unit tests (DO-178C Level A)\nunit-tests:\n  stage: unit-test\n  script:\n    - make test-unit OUTPUT=junit\n  artifacts:\n    paths:\n      - test-results/unit-tests.xml\n    when: always\n\n# Hardware-in-the-loop integration tests\nhil-integration-tests:\n  stage: integration-test\n  tags:\n    - hil-test-bench  # Dedicated hardware test environment\n  script:\n    - ./scripts/deploy-to-test-bench.sh\n    - ./scripts/run-hil-tests.sh\n  artifacts:\n    paths:\n      - test-results/hil-tests.xml\n    when: always\n\n# System-level certification tests\ncertification-tests:\n  stage: system-test\n  tags:\n    - certification-environment\n  script:\n    - ./scripts/run-certification-suite.sh\n  artifacts:\n    paths:\n      - test-results/certification-tests.xml\n    when: always\n  only:\n    - main  # Only run on main branch\n\n# Upload unit test results to QMetry\ninclude:\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: report\n      project: \"Flight Control System v2.4\"\n      file_name: \"test-results/unit-tests.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_name: \"Unit Tests - DO-178C Level A\"\n      testsuite_folder_path: \"/Certification/DO-178C/Unit\"\n      testcase_fields: \"compliance=DO-178C,level=A,safety_critical=true\"\n      automation_hierarchy: \"2\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n\n  # Upload HIL test results\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: report\n      project: \"Flight Control System v2.4\"\n      file_name: \"test-results/hil-tests.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_name: \"Hardware-in-Loop Integration Tests\"\n      testsuite_folder_path: \"/Certification/DO-178C/Integration\"\n      testcase_fields: \"compliance=DO-178C,level=A,test_type=HIL\"\n      automation_hierarchy: \"2\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n\n  # Upload certification test results\n  - component: gitlab.com/sb9945614/qtm-gitlab-component/qmetry-import@1.0.5\n    inputs:\n      stage: report\n      project: \"Flight Control System v2.4\"\n      file_name: \"test-results/certification-tests.xml\"\n      testing_type: \"JUNIT\"\n      testsuite_name: \"System Certification Tests\"\n      testsuite_folder_path: \"/Certification/DO-178C/System\"\n      testcase_fields: \"compliance=DO-178C,level=A,certification_ready=true\"\n      automation_hierarchy: \"1\"\n      instance_url: ${INSTANCE_URL}\n      api_key: ${QMETRY_API_KEY}\n",[202,3244,3245,3251,3258,3265,3272,3279,3285,3289,3294,3301,3309,3315,3322,3329,3335,3341,3348,3352,3357,3363,3371,3377,3384,3390,3396,3403,3411,3415,3420,3427,3435,3441,3451,3457,3464,3471,3477,3483,3490,3498,3502,3507,3514,3522,3528,3535,3542,3550,3557,3564,3572,3581,3589,3600,3605,3611,3618,3629,3636,3645,3655,3665,3674,3684,3694,3704,3713,3722,3731,3736,3742,3753,3760,3769,3778,3788,3797,3807,3817,3827,3836,3845,3854,3859,3865,3876,3883,3892,3901,3911,3920,3930,3940,3950,3960,3969],{"__ignoreMap":353},[614,3246,3247,3249],{"class":616,"line":617},[614,3248,1371],{"class":624},[614,3250,1010],{"class":620},[614,3252,3253,3255],{"class":616,"line":649},[614,3254,1158],{"class":620},[614,3256,3257],{"class":634},"build\n",[614,3259,3260,3262],{"class":616,"line":661},[614,3261,1158],{"class":620},[614,3263,3264],{"class":634},"unit-test\n",[614,3266,3267,3269],{"class":616,"line":712},[614,3268,1158],{"class":620},[614,3270,3271],{"class":634},"integration-test\n",[614,3273,3274,3276],{"class":616,"line":745},[614,3275,1158],{"class":620},[614,3277,3278],{"class":634},"system-test\n",[614,3280,3281,3283],{"class":616,"line":761},[614,3282,1158],{"class":620},[614,3284,1386],{"class":634},[614,3286,3287],{"class":616,"line":771},[614,3288,1392],{"emptyLinePlaceholder":1391},[614,3290,3291],{"class":616,"line":800},[614,3292,3293],{"class":904},"# Build flight control firmware\n",[614,3295,3296,3299],{"class":616,"line":814},[614,3297,3298],{"class":624},"build-firmware",[614,3300,1010],{"class":620},[614,3302,3303,3305,3307],{"class":616,"line":823},[614,3304,1015],{"class":624},[614,3306,1018],{"class":620},[614,3308,3257],{"class":634},[614,3310,3311,3313],{"class":616,"line":852},[614,3312,1026],{"class":624},[614,3314,1010],{"class":620},[614,3316,3317,3319],{"class":616,"line":870},[614,3318,1033],{"class":620},[614,3320,3321],{"class":634},"make clean\n",[614,3323,3324,3326],{"class":616,"line":876},[614,3325,1033],{"class":620},[614,3327,3328],{"class":634},"make build TARGET=flight-control\n",[614,3330,3331,3333],{"class":616,"line":882},[614,3332,1048],{"class":624},[614,3334,1010],{"class":620},[614,3336,3337,3339],{"class":616,"line":892},[614,3338,1072],{"class":624},[614,3340,1010],{"class":620},[614,3342,3343,3345],{"class":616,"line":901},[614,3344,1079],{"class":620},[614,3346,3347],{"class":634},"build/flight-control.bin\n",[614,3349,3350],{"class":616,"line":908},[614,3351,1392],{"emptyLinePlaceholder":1391},[614,3353,3354],{"class":616,"line":918},[614,3355,3356],{"class":904},"# Unit tests (DO-178C Level A)\n",[614,3358,3359,3361],{"class":616,"line":1491},[614,3360,1428],{"class":624},[614,3362,1010],{"class":620},[614,3364,3365,3367,3369],{"class":616,"line":1498},[614,3366,1015],{"class":624},[614,3368,1018],{"class":620},[614,3370,3264],{"class":634},[614,3372,3373,3375],{"class":616,"line":1505},[614,3374,1026],{"class":624},[614,3376,1010],{"class":620},[614,3378,3379,3381],{"class":616,"line":1515},[614,3380,1033],{"class":620},[614,3382,3383],{"class":634},"make test-unit OUTPUT=junit\n",[614,3385,3386,3388],{"class":616,"line":1523},[614,3387,1048],{"class":624},[614,3389,1010],{"class":620},[614,3391,3392,3394],{"class":616,"line":1531},[614,3393,1072],{"class":624},[614,3395,1010],{"class":620},[614,3397,3398,3400],{"class":616,"line":1536},[614,3399,1079],{"class":620},[614,3401,3402],{"class":634},"test-results/unit-tests.xml\n",[614,3404,3405,3407,3409],{"class":616,"line":1542},[614,3406,1086],{"class":624},[614,3408,1018],{"class":620},[614,3410,1512],{"class":634},[614,3412,3413],{"class":616,"line":1549},[614,3414,1392],{"emptyLinePlaceholder":1391},[614,3416,3417],{"class":616,"line":1560},[614,3418,3419],{"class":904},"# Hardware-in-the-loop integration tests\n",[614,3421,3422,3425],{"class":616,"line":1567},[614,3423,3424],{"class":624},"hil-integration-tests",[614,3426,1010],{"class":620},[614,3428,3429,3431,3433],{"class":616,"line":1579},[614,3430,1015],{"class":624},[614,3432,1018],{"class":620},[614,3434,3271],{"class":634},[614,3436,3437,3439],{"class":616,"line":1588},[614,3438,1518],{"class":624},[614,3440,1010],{"class":620},[614,3442,3443,3445,3448],{"class":616,"line":1597},[614,3444,1033],{"class":620},[614,3446,3447],{"class":634},"hil-test-bench",[614,3449,3450],{"class":904},"  # Dedicated hardware test environment\n",[614,3452,3453,3455],{"class":616,"line":1606},[614,3454,1026],{"class":624},[614,3456,1010],{"class":620},[614,3458,3459,3461],{"class":616,"line":1615},[614,3460,1033],{"class":620},[614,3462,3463],{"class":634},"./scripts/deploy-to-test-bench.sh\n",[614,3465,3466,3468],{"class":616,"line":1959},[614,3467,1033],{"class":620},[614,3469,3470],{"class":634},"./scripts/run-hil-tests.sh\n",[614,3472,3473,3475],{"class":616,"line":1980},[614,3474,1048],{"class":624},[614,3476,1010],{"class":620},[614,3478,3479,3481],{"class":616,"line":1986},[614,3480,1072],{"class":624},[614,3482,1010],{"class":620},[614,3484,3485,3487],{"class":616,"line":1992},[614,3486,1079],{"class":620},[614,3488,3489],{"class":634},"test-results/hil-tests.xml\n",[614,3491,3492,3494,3496],{"class":616,"line":2000},[614,3493,1086],{"class":624},[614,3495,1018],{"class":620},[614,3497,1512],{"class":634},[614,3499,3500],{"class":616,"line":2008},[614,3501,1392],{"emptyLinePlaceholder":1391},[614,3503,3504],{"class":616,"line":2016},[614,3505,3506],{"class":904},"# System-level certification tests\n",[614,3508,3509,3512],{"class":616,"line":2025},[614,3510,3511],{"class":624},"certification-tests",[614,3513,1010],{"class":620},[614,3515,3516,3518,3520],{"class":616,"line":2037},[614,3517,1015],{"class":624},[614,3519,1018],{"class":620},[614,3521,3278],{"class":634},[614,3523,3524,3526],{"class":616,"line":2048},[614,3525,1518],{"class":624},[614,3527,1010],{"class":620},[614,3529,3530,3532],{"class":616,"line":2517},[614,3531,1033],{"class":620},[614,3533,3534],{"class":634},"certification-environment\n",[614,3536,3538,3540],{"class":616,"line":3537},46,[614,3539,1026],{"class":624},[614,3541,1010],{"class":620},[614,3543,3545,3547],{"class":616,"line":3544},47,[614,3546,1033],{"class":620},[614,3548,3549],{"class":634},"./scripts/run-certification-suite.sh\n",[614,3551,3553,3555],{"class":616,"line":3552},48,[614,3554,1048],{"class":624},[614,3556,1010],{"class":620},[614,3558,3560,3562],{"class":616,"line":3559},49,[614,3561,1072],{"class":624},[614,3563,1010],{"class":620},[614,3565,3567,3569],{"class":616,"line":3566},50,[614,3568,1079],{"class":620},[614,3570,3571],{"class":634},"test-results/certification-tests.xml\n",[614,3573,3575,3577,3579],{"class":616,"line":3574},51,[614,3576,1086],{"class":624},[614,3578,1018],{"class":620},[614,3580,1512],{"class":634},[614,3582,3584,3587],{"class":616,"line":3583},52,[614,3585,3586],{"class":624},"  only",[614,3588,1010],{"class":620},[614,3590,3592,3594,3597],{"class":616,"line":3591},53,[614,3593,1033],{"class":620},[614,3595,3596],{"class":634},"main",[614,3598,3599],{"class":904},"  # Only run on main branch\n",[614,3601,3603],{"class":616,"line":3602},54,[614,3604,1392],{"emptyLinePlaceholder":1391},[614,3606,3608],{"class":616,"line":3607},55,[614,3609,3610],{"class":904},"# Upload unit test results to QMetry\n",[614,3612,3614,3616],{"class":616,"line":3613},56,[614,3615,1151],{"class":624},[614,3617,1010],{"class":620},[614,3619,3621,3623,3625,3627],{"class":616,"line":3620},57,[614,3622,1158],{"class":620},[614,3624,1161],{"class":624},[614,3626,1018],{"class":620},[614,3628,1166],{"class":634},[614,3630,3632,3634],{"class":616,"line":3631},58,[614,3633,1171],{"class":624},[614,3635,1010],{"class":620},[614,3637,3639,3641,3643],{"class":616,"line":3638},59,[614,3640,1178],{"class":624},[614,3642,1018],{"class":620},[614,3644,1386],{"class":634},[614,3646,3648,3650,3652],{"class":616,"line":3647},60,[614,3649,1187],{"class":624},[614,3651,1018],{"class":620},[614,3653,3654],{"class":634},"\"Flight Control System v2.4\"\n",[614,3656,3658,3660,3662],{"class":616,"line":3657},61,[614,3659,1197],{"class":624},[614,3661,1018],{"class":620},[614,3663,3664],{"class":634},"\"test-results/unit-tests.xml\"\n",[614,3666,3668,3670,3672],{"class":616,"line":3667},62,[614,3669,1207],{"class":624},[614,3671,1018],{"class":620},[614,3673,1212],{"class":634},[614,3675,3677,3679,3681],{"class":616,"line":3676},63,[614,3678,2418],{"class":624},[614,3680,1018],{"class":620},[614,3682,3683],{"class":634},"\"Unit Tests - DO-178C Level A\"\n",[614,3685,3687,3689,3691],{"class":616,"line":3686},64,[614,3688,2689],{"class":624},[614,3690,1018],{"class":620},[614,3692,3693],{"class":634},"\"/Certification/DO-178C/Unit\"\n",[614,3695,3697,3699,3701],{"class":616,"line":3696},65,[614,3698,2824],{"class":624},[614,3700,1018],{"class":620},[614,3702,3703],{"class":634},"\"compliance=DO-178C,level=A,safety_critical=true\"\n",[614,3705,3707,3709,3711],{"class":616,"line":3706},66,[614,3708,2149],{"class":624},[614,3710,1018],{"class":620},[614,3712,3136],{"class":634},[614,3714,3716,3718,3720],{"class":616,"line":3715},67,[614,3717,1217],{"class":624},[614,3719,1018],{"class":620},[614,3721,1222],{"class":634},[614,3723,3725,3727,3729],{"class":616,"line":3724},68,[614,3726,1227],{"class":624},[614,3728,1018],{"class":620},[614,3730,1232],{"class":634},[614,3732,3734],{"class":616,"line":3733},69,[614,3735,1392],{"emptyLinePlaceholder":1391},[614,3737,3739],{"class":616,"line":3738},70,[614,3740,3741],{"class":904},"  # Upload HIL test results\n",[614,3743,3745,3747,3749,3751],{"class":616,"line":3744},71,[614,3746,1158],{"class":620},[614,3748,1161],{"class":624},[614,3750,1018],{"class":620},[614,3752,1166],{"class":634},[614,3754,3756,3758],{"class":616,"line":3755},72,[614,3757,1171],{"class":624},[614,3759,1010],{"class":620},[614,3761,3763,3765,3767],{"class":616,"line":3762},73,[614,3764,1178],{"class":624},[614,3766,1018],{"class":620},[614,3768,1386],{"class":634},[614,3770,3772,3774,3776],{"class":616,"line":3771},74,[614,3773,1187],{"class":624},[614,3775,1018],{"class":620},[614,3777,3654],{"class":634},[614,3779,3781,3783,3785],{"class":616,"line":3780},75,[614,3782,1197],{"class":624},[614,3784,1018],{"class":620},[614,3786,3787],{"class":634},"\"test-results/hil-tests.xml\"\n",[614,3789,3791,3793,3795],{"class":616,"line":3790},76,[614,3792,1207],{"class":624},[614,3794,1018],{"class":620},[614,3796,1212],{"class":634},[614,3798,3800,3802,3804],{"class":616,"line":3799},77,[614,3801,2418],{"class":624},[614,3803,1018],{"class":620},[614,3805,3806],{"class":634},"\"Hardware-in-Loop Integration Tests\"\n",[614,3808,3810,3812,3814],{"class":616,"line":3809},78,[614,3811,2689],{"class":624},[614,3813,1018],{"class":620},[614,3815,3816],{"class":634},"\"/Certification/DO-178C/Integration\"\n",[614,3818,3820,3822,3824],{"class":616,"line":3819},79,[614,3821,2824],{"class":624},[614,3823,1018],{"class":620},[614,3825,3826],{"class":634},"\"compliance=DO-178C,level=A,test_type=HIL\"\n",[614,3828,3830,3832,3834],{"class":616,"line":3829},80,[614,3831,2149],{"class":624},[614,3833,1018],{"class":620},[614,3835,3136],{"class":634},[614,3837,3839,3841,3843],{"class":616,"line":3838},81,[614,3840,1217],{"class":624},[614,3842,1018],{"class":620},[614,3844,1222],{"class":634},[614,3846,3848,3850,3852],{"class":616,"line":3847},82,[614,3849,1227],{"class":624},[614,3851,1018],{"class":620},[614,3853,1232],{"class":634},[614,3855,3857],{"class":616,"line":3856},83,[614,3858,1392],{"emptyLinePlaceholder":1391},[614,3860,3862],{"class":616,"line":3861},84,[614,3863,3864],{"class":904},"  # Upload certification test results\n",[614,3866,3868,3870,3872,3874],{"class":616,"line":3867},85,[614,3869,1158],{"class":620},[614,3871,1161],{"class":624},[614,3873,1018],{"class":620},[614,3875,1166],{"class":634},[614,3877,3879,3881],{"class":616,"line":3878},86,[614,3880,1171],{"class":624},[614,3882,1010],{"class":620},[614,3884,3886,3888,3890],{"class":616,"line":3885},87,[614,3887,1178],{"class":624},[614,3889,1018],{"class":620},[614,3891,1386],{"class":634},[614,3893,3895,3897,3899],{"class":616,"line":3894},88,[614,3896,1187],{"class":624},[614,3898,1018],{"class":620},[614,3900,3654],{"class":634},[614,3902,3904,3906,3908],{"class":616,"line":3903},89,[614,3905,1197],{"class":624},[614,3907,1018],{"class":620},[614,3909,3910],{"class":634},"\"test-results/certification-tests.xml\"\n",[614,3912,3914,3916,3918],{"class":616,"line":3913},90,[614,3915,1207],{"class":624},[614,3917,1018],{"class":620},[614,3919,1212],{"class":634},[614,3921,3923,3925,3927],{"class":616,"line":3922},91,[614,3924,2418],{"class":624},[614,3926,1018],{"class":620},[614,3928,3929],{"class":634},"\"System Certification Tests\"\n",[614,3931,3933,3935,3937],{"class":616,"line":3932},92,[614,3934,2689],{"class":624},[614,3936,1018],{"class":620},[614,3938,3939],{"class":634},"\"/Certification/DO-178C/System\"\n",[614,3941,3943,3945,3947],{"class":616,"line":3942},93,[614,3944,2824],{"class":624},[614,3946,1018],{"class":620},[614,3948,3949],{"class":634},"\"compliance=DO-178C,level=A,certification_ready=true\"\n",[614,3951,3953,3955,3957],{"class":616,"line":3952},94,[614,3954,2149],{"class":624},[614,3956,1018],{"class":620},[614,3958,3959],{"class":634},"\"1\"\n",[614,3961,3963,3965,3967],{"class":616,"line":3962},95,[614,3964,1217],{"class":624},[614,3966,1018],{"class":620},[614,3968,1222],{"class":634},[614,3970,3972,3974,3976],{"class":616,"line":3971},96,[614,3973,1227],{"class":624},[614,3975,1018],{"class":620},[614,3977,1232],{"class":634},[84,3979,3981],{"id":3980},"the-results","The results",[13,3983,3984,1100],{},[29,3985,3986],{},"Before integration",[47,3988,3989,3992,3995,3998,4001],{},[50,3990,3991],{},"QA engineers manually exported test results from GitLab",[50,3993,3994],{},"Imported results into QMetry through UI uploads",[50,3996,3997],{},"Process took 2-3 hours per test cycle",[50,3999,4000],{},"Human error risk in data entry",[50,4002,4003],{},"Delayed feedback to stakeholders",[13,4005,4006,1100],{},[29,4007,4008],{},"After integration",[47,4010,4011,4014,4017,4020,4023],{},[50,4012,4013],{},"Test results automatically flow from GitLab to QMetry",[50,4015,4016],{},"Complete audit trail from commit → test → result",[50,4018,4019],{},"Zero manual intervention required",[50,4021,4022],{},"Real-time visibility for certification auditors",[50,4024,4025],{},"Compliance reports generated automatically",[13,4027,4028,1100],{},[29,4029,4030],{},"Example QMetry dashboard after integration",[347,4032,4034],{"className":2716,"code":4033,"language":2718,"meta":353,"style":353},"╔════════════════════════════════════════════════════════════╗\n║  Flight Control System v2.4 - Test Execution Dashboard     ║\n╠════════════════════════════════════════════════════════════╣\n║                                                            ║\n║  📊 Test Execution Summary (Last 7 Days)                   ║\n║  ───────────────────────────────────────────────────────── ║\n║  ✓ Total Tests Executed: 1,247                             ║\n║  ✓ Passed: 1,241 (99.5%)                                   ║\n║  ✗ Failed: 6 (0.5%)                                        ║\n║  ⏸ Skipped: 0                                              ║\n║                                                            ║\n║  📁 Test Suite Organization                                ║\n║  ───────────────────────────────────────────────────────── ║\n║  └─ Certification/                                         ║\n║     └─ DO-178C/                                            ║\n║        ├─ Unit/ (487 tests, 100% pass)                     ║\n║        ├─ Integration/ (623 tests, 99.2% pass)             ║\n║        └─ System/ (137 tests, 100% pass)                   ║\n║                                                            ║\n║  🔗 Traceability                                           ║\n║  ───────────────────────────────────────────────────────── ║\n║  Requirements Covered: 342/342 (100%)                      ║\n║  Test Cases Linked: 1,247/1,247 (100%)                     ║\n║  GitLab Pipeline Executions: 47 (automated)                ║\n║                                                            ║\n║  ⚠️  Action Items                                          ║\n║  ───────────────────────────────────────────────────────── ║\n║  • 6 failed tests require investigation                    ║\n║  • Last execution: 2 minutes ago (Pipeline #1543)          ║\n║  • GitLab Commit: a7f8c23 \"Fix altitude hold logic\"        ║\n║                                                            ║\n╚════════════════════════════════════════════════════════════╝\n",[202,4035,4036,4041,4046,4051,4056,4061,4066,4071,4076,4081,4086,4090,4095,4099,4104,4109,4114,4119,4124,4128,4133,4137,4142,4147,4152,4156,4161,4165,4170,4175,4180,4184],{"__ignoreMap":353},[614,4037,4038],{"class":616,"line":617},[614,4039,4040],{},"╔════════════════════════════════════════════════════════════╗\n",[614,4042,4043],{"class":616,"line":649},[614,4044,4045],{},"║  Flight Control System v2.4 - Test Execution Dashboard     ║\n",[614,4047,4048],{"class":616,"line":661},[614,4049,4050],{},"╠════════════════════════════════════════════════════════════╣\n",[614,4052,4053],{"class":616,"line":712},[614,4054,4055],{},"║                                                            ║\n",[614,4057,4058],{"class":616,"line":745},[614,4059,4060],{},"║  📊 Test Execution Summary (Last 7 Days)                   ║\n",[614,4062,4063],{"class":616,"line":761},[614,4064,4065],{},"║  ───────────────────────────────────────────────────────── ║\n",[614,4067,4068],{"class":616,"line":771},[614,4069,4070],{},"║  ✓ Total Tests Executed: 1,247                             ║\n",[614,4072,4073],{"class":616,"line":800},[614,4074,4075],{},"║  ✓ Passed: 1,241 (99.5%)                                   ║\n",[614,4077,4078],{"class":616,"line":814},[614,4079,4080],{},"║  ✗ Failed: 6 (0.5%)                                        ║\n",[614,4082,4083],{"class":616,"line":823},[614,4084,4085],{},"║  ⏸ Skipped: 0                                              ║\n",[614,4087,4088],{"class":616,"line":852},[614,4089,4055],{},[614,4091,4092],{"class":616,"line":870},[614,4093,4094],{},"║  📁 Test Suite Organization                                ║\n",[614,4096,4097],{"class":616,"line":876},[614,4098,4065],{},[614,4100,4101],{"class":616,"line":882},[614,4102,4103],{},"║  └─ Certification/                                         ║\n",[614,4105,4106],{"class":616,"line":892},[614,4107,4108],{},"║     └─ DO-178C/                                            ║\n",[614,4110,4111],{"class":616,"line":901},[614,4112,4113],{},"║        ├─ Unit/ (487 tests, 100% pass)                     ║\n",[614,4115,4116],{"class":616,"line":908},[614,4117,4118],{},"║        ├─ Integration/ (623 tests, 99.2% pass)             ║\n",[614,4120,4121],{"class":616,"line":918},[614,4122,4123],{},"║        └─ System/ (137 tests, 100% pass)                   ║\n",[614,4125,4126],{"class":616,"line":1491},[614,4127,4055],{},[614,4129,4130],{"class":616,"line":1498},[614,4131,4132],{},"║  🔗 Traceability                                           ║\n",[614,4134,4135],{"class":616,"line":1505},[614,4136,4065],{},[614,4138,4139],{"class":616,"line":1515},[614,4140,4141],{},"║  Requirements Covered: 342/342 (100%)                      ║\n",[614,4143,4144],{"class":616,"line":1523},[614,4145,4146],{},"║  Test Cases Linked: 1,247/1,247 (100%)                     ║\n",[614,4148,4149],{"class":616,"line":1531},[614,4150,4151],{},"║  GitLab Pipeline Executions: 47 (automated)                ║\n",[614,4153,4154],{"class":616,"line":1536},[614,4155,4055],{},[614,4157,4158],{"class":616,"line":1542},[614,4159,4160],{},"║  ⚠️  Action Items                                          ║\n",[614,4162,4163],{"class":616,"line":1549},[614,4164,4065],{},[614,4166,4167],{"class":616,"line":1560},[614,4168,4169],{},"║  • 6 failed tests require investigation                    ║\n",[614,4171,4172],{"class":616,"line":1567},[614,4173,4174],{},"║  • Last execution: 2 minutes ago (Pipeline #1543)          ║\n",[614,4176,4177],{"class":616,"line":1579},[614,4178,4179],{},"║  • GitLab Commit: a7f8c23 \"Fix altitude hold logic\"        ║\n",[614,4181,4182],{"class":616,"line":1588},[614,4183,4055],{},[614,4185,4186],{"class":616,"line":1597},[614,4187,4188],{},"╚════════════════════════════════════════════════════════════╝\n",[84,4190,4192],{"id":4191},"compliance-and-audit-benefits","Compliance and audit benefits",[13,4194,4195],{},"Both financial services and aerospace organizations can leverage this integration for compliance:",[13,4197,4198,1100],{},[29,4199,4200],{},"For financial services (FCA, PSD2, SOX)",[220,4202,4203,4209,4215,4221],{},[50,4204,4205,4208],{},[29,4206,4207],{},"Automated traceability",": Link regulatory requirements → test cases → execution results → GitLab commits",[50,4210,4211,4214],{},[29,4212,4213],{},"Audit-ready documentation",": Complete test execution history with timestamps and pipeline references",[50,4216,4217,4220],{},[29,4218,4219],{},"Risk management",": Real-time quality dashboards for risk assessment",[50,4222,4223,4226],{},[29,4224,4225],{},"Regulatory reporting",": Generate compliance reports directly from QMetry test data",[13,4228,4229,1100],{},[29,4230,4231],{},"For aerospace certification (DO-178C, DO-254)",[220,4233,4234,4240,4246,4252],{},[50,4235,4236,4239],{},[29,4237,4238],{},"Automated traceability matrix",": QMetry links requirements → test cases → execution results → GitLab commits",[50,4241,4242,4245],{},[29,4243,4244],{},"Immutable audit trail",": Every test execution is timestamped with pipeline ID, commit SHA, and executor",[50,4247,4248,4251],{},[29,4249,4250],{},"Certification package generation",": QMetry generates compliant documentation pulling data from GitLab pipelines",[50,4253,4254,4257],{},[29,4255,4256],{},"Real-time compliance dashboards",": Auditors can view test coverage and execution history in real-time",[76,4259,4261],{"id":4260},"complete-configuration-reference","Complete configuration reference",[13,4263,4264],{},"Here's a comprehensive reference of all available component inputs:",[413,4266,4267,4282],{},[416,4268,4269],{},[419,4270,4271,4274,4277,4280],{},[422,4272,4273],{},"Input Parameter",[422,4275,4276],{},"Required",[422,4278,4279],{},"Default",[422,4281,1247],{},[429,4283,4284,4300,4317,4332,4345,4366,4388,4410,4426,4442,4461,4483,4501,4518,4531],{},[419,4285,4286,4290,4293,4297],{},[434,4287,4288],{},[202,4289,1259],{},[434,4291,4292],{},"No",[434,4294,4295],{},[202,4296,1007],{},[434,4298,4299],{},"GitLab CI/CD stage for the upload job",[419,4301,4302,4307,4309,4314],{},[434,4303,4304],{},[202,4305,4306],{},"runner_tag",[434,4308,4292],{},[434,4310,4311],{},[202,4312,4313],{},"\"\"",[434,4315,4316],{},"Specific runner tag to use (empty = any available runner)",[419,4318,4319,4323,4326,4329],{},[434,4320,4321],{},[202,4322,1273],{},[434,4324,4325],{},"Yes",[434,4327,4328],{},"-",[434,4330,4331],{},"QMetry project name or key",[419,4333,4334,4338,4340,4342],{},[434,4335,4336],{},[202,4337,1288],{},[434,4339,4325],{},[434,4341,4328],{},[434,4343,4344],{},"Path to test results file (relative to project root)",[419,4346,4347,4351,4353,4355],{},[434,4348,4349],{},[202,4350,1303],{},[434,4352,4325],{},[434,4354,4328],{},[434,4356,4357,4358,1316,4361,1316,4363,4365],{},"Test result format: ",[202,4359,4360],{},"JUNIT",[202,4362,1315],{},[202,4364,1319],{},", etc.",[419,4367,4368,4373,4375,4379],{},[434,4369,4370],{},[202,4371,4372],{},"skip_warning",[434,4374,4292],{},[434,4376,4377],{},[202,4378,691],{},[434,4380,4381,4382,4384,4385,4387],{},"Skip warnings during import (",[202,4383,691],{}," = skip, ",[202,4386,699],{}," = show)",[419,4389,4390,4395,4397,4402],{},[434,4391,4392],{},[202,4393,4394],{},"is_matching_required",[434,4396,4292],{},[434,4398,4399],{},[202,4400,4401],{},"\"false\"",[434,4403,4404,4405,287,4408,525],{},"Match existing test cases by name (",[202,4406,4407],{},"\"true\"",[202,4409,4401],{},[419,4411,4412,4417,4419,4423],{},[434,4413,4414],{},[202,4415,4416],{},"testsuite_name",[434,4418,4292],{},[434,4420,4421],{},[202,4422,4313],{},[434,4424,4425],{},"Name for the test suite in QMetry",[419,4427,4428,4433,4435,4439],{},[434,4429,4430],{},[202,4431,4432],{},"testsuite_id",[434,4434,4292],{},[434,4436,4437],{},[202,4438,4313],{},[434,4440,4441],{},"Existing test suite ID to append results to",[419,4443,4444,4449,4451,4455],{},[434,4445,4446],{},[202,4447,4448],{},"testsuite_folder_path",[434,4450,4292],{},[434,4452,4453],{},[202,4454,4313],{},[434,4456,4457,4458,525],{},"Folder path for organizing test suites (e.g., ",[202,4459,4460],{},"/Regression/Sprint-23",[419,4462,4463,4467,4469,4473],{},[434,4464,4465],{},[202,4466,2084],{},[434,4468,4292],{},[434,4470,4471],{},[202,4472,4313],{},[434,4474,4475,4476,1316,4478,1316,4480,1320],{},"Hierarchy level for test organization (",[202,4477,691],{},[202,4479,2154],{},[202,4481,4482],{},"\"3\"",[419,4484,4485,4489,4491,4495],{},[434,4486,4487],{},[202,4488,2755],{},[434,4490,4292],{},[434,4492,4493],{},[202,4494,4313],{},[434,4496,4497,4498,525],{},"Custom fields for test cases (comma-separated: ",[202,4499,4500],{},"field1=value1,field2=value2",[419,4502,4503,4507,4509,4513],{},[434,4504,4505],{},[202,4506,2759],{},[434,4508,4292],{},[434,4510,4511],{},[202,4512,4313],{},[434,4514,4515,4516,525],{},"Custom fields for test suites (comma-separated: ",[202,4517,4500],{},[419,4519,4520,4524,4526,4528],{},[434,4521,4522],{},[202,4523,1327],{},[434,4525,4325],{},[434,4527,4328],{},[434,4529,4530],{},"QMetry instance URL (store in CI/CD variable)",[419,4532,4533,4537,4539,4541],{},[434,4534,4535],{},[202,4536,1343],{},[434,4538,4325],{},[434,4540,4328],{},[434,4542,4543],{},"QMetry API key (store in CI/CD variable, masked)",[76,4545,4547],{"id":4546},"best-practices-for-production-use","Best practices for production use",[13,4549,4550],{},"As you scale your integration, follow these best practices:",[84,4552,558],{"id":4553},"security",[47,4555,4556,4563,4569,4575,4581],{},[50,4557,4558,4559,4562],{},"✅ ",[29,4560,4561],{},"Always use CI/CD variables"," for sensitive data (API keys, URLs)",[50,4564,4558,4565,4568],{},[29,4566,4567],{},"Mask and protect"," API key variables",[50,4570,4558,4571,4574],{},[29,4572,4573],{},"Rotate API keys"," periodically (quarterly recommended)",[50,4576,4558,4577,4580],{},[29,4578,4579],{},"Restrict API key permissions"," to minimum required (write to test results only)",[50,4582,4558,4583,4586],{},[29,4584,4585],{},"Use protected branches"," for production test uploads",[84,4588,4590],{"id":4589},"performance","Performance",[47,4592,4593,4599,4605,4611],{},[50,4594,4558,4595,4598],{},[29,4596,4597],{},"Keep test result files reasonable size"," (\u003C 10 MB recommended)",[50,4600,4558,4601,4604],{},[29,4602,4603],{},"Split large test suites"," into multiple jobs/files",[50,4606,4558,4607,4610],{},[29,4608,4609],{},"Use parallel test execution"," to reduce pipeline duration",[50,4612,4558,4613,4616],{},[29,4614,4615],{},"Cache dependencies"," to speed up test execution",[84,4618,4620],{"id":4619},"organization","Organization",[47,4622,4623,4629,4635,4641],{},[50,4624,4558,4625,4628],{},[29,4626,4627],{},"Use consistent naming conventions"," for test suites and folder paths",[50,4630,4558,4631,4634],{},[29,4632,4633],{},"Leverage custom fields"," for filtering and reporting",[50,4636,4558,4637,4640],{},[29,4638,4639],{},"Create folder hierarchies"," that mirror your test strategy",[50,4642,4558,4643,4646],{},[29,4644,4645],{},"Document your integration"," in project README files",[84,4648,4650],{"id":4649},"troubleshooting","Troubleshooting",[47,4652,4653,4659,4668,4674],{},[50,4654,4558,4655,4658],{},[29,4656,4657],{},"Review job logs"," for API communication details",[50,4660,4558,4661,4664,4665,4667],{},[29,4662,4663],{},"Verify test result file format"," matches ",[202,4666,1303],{}," parameter",[50,4669,4558,4670,4673],{},[29,4671,4672],{},"Check QMetry project exists"," and API key has access",[50,4675,4558,4676,4679],{},[29,4677,4678],{},"Ensure test result files"," are available as pipeline artifacts",[76,4681,4683],{"id":4682},"summary-and-next-steps","Summary and next steps",[13,4685,4686],{},"Congratulations! You've successfully integrated GitLab CI/CD with QMetry Test Management Enterprise. Your setup now provides:",[47,4688,4689,4695,4700,4705,4711],{},[50,4690,4691,4694],{},[29,4692,4693],{},"Automated test result uploads"," – No more manual exports and imports",[50,4696,4697,4699],{},[29,4698,3176],{}," – QA teams see results immediately after pipeline execution",[50,4701,4702,4704],{},[29,4703,3214],{}," – Link GitLab commits, pipelines, and test executions",[50,4706,4707,4710],{},[29,4708,4709],{},"Enhanced compliance"," – Maintain audit trails for regulated industries",[50,4712,4713,4716],{},[29,4714,4715],{},"Scalable quality processes"," – Support growing test suites without added overhead",[84,4718,4720],{"id":4719},"what-happens-now","What happens now",[13,4722,4723],{},"Every time your GitLab pipeline runs:",[220,4725,4726,4729,4732,4735,4738],{},[50,4727,4728],{},"Tests execute and generate result files.",[50,4730,4731],{},"The QMetry component automatically uploads results to your instance.",[50,4733,4734],{},"QA teams, stakeholders, and auditors see results in QMetry dashboards.",[50,4736,4737],{},"AI-powered insights analyze execution patterns and identify improvements.",[50,4739,4740],{},"Compliance reports generate automatically with full traceability.",[84,4742,4744],{"id":4743},"expand-your-integration","Expand your integration",[13,4746,4747],{},"Now that you have the basic integration working, consider these advanced scenarios:",[47,4749,4750,4756,4762,4768],{},[50,4751,4752,4755],{},[29,4753,4754],{},"Bi-directional integration",": Use QMetry's API to trigger GitLab pipelines from test management workflows.",[50,4757,4758,4761],{},[29,4759,4760],{},"Multi-project deployments",": Scale the component across your organization's GitLab projects.",[50,4763,4764,4767],{},[29,4765,4766],{},"Custom reporting",": Build dashboards combining GitLab pipeline metrics with QMetry test analytics.",[50,4769,4770,4773],{},[29,4771,4772],{},"Scheduled test execution",": Use GitLab scheduled pipelines to run regression suites nightly.",[76,4775,4777],{"id":4776},"learn-more-and-get-help","Learn more and get help",[84,4779,4781],{"id":4780},"documentation-and-resources","Documentation and resources",[47,4783,4784,4792,4802,4812],{},[50,4785,4786,1018,4789],{},[29,4787,4788],{},"Component documentation",[34,4790,38],{"href":36,"rel":4791},[],[50,4793,4794,1018,4797],{},[29,4795,4796],{},"QMetry documentation",[34,4798,4801],{"href":4799,"rel":4800},"https://qmetrysupport.atlassian.net/wiki/spaces/QPro/overview",[],"QMetry Support Portal",[50,4803,4804,1018,4807],{},[29,4805,4806],{},"SmartBear resources",[34,4808,4811],{"href":4809,"rel":4810},"https://smartbear.com/resources/",[],"SmartBear Academy",[50,4813,4814,1018,4817],{},[29,4815,4816],{},"GitLab CI/CD documentation",[34,4818,4821],{"href":4819,"rel":4820},"https://docs.gitlab.com/ci/",[],"GitLab CI/CD Documentation",[84,4823,4825],{"id":4824},"support","Support",[13,4827,4828,1100],{},[29,4829,4830],{},"For component technical questions",[47,4832,4833,4841,4844],{},[50,4834,4835,4836,1974],{},"Visit the ",[34,4837,4840],{"href":4838,"rel":4839},"https://gitlab.com/sb9945614/qtm-gitlab-component",[],"component repository",[50,4842,4843],{},"Open an issue on the project.",[50,4845,4846],{},"Check existing issues for common questions.",[13,4848,4849,1100],{},[29,4850,4851],{},"For QMetry product questions",[47,4853,4854,4861],{},[50,4855,4856,4857,1974],{},"Contact SmartBear support at ",[34,4858,4860],{"href":4859},"mailto:support@smartbear.com","support@smartbear.com",[50,4862,4835,4863,1974],{},[34,4864,4867],{"href":4865,"rel":4866},"https://community.smartbear.com/",[],"QMetry Community Forum",[4869,4870,4871],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sB1qb, html code.shiki .sB1qb{--shiki-default:#B31D28;--shiki-default-font-style:italic}",{"title":353,"searchDepth":649,"depth":649,"links":4873},[4874,4881,4882,4885,4890,4895,4899,4910,4916,4917,4923,4927],{"id":78,"depth":649,"text":79,"children":4875},[4876,4877,4878,4879,4880],{"id":86,"depth":661,"text":87},{"id":102,"depth":661,"text":103},{"id":112,"depth":661,"text":113},{"id":122,"depth":661,"text":123},{"id":138,"depth":661,"text":139},{"id":154,"depth":649,"text":155},{"id":164,"depth":649,"text":165,"children":4883},[4884],{"id":214,"depth":661,"text":215},{"id":257,"depth":649,"text":258,"children":4886},[4887,4888,4889],{"id":264,"depth":661,"text":265},{"id":294,"depth":661,"text":295},{"id":341,"depth":661,"text":342},{"id":370,"depth":649,"text":371,"children":4891},[4892,4893,4894],{"id":377,"depth":661,"text":378},{"id":407,"depth":661,"text":408},{"id":485,"depth":661,"text":486},{"id":580,"depth":649,"text":581,"children":4896},[4897,4898],{"id":587,"depth":661,"text":588},{"id":987,"depth":661,"text":988},{"id":1123,"depth":649,"text":1124,"children":4900},[4901,4902,4903,4904,4905,4906,4907,4908,4909],{"id":1130,"depth":661,"text":1131},{"id":1354,"depth":661,"text":1355},{"id":1624,"depth":661,"text":1625},{"id":1683,"depth":661,"text":1684},{"id":2077,"depth":661,"text":2078},{"id":2201,"depth":661,"text":2202},{"id":2526,"depth":661,"text":2527},{"id":2621,"depth":661,"text":2622},{"id":2748,"depth":661,"text":2749},{"id":2861,"depth":649,"text":2862,"children":4911},[4912,4913,4914,4915],{"id":2868,"depth":661,"text":2869},{"id":3192,"depth":661,"text":3193},{"id":3980,"depth":661,"text":3981},{"id":4191,"depth":661,"text":4192},{"id":4260,"depth":649,"text":4261},{"id":4546,"depth":649,"text":4547,"children":4918},[4919,4920,4921,4922],{"id":4553,"depth":661,"text":558},{"id":4589,"depth":661,"text":4590},{"id":4619,"depth":661,"text":4620},{"id":4649,"depth":661,"text":4650},{"id":4682,"depth":649,"text":4683,"children":4924},[4925,4926],{"id":4719,"depth":661,"text":4720},{"id":4743,"depth":661,"text":4744},{"id":4776,"depth":649,"text":4777,"children":4928},[4929,4930],{"id":4780,"depth":661,"text":4781},{"id":4824,"depth":661,"text":4825},"product","2026-04-07","Learn how to automatically upload test results from GitLab CI/CD pipelines to SmartBear QMetry Test Management Enterprise using the CI/CD Catalog component.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1775486753/cswmwtygkgkbdsibo09v.png",{},"/en-us/blog/streamline-test-management-with-the-smartbear-qmetry-gitlab-component",{"config":4940,"title":4942,"description":4933},{"noIndex":4941},false,"Streamline test management with SmartBear QMetry GitLab component","streamline-test-management-with-the-smartbear-qmetry-gitlab-component","en-us/blog/streamline-test-management-with-the-smartbear-qmetry-gitlab-component",[4946,4931,4947],"tutorial","devops","BlogPost","v9l2BPZ6y7oinky5D4hGJyRaOSmjnulbzmtonl7uK4U",{"logo":4951,"freeTrial":4956,"sales":4961,"login":4966,"items":4971,"search":5296,"minimal":5327,"duo":5346,"switchNav":5355,"pricingDeployment":5366},{"config":4952},{"href":4953,"dataGaName":4954,"dataGaLocation":4955},"/","gitlab logo","header",{"text":4957,"config":4958},"Get free trial",{"href":4959,"dataGaName":4960,"dataGaLocation":4955},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":4962,"config":4963},"Request a demo",{"href":4964,"dataGaName":4965,"dataGaLocation":4955},"/sales/?contact-topic=request-demo","sales",{"text":4967,"config":4968},"Sign in",{"href":4969,"dataGaName":4970,"dataGaLocation":4955},"https://gitlab.com/users/sign_in/","sign in",[4972,5001,5099,5104,5218,5274],{"text":4973,"config":4974,"menu":4976},"Platform",{"dataNavLevelOne":4975},"platform",{"type":4977,"columns":4978},"cards",[4979,4985,4993],{"title":4973,"description":4980,"link":4981},"The intelligent orchestration platform for DevSecOps",{"text":4982,"config":4983},"Explore our Platform",{"href":4984,"dataGaName":4975,"dataGaLocation":4955},"/platform/",{"title":4986,"description":4987,"link":4988},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":4989,"config":4990},"Meet GitLab Duo",{"href":4991,"dataGaName":4992,"dataGaLocation":4955},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":4994,"description":4995,"link":4996},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":4997,"config":4998},"Learn more",{"href":4999,"dataGaName":5000,"dataGaLocation":4955},"/why-gitlab/","why gitlab",{"text":5002,"left":1391,"config":5003,"menu":5005},"Product",{"dataNavLevelOne":5004},"solutions",{"type":5006,"link":5007,"columns":5011,"feature":5079},"lists",{"text":5008,"config":5009},"View all Solutions",{"href":5010,"dataGaName":5004,"dataGaLocation":4955},"/solutions/",[5012,5036,5058],{"title":5013,"description":5014,"link":5015,"items":5020},"Automation","CI/CD and automation to accelerate deployment",{"config":5016},{"icon":5017,"href":5018,"dataGaName":5019,"dataGaLocation":4955},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[5021,5025,5028,5032],{"text":5022,"config":5023},"CI/CD",{"href":5024,"dataGaLocation":4955,"dataGaName":5022},"/solutions/continuous-integration/",{"text":4986,"config":5026},{"href":4991,"dataGaLocation":4955,"dataGaName":5027},"gitlab duo agent platform - product menu",{"text":5029,"config":5030},"Source Code Management",{"href":5031,"dataGaLocation":4955,"dataGaName":5029},"/solutions/source-code-management/",{"text":5033,"config":5034},"Automated Software Delivery",{"href":5018,"dataGaLocation":4955,"dataGaName":5035},"Automated software delivery",{"title":558,"description":5037,"link":5038,"items":5043},"Deliver code faster without compromising security",{"config":5039},{"href":5040,"dataGaName":5041,"dataGaLocation":4955,"icon":5042},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[5044,5048,5053],{"text":5045,"config":5046},"Application Security Testing",{"href":5040,"dataGaName":5047,"dataGaLocation":4955},"Application security testing",{"text":5049,"config":5050},"Software Supply Chain Security",{"href":5051,"dataGaLocation":4955,"dataGaName":5052},"/solutions/supply-chain/","Software supply chain security",{"text":5054,"config":5055},"Software Compliance",{"href":5056,"dataGaName":5057,"dataGaLocation":4955},"/solutions/software-compliance/","software compliance",{"title":5059,"link":5060,"items":5065},"Measurement",{"config":5061},{"icon":5062,"href":5063,"dataGaName":5064,"dataGaLocation":4955},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[5066,5070,5074],{"text":5067,"config":5068},"Visibility & Measurement",{"href":5063,"dataGaLocation":4955,"dataGaName":5069},"Visibility and Measurement",{"text":5071,"config":5072},"Value Stream Management",{"href":5073,"dataGaLocation":4955,"dataGaName":5071},"/solutions/value-stream-management/",{"text":5075,"config":5076},"Analytics & Insights",{"href":5077,"dataGaLocation":4955,"dataGaName":5078},"/solutions/analytics-and-insights/","Analytics and insights",{"title":5080,"type":5006,"items":5081},"GitLab for",[5082,5088,5094],{"text":5083,"config":5084},"Enterprise",{"icon":5085,"href":5086,"dataGaLocation":4955,"dataGaName":5087},"Building","/enterprise/","enterprise",{"text":5089,"config":5090},"Small Business",{"icon":5091,"href":5092,"dataGaLocation":4955,"dataGaName":5093},"Work","/small-business/","small business",{"text":5095,"config":5096},"Public Sector",{"icon":4620,"href":5097,"dataGaLocation":4955,"dataGaName":5098},"/solutions/public-sector/","public sector",{"text":5100,"config":5101},"Pricing",{"href":5102,"dataGaName":5103,"dataGaLocation":4955,"dataNavLevelOne":5103},"/pricing/","pricing",{"text":5105,"config":5106,"menu":5108},"Resources",{"dataNavLevelOne":5107},"resources",{"type":5006,"link":5109,"columns":5113,"feature":5207},{"text":5110,"config":5111},"View all resources",{"href":5112,"dataGaName":5107,"dataGaLocation":4955},"/resources/",[5114,5147,5174],{"title":5115,"items":5116},"Getting started",[5117,5122,5127,5132,5137,5142],{"text":5118,"config":5119},"Install",{"href":5120,"dataGaName":5121,"dataGaLocation":4955},"/install/","install",{"text":5123,"config":5124},"Quick start guides",{"href":5125,"dataGaName":5126,"dataGaLocation":4955},"/get-started/","quick setup checklists",{"text":5128,"config":5129},"Learn",{"href":5130,"dataGaLocation":4955,"dataGaName":5131},"https://university.gitlab.com/","learn",{"text":5133,"config":5134},"Product documentation",{"href":5135,"dataGaName":5136,"dataGaLocation":4955},"https://docs.gitlab.com/","product documentation",{"text":5138,"config":5139},"Best practice videos",{"href":5140,"dataGaName":5141,"dataGaLocation":4955},"/getting-started-videos/","best practice videos",{"text":5143,"config":5144},"Integrations",{"href":5145,"dataGaName":5146,"dataGaLocation":4955},"/integrations/","integrations",{"title":5148,"items":5149},"Discover",[5150,5155,5160,5165,5169],{"text":5151,"config":5152},"Customer success stories",{"href":5153,"dataGaName":5154,"dataGaLocation":4955},"/customers/","customer success stories",{"text":5156,"config":5157},"Blog",{"href":5158,"dataGaName":5159,"dataGaLocation":4955},"/blog/","blog",{"text":5161,"config":5162},"Demo Hub",{"href":5163,"dataGaName":5164,"dataGaLocation":4955},"/demo-hub/","demo hub",{"text":5166,"config":5167},"The Source",{"href":5168,"dataGaName":5159,"dataGaLocation":4955},"/the-source/",{"text":5170,"config":5171},"Remote",{"href":5172,"dataGaName":5173,"dataGaLocation":4955},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":5175,"items":5176},"Connect",[5177,5182,5187,5192,5197,5202],{"text":5178,"config":5179},"GitLab Services",{"href":5180,"dataGaName":5181,"dataGaLocation":4955},"/services/","services",{"text":5183,"config":5184},"Contribute",{"href":5185,"dataGaName":5186,"dataGaLocation":4955},"https://contributors.gitlab.com","contribute",{"text":5188,"config":5189},"Community",{"href":5190,"dataGaName":5191,"dataGaLocation":4955},"/community/","community",{"text":5193,"config":5194},"Forum",{"href":5195,"dataGaName":5196,"dataGaLocation":4955},"https://forum.gitlab.com/","forum",{"text":5198,"config":5199},"Events",{"href":5200,"dataGaName":5201,"dataGaLocation":4955},"/events/","events",{"text":5203,"config":5204},"Partners",{"href":5205,"dataGaName":5206,"dataGaLocation":4955},"/partners/","partners",{"config":5208,"title":5211,"text":5212,"link":5213},{"background":5209,"textColor":5210},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":5214,"config":5215},"Read the latest",{"href":5216,"dataGaName":5217,"dataGaLocation":4955},"/whats-new/","whats new",{"text":5219,"config":5220,"menu":5222},"Company",{"dataNavLevelOne":5221},"company",{"type":5006,"columns":5223},[5224],{"items":5225},[5226,5231,5237,5239,5244,5249,5254,5259,5264,5269],{"text":5227,"config":5228},"About",{"href":5229,"dataGaName":5230,"dataGaLocation":4955},"/company/","about",{"text":5232,"config":5233,"footerGa":5236},"Jobs",{"href":5234,"dataGaName":5235,"dataGaLocation":4955},"/jobs/","jobs",{"dataGaName":5235},{"text":5198,"config":5238},{"href":5200,"dataGaName":5201,"dataGaLocation":4955},{"text":5240,"config":5241},"Leadership",{"href":5242,"dataGaName":5243,"dataGaLocation":4955},"/company/team/e-group/","leadership",{"text":5245,"config":5246},"Handbook",{"href":5247,"dataGaName":5248,"dataGaLocation":4955},"https://handbook.gitlab.com/","handbook",{"text":5250,"config":5251},"Investor relations",{"href":5252,"dataGaName":5253,"dataGaLocation":4955},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":5255,"config":5256},"Trust Center",{"href":5257,"dataGaName":5258,"dataGaLocation":4955},"/security/","trust center",{"text":5260,"config":5261},"AI Transparency Center",{"href":5262,"dataGaName":5263,"dataGaLocation":4955},"/ai-transparency-center/","ai transparency center",{"text":5265,"config":5266},"Newsletter",{"href":5267,"dataGaName":5268,"dataGaLocation":4955},"/company/contact/#contact-forms","newsletter",{"text":5270,"config":5271},"Press",{"href":5272,"dataGaName":5273,"dataGaLocation":4955},"/press/","press",{"text":5275,"config":5276,"menu":5277},"Contact us",{"dataNavLevelOne":5221},{"type":5006,"columns":5278},[5279],{"items":5280},[5281,5286,5291],{"text":5282,"config":5283},"Talk to sales",{"href":5284,"dataGaName":5285,"dataGaLocation":4955},"/sales/","talk to sales",{"text":5287,"config":5288},"Support portal",{"href":5289,"dataGaName":5290,"dataGaLocation":4955},"https://support.gitlab.com/hc/en-us","support portal",{"text":5292,"config":5293},"Customer portal",{"href":5294,"dataGaName":5295,"dataGaLocation":4955},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":5297,"login":5298,"suggestions":5305},"Close",{"text":5299,"link":5300},"To search repositories and projects, login to",{"text":5301,"config":5302},"gitlab.com",{"href":4969,"dataGaName":5303,"dataGaLocation":5304},"search login","search",{"text":5306,"default":5307},"Suggestions",[5308,5310,5314,5316,5320,5324],{"text":4986,"config":5309},{"href":4991,"dataGaName":4986,"dataGaLocation":5304},{"text":5311,"config":5312},"Code Suggestions (AI)",{"href":5313,"dataGaName":5311,"dataGaLocation":5304},"/solutions/code-suggestions/",{"text":5022,"config":5315},{"href":5024,"dataGaName":5022,"dataGaLocation":5304},{"text":5317,"config":5318},"GitLab on AWS",{"href":5319,"dataGaName":5317,"dataGaLocation":5304},"/partners/technology-partners/aws/",{"text":5321,"config":5322},"GitLab on Google Cloud",{"href":5323,"dataGaName":5321,"dataGaLocation":5304},"/partners/technology-partners/google-cloud-platform/",{"text":5325,"config":5326},"Why GitLab?",{"href":4999,"dataGaName":5325,"dataGaLocation":5304},{"freeTrial":5328,"mobileIcon":5333,"desktopIcon":5338,"secondaryButton":5341},{"text":5329,"config":5330},"Start free trial",{"href":5331,"dataGaName":4960,"dataGaLocation":5332},"https://gitlab.com/-/trials/new/","nav",{"altText":5334,"config":5335},"Gitlab Icon",{"src":5336,"dataGaName":5337,"dataGaLocation":5332},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":5334,"config":5339},{"src":5340,"dataGaName":5337,"dataGaLocation":5332},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":5342,"config":5343},"Get Started",{"href":5344,"dataGaName":5345,"dataGaLocation":5332},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":5347,"mobileIcon":5351,"desktopIcon":5353},{"text":5348,"config":5349},"Learn more about GitLab Duo",{"href":4991,"dataGaName":5350,"dataGaLocation":5332},"gitlab duo",{"altText":5334,"config":5352},{"src":5336,"dataGaName":5337,"dataGaLocation":5332},{"altText":5334,"config":5354},{"src":5340,"dataGaName":5337,"dataGaLocation":5332},{"button":5356,"mobileIcon":5361,"desktopIcon":5363},{"text":5357,"config":5358},"/switch",{"href":5359,"dataGaName":5360,"dataGaLocation":5332},"#contact","switch",{"altText":5334,"config":5362},{"src":5336,"dataGaName":5337,"dataGaLocation":5332},{"altText":5334,"config":5364},{"src":5365,"dataGaName":5337,"dataGaLocation":5332},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":5367,"mobileIcon":5372,"desktopIcon":5374},{"text":5368,"config":5369},"Back to pricing",{"href":5102,"dataGaName":5370,"dataGaLocation":5332,"icon":5371},"back to pricing","GoBack",{"altText":5334,"config":5373},{"src":5336,"dataGaName":5337,"dataGaLocation":5332},{"altText":5334,"config":5375},{"src":5340,"dataGaName":5337,"dataGaLocation":5332},{"title":5377,"titleMobile":5378,"button":5379,"config":5384},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":4997,"config":5380},{"href":5381,"dataGaName":5382,"dataGaLocation":5383},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":5385,"disabled":4941},"release",{"data":5387},{"text":5388,"source":5389,"edit":5395,"contribute":5400,"config":5405,"items":5410,"minimal":5619},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":5390,"config":5391},"View page source",{"href":5392,"dataGaName":5393,"dataGaLocation":5394},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":5396,"config":5397},"Edit this page",{"href":5398,"dataGaName":5399,"dataGaLocation":5394},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":5401,"config":5402},"Please contribute",{"href":5403,"dataGaName":5404,"dataGaLocation":5394},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":5406,"facebook":5407,"youtube":5408,"linkedin":5409},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[5411,5458,5511,5555,5587],{"title":5100,"links":5412,"subMenu":5427},[5413,5417,5422],{"text":5414,"config":5415},"View plans",{"href":5102,"dataGaName":5416,"dataGaLocation":5394},"view plans",{"text":5418,"config":5419},"Why Premium?",{"href":5420,"dataGaName":5421,"dataGaLocation":5394},"/pricing/premium/","why premium",{"text":5423,"config":5424},"Why Ultimate?",{"href":5425,"dataGaName":5426,"dataGaLocation":5394},"/pricing/ultimate/","why ultimate",[5428],{"title":5429,"links":5430},"Contact Us",[5431,5434,5436,5438,5443,5448,5453],{"text":5432,"config":5433},"Contact sales",{"href":5284,"dataGaName":4965,"dataGaLocation":5394},{"text":5287,"config":5435},{"href":5289,"dataGaName":5290,"dataGaLocation":5394},{"text":5292,"config":5437},{"href":5294,"dataGaName":5295,"dataGaLocation":5394},{"text":5439,"config":5440},"Status",{"href":5441,"dataGaName":5442,"dataGaLocation":5394},"https://status.gitlab.com/","status",{"text":5444,"config":5445},"Terms of use",{"href":5446,"dataGaName":5447,"dataGaLocation":5394},"/terms/","terms of use",{"text":5449,"config":5450},"Privacy statement",{"href":5451,"dataGaName":5452,"dataGaLocation":5394},"/privacy/","privacy statement",{"text":5454,"config":5455},"Cookie preferences",{"dataGaName":5456,"dataGaLocation":5394,"id":5457,"isOneTrustButton":1391},"cookie preferences","ot-sdk-btn",{"title":5002,"links":5459,"subMenu":5468},[5460,5464],{"text":5461,"config":5462},"DevSecOps platform",{"href":4984,"dataGaName":5463,"dataGaLocation":5394},"devsecops platform",{"text":5465,"config":5466},"AI-Assisted Development",{"href":4991,"dataGaName":5467,"dataGaLocation":5394},"ai-assisted development",[5469],{"title":5470,"links":5471},"Topics",[5472,5477,5482,5486,5491,5496,5501,5506],{"text":5473,"config":5474},"CICD",{"href":5475,"dataGaName":5476,"dataGaLocation":5394},"/topics/ci-cd/","cicd",{"text":5478,"config":5479},"GitOps",{"href":5480,"dataGaName":5481,"dataGaLocation":5394},"/topics/gitops/","gitops",{"text":5483,"config":5484},"DevOps",{"href":5485,"dataGaName":4947,"dataGaLocation":5394},"/topics/devops/",{"text":5487,"config":5488},"Version Control",{"href":5489,"dataGaName":5490,"dataGaLocation":5394},"/topics/version-control/","version control",{"text":5492,"config":5493},"DevSecOps",{"href":5494,"dataGaName":5495,"dataGaLocation":5394},"/topics/devsecops/","devsecops",{"text":5497,"config":5498},"Cloud Native",{"href":5499,"dataGaName":5500,"dataGaLocation":5394},"/topics/cloud-native/","cloud native",{"text":5502,"config":5503},"AI for Coding",{"href":5504,"dataGaName":5505,"dataGaLocation":5394},"/topics/devops/ai-for-coding/","ai for coding",{"text":5507,"config":5508},"Agentic AI",{"href":5509,"dataGaName":5510,"dataGaLocation":5394},"/topics/agentic-ai/","agentic ai",{"title":5512,"links":5513},"Solutions",[5514,5516,5518,5523,5527,5530,5534,5537,5539,5542,5545,5550],{"text":5045,"config":5515},{"href":5040,"dataGaName":5045,"dataGaLocation":5394},{"text":5035,"config":5517},{"href":5018,"dataGaName":5019,"dataGaLocation":5394},{"text":5519,"config":5520},"Agile development",{"href":5521,"dataGaName":5522,"dataGaLocation":5394},"/solutions/agile-delivery/","agile delivery",{"text":5524,"config":5525},"SCM",{"href":5031,"dataGaName":5526,"dataGaLocation":5394},"source code management",{"text":5473,"config":5528},{"href":5024,"dataGaName":5529,"dataGaLocation":5394},"continuous integration & delivery",{"text":5531,"config":5532},"Value stream management",{"href":5073,"dataGaName":5533,"dataGaLocation":5394},"value stream management",{"text":5478,"config":5535},{"href":5536,"dataGaName":5481,"dataGaLocation":5394},"/solutions/gitops/",{"text":5083,"config":5538},{"href":5086,"dataGaName":5087,"dataGaLocation":5394},{"text":5540,"config":5541},"Small business",{"href":5092,"dataGaName":5093,"dataGaLocation":5394},{"text":5543,"config":5544},"Public sector",{"href":5097,"dataGaName":5098,"dataGaLocation":5394},{"text":5546,"config":5547},"Education",{"href":5548,"dataGaName":5549,"dataGaLocation":5394},"/solutions/education/","education",{"text":5551,"config":5552},"Financial services",{"href":5553,"dataGaName":5554,"dataGaLocation":5394},"/solutions/finance/","financial services",{"title":5105,"links":5556},[5557,5559,5561,5563,5566,5568,5571,5573,5575,5577,5579,5581,5583,5585],{"text":5118,"config":5558},{"href":5120,"dataGaName":5121,"dataGaLocation":5394},{"text":5123,"config":5560},{"href":5125,"dataGaName":5126,"dataGaLocation":5394},{"text":5128,"config":5562},{"href":5130,"dataGaName":5131,"dataGaLocation":5394},{"text":5133,"config":5564},{"href":5135,"dataGaName":5565,"dataGaLocation":5394},"docs",{"text":5156,"config":5567},{"href":5158,"dataGaName":5159,"dataGaLocation":5394},{"text":5569,"config":5570},"What's new",{"href":5216,"dataGaName":5217,"dataGaLocation":5394},{"text":5151,"config":5572},{"href":5153,"dataGaName":5154,"dataGaLocation":5394},{"text":5170,"config":5574},{"href":5172,"dataGaName":5173,"dataGaLocation":5394},{"text":5178,"config":5576},{"href":5180,"dataGaName":5181,"dataGaLocation":5394},{"text":5183,"config":5578},{"href":5185,"dataGaName":5186,"dataGaLocation":5394},{"text":5188,"config":5580},{"href":5190,"dataGaName":5191,"dataGaLocation":5394},{"text":5193,"config":5582},{"href":5195,"dataGaName":5196,"dataGaLocation":5394},{"text":5198,"config":5584},{"href":5200,"dataGaName":5201,"dataGaLocation":5394},{"text":5203,"config":5586},{"href":5205,"dataGaName":5206,"dataGaLocation":5394},{"title":5219,"links":5588},[5589,5591,5593,5595,5597,5599,5603,5608,5610,5612,5614],{"text":5227,"config":5590},{"href":5229,"dataGaName":5221,"dataGaLocation":5394},{"text":5232,"config":5592},{"href":5234,"dataGaName":5235,"dataGaLocation":5394},{"text":5240,"config":5594},{"href":5242,"dataGaName":5243,"dataGaLocation":5394},{"text":5245,"config":5596},{"href":5247,"dataGaName":5248,"dataGaLocation":5394},{"text":5250,"config":5598},{"href":5252,"dataGaName":5253,"dataGaLocation":5394},{"text":5600,"config":5601},"Sustainability",{"href":5602,"dataGaName":5600,"dataGaLocation":5394},"/sustainability/",{"text":5604,"config":5605},"Diversity, inclusion and belonging (DIB)",{"href":5606,"dataGaName":5607,"dataGaLocation":5394},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":5255,"config":5609},{"href":5257,"dataGaName":5258,"dataGaLocation":5394},{"text":5265,"config":5611},{"href":5267,"dataGaName":5268,"dataGaLocation":5394},{"text":5270,"config":5613},{"href":5272,"dataGaName":5273,"dataGaLocation":5394},{"text":5615,"config":5616},"Modern Slavery Transparency Statement",{"href":5617,"dataGaName":5618,"dataGaLocation":5394},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":5620},[5621,5624,5627],{"text":5622,"config":5623},"Terms",{"href":5446,"dataGaName":5447,"dataGaLocation":5394},{"text":5625,"config":5626},"Cookies",{"dataGaName":5456,"dataGaLocation":5394,"id":5457,"isOneTrustButton":1391},{"text":5628,"config":5629},"Privacy",{"href":5451,"dataGaName":5452,"dataGaLocation":5394},[5631,5645],{"id":5632,"title":7,"body":4935,"config":5633,"content":5635,"description":4935,"extension":5639,"meta":5640,"navigation":1391,"path":5641,"seo":5642,"stem":5643,"__hash__":5644},"blogAuthors/en-us/blog/authors/matt-genelin.yml",{"template":5634},"BlogAuthor",{"name":7,"config":5636},{"headshot":5637,"ctfId":5638},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664522/Blog/Author%20Headshots/matty_genelin.png","6x9dTYZik3lSViI8hu6dYQ","yml",{},"/en-us/blog/authors/matt-genelin",{},"en-us/blog/authors/matt-genelin","BNd-jZWck4DOyJIDc9GI-734vQkyzXJgudpPaFgn5pM",{"id":5646,"title":8,"body":4935,"config":5647,"content":5648,"description":4935,"extension":5639,"meta":5652,"navigation":1391,"path":5653,"seo":5654,"stem":5655,"__hash__":5656},"blogAuthors/en-us/blog/authors/matt-bonner.yml",{"template":5634},{"config":5649,"name":8,"bio":5651},{"headshot":5650},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1775484069/x33hdq785qqrkryorkna.jpg","Solutions architect, SmartBear",{},"/en-us/blog/authors/matt-bonner",{},"en-us/blog/authors/matt-bonner","LH2t-4u_lptPQtHVnEjAbAY95_MIODPOJ_kTCdmcfhk",[5658,5664,5668],{"title":5659,"description":5660,"heroImage":5661,"category":4931,"date":5662,"authors":4935,"slug":4935,"externalUrl":5663},"GitLab Patch Release: 19.2.2, 19.1.4, 19.0.6","Learn about this latest patch release for Community Edition and Enterprise Edition.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661926/Blog/Hero%20Images/security-patch-blog-image-r2-0506-700x400-fy25_2x.jpg","2026-08-12","https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-2-2-released/",{"title":5665,"description":5660,"heroImage":5661,"category":4931,"date":5666,"authors":4935,"slug":4935,"externalUrl":5667}," GitLab Patch Release: 19.2.1, 19.1.3, 19.0.5","2026-07-29","https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-2-1-released/",{"title":5669,"description":5670,"heroImage":5671,"category":4931,"date":5672,"authors":5673,"slug":5675,"externalUrl":4935},"Automate work item assignment with a \"Work item created\" trigger","Our step-by-step guide walks through this AI capability, which enables instant, scalable triage without manual intervention.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-07-20",[5674],"Cesar Saavedra","how-to-use-a-work-item-created-trigger",{"promotions":5677},[5678,5692,5703,5714],{"id":5679,"categories":5680,"header":5682,"text":5683,"button":5684,"image":5689},"ai-modernization",[5681],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":5685,"config":5686},"Get your AI maturity score",{"href":5687,"dataGaName":5688,"dataGaLocation":5159},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":5690},{"src":5691},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":5693,"categories":5694,"header":5695,"text":5683,"button":5696,"image":5700},"devops-modernization",[4931,5495],"Are you just managing tools or shipping innovation?",{"text":5697,"config":5698},"Get your DevOps maturity score",{"href":5699,"dataGaName":5688,"dataGaLocation":5159},"/assessments/devops-modernization-assessment/",{"config":5701},{"src":5702},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":5704,"categories":5705,"header":5706,"text":5683,"button":5707,"image":5711},"security-modernization",[4553],"Are you trading speed for security?",{"text":5708,"config":5709},"Get your security maturity score",{"href":5710,"dataGaName":5688,"dataGaLocation":5159},"/assessments/security-modernization-assessment/",{"config":5712},{"src":5713},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":5715,"paths":5716,"header":5719,"text":5720,"button":5721,"image":5726},"github-azure-migration",[5717,5718],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":5722,"config":5723},"See how GitLab compares to GitHub",{"href":5724,"dataGaName":5725,"dataGaLocation":5159},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":5727},{"src":5702},{"header":5729,"blurb":5730,"button":5731,"secondaryButton":5736},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":5732,"config":5733},"Get your free trial",{"href":5734,"dataGaName":4960,"dataGaLocation":5735},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":5432,"config":5737},{"href":5284,"dataGaName":4965,"dataGaLocation":5735},1786803774940]