[{"data":1,"prerenderedAt":1919},["ShallowReactive",2],{"/en-us/blog/claude-code-and-gitlab":3,"navigation-en-us":1144,"banner-en-us":1565,"footer-en-us":1574,"blog-post-authors-en-us-Michael Friedrich":1819,"blog-related-posts-en-us-claude-code-and-gitlab":1834,"blog-promotions-en-us":1857,"next-steps-en-us":1909},{"id":4,"title":5,"authors":6,"body":8,"category":1125,"date":1126,"description":1127,"extension":1128,"externalUrl":1129,"featured":147,"heroImage":1130,"meta":1131,"navigation":147,"path":1132,"seo":1133,"slug":1136,"stem":1137,"tags":1138,"template":1142,"updatedDate":1129,"__hash__":1143},"blogPosts/en-us/blog/claude-code-and-gitlab.md","Claude Code and GitLab: Three workflows that ship",[7],"Michael Friedrich",{"type":9,"value":10,"toc":1110},"minimark",[11,15,18,21,24,37,42,80,85,88,107,155,158,170,174,181,188,201,214,220,229,353,356,365,375,378,381,411,420,426,432,435,448,452,455,463,467,476,487,498,525,535,553,556,575,581,590,593,597,604,613,620,626,629,638,645,651,654,675,678,684,687,696,703,709,712,718,722,731,737,745,760,774,780,783,800,803,809,812,836,842,845,851,855,859,871,1017,1026,1036,1045,1049,1052,1055,1058,1069,1072,1106],[12,13,14],"p",{},"Developers love Claude Code because it feels like pairing with a senior engineer right in the terminal or IDE: it helps you understand unfamiliar code, propose fixes, and scaffold new features quickly.",[12,16,17],{},"But here is a pattern worth watching. The better agentic coding tools get at writing code, the more the rest of the software lifecycle struggles to keep up. Bug backlogs grow. Pipeline failure rates climb. Security vulnerabilities accumulate faster than teams can triage them. Writing code and shipping software are not the same thing, and the gap between the two is real.",[12,19,20],{},"GitLab comes in to accelerate everything in the remaining stages of the software lifecycle after Claude Code: CI/CD, security scanning, code review, and approvals, all in one place, with an auditable trail.",[12,22,23],{},"This tutorial walks you through three scenarios with Claude Code moving fast in the codebase, and GitLab handling everything that turns that code into a certified, shipped change:",[25,26,27,31,34],"ul",{},[28,29,30],"li",{},"Fix a C++ bug with Claude Code, then let GitLab CI/CD, security scanning, and Duo Code Review take it from there.",[28,32,33],{},"Add GitLab MCP context so Claude works from the actual issue, not just local files.",[28,35,36],{},"Use a Claude-powered external agent in Duo Agent Platform to address code review feedback directly in the MR.",[38,39,41],"h2",{"id":40},"prerequisites","Prerequisites",[43,44,45,54,62,77],"ol",{},[28,46,47,53],{},[48,49,52],"a",{"href":50,"rel":51},"https://code.claude.com/docs/en/overview",[],"Claude Code"," in the terminal, configured and running.",[28,55,56,57],{},"A GitLab project with bug reports and feature proposal issues, for example, the ",[48,58,61],{"href":59,"rel":60},"https://gitlab.com/gitlab-da/use-cases/ai/gitlab-duo-agent-platform/demo-environments/tanuki-iot-platform",[],"Tanuki Iot Platform project",[28,63,64,65,70,71,76],{},"For specific use cases: ",[48,66,69],{"href":67,"rel":68},"https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/",[],"GitLab MCP server"," and GitLab Duo Agent Platform with ",[48,72,75],{"href":73,"rel":74},"https://docs.gitlab.com/user/duo_agent_platform/agents/external/",[],"external agents",".",[28,78,79],{},"For building code: CMake, Make, gcc/clang++ for C++, Maven for Java.",[81,82,84],"h3",{"id":83},"prepare-the-gitlab-project","Prepare the GitLab project",[12,86,87],{},"If you want to follow along, you can repeat the entire steps here in your own developer environment. To do so:",[25,89,90,97,100],{},[28,91,92,93,96],{},"Import the ",[48,94,61],{"href":59,"rel":95},[]," into your GitLab environment, including all open issues.",[28,98,99],{},"Clone the project into your local environment, and navigate into it.",[28,101,102,103,76],{},"Open a terminal and run Claude Code with ",[104,105,106],"code",{},"claude",[108,109,114],"pre",{"className":110,"code":111,"language":112,"meta":113,"style":113},"language-shell shiki shiki-themes github-light","git clone https://gitlab.example.com/examplegroup/tanuki-iot-platform.git\ncd tanuki-iot-platform\n\nclaude\n","shell","",[104,115,116,132,142,149],{"__ignoreMap":113},[117,118,121,125,129],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"s7eDp","git",[117,126,128],{"class":127},"sYBdl"," clone",[117,130,131],{"class":127}," https://gitlab.example.com/examplegroup/tanuki-iot-platform.git\n",[117,133,135,139],{"class":119,"line":134},2,[117,136,138],{"class":137},"sYu0t","cd",[117,140,141],{"class":127}," tanuki-iot-platform\n",[117,143,145],{"class":119,"line":144},3,[117,146,148],{"emptyLinePlaceholder":147},true,"\n",[117,150,152],{"class":119,"line":151},4,[117,153,154],{"class":123},"claude\n",[12,156,157],{},"Ask in the prompt to learn more about the project’s purpose.",[108,159,163],{"className":160,"code":161,"language":162,"meta":113,"style":113},"language-markdown shiki shiki-themes github-light","What is this project about?\n","markdown",[104,164,165],{"__ignoreMap":113},[117,166,167],{"class":119,"line":120},[117,168,161],{"class":169},"sgsFI",[38,171,173],{"id":172},"get-started-with-claude-code-and-gitlab","Get started with Claude Code and GitLab",[12,175,176,177,180],{},"In our first scenario, we need to fix a hardware sensor written in C++. The Arduino collector reads metrics from the USB-connected Arduino Uno R4 board, and crashes when the device ",[104,178,179],{},"/dev/ttyACM0"," is not connected.",[12,182,183],{},[184,185],"img",{"alt":186,"src":187,"title":186},"GitLab issue showing the Arduino IoT collector crash bug report","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079018/itfnec4qrlldxfftwnig.png",[12,189,190,191,196,197,200],{},"After reading the bug report in ",[48,192,195],{"href":193,"rel":194},"https://gitlab.com/gitlab-da/use-cases/ai/gitlab-duo-agent-platform/demo-environments/tanuki-iot-platform/-/work_items/4",[],"Issue 4",", inspect the code in the ",[104,198,199],{},"main.cpp"," file, for example, using vim:",[108,202,204],{"className":110,"code":203,"language":112,"meta":113,"style":113},"vim sensors/arduino-iot-collector/src/main.cpp\n",[104,205,206],{"__ignoreMap":113},[117,207,208,211],{"class":119,"line":120},[117,209,210],{"class":123},"vim",[117,212,213],{"class":127}," sensors/arduino-iot-collector/src/main.cpp\n",[12,215,216],{},[184,217],{"alt":218,"src":219,"title":218},"Arduino IoT Collector source code open in vim","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079018/mjof3rgdlxjy2trmgehq.png",[12,221,222,223,228],{},"Build and run the collector binary with ",[48,224,227],{"href":225,"rel":226},"https://cmake.org/",[],"CMake"," to reproduce the issue.",[108,230,232],{"className":110,"code":231,"language":112,"meta":113,"style":113},"cmake -S . -B build\ncmake --build build\n\n./build/arduino_iot_collector\nStarting Arduino IoT Collector Application...\nlibc++abi: terminating due to uncaught exception of type std::runtime_error: Failed to initialize Arduino temperature sensor: Arduino port not found: /dev/ttyACM0\n[1]    85289 abort      ./build/arduino_iot_collector\n",[104,233,234,251,260,264,269,287,347],{"__ignoreMap":113},[117,235,236,239,242,245,248],{"class":119,"line":120},[117,237,238],{"class":123},"cmake",[117,240,241],{"class":137}," -S",[117,243,244],{"class":127}," .",[117,246,247],{"class":137}," -B",[117,249,250],{"class":127}," build\n",[117,252,253,255,258],{"class":119,"line":134},[117,254,238],{"class":123},[117,256,257],{"class":137}," --build",[117,259,250],{"class":127},[117,261,262],{"class":119,"line":144},[117,263,148],{"emptyLinePlaceholder":147},[117,265,266],{"class":119,"line":151},[117,267,268],{"class":123},"./build/arduino_iot_collector\n",[117,270,272,275,278,281,284],{"class":119,"line":271},5,[117,273,274],{"class":123},"Starting",[117,276,277],{"class":127}," Arduino",[117,279,280],{"class":127}," IoT",[117,282,283],{"class":127}," Collector",[117,285,286],{"class":127}," Application...\n",[117,288,290,293,296,299,302,305,308,311,314,317,320,322,325,327,330,333,335,338,341,344],{"class":119,"line":289},6,[117,291,292],{"class":123},"libc++abi:",[117,294,295],{"class":127}," terminating",[117,297,298],{"class":127}," due",[117,300,301],{"class":127}," to",[117,303,304],{"class":127}," uncaught",[117,306,307],{"class":127}," exception",[117,309,310],{"class":127}," of",[117,312,313],{"class":127}," type",[117,315,316],{"class":127}," std::runtime_error:",[117,318,319],{"class":127}," Failed",[117,321,301],{"class":127},[117,323,324],{"class":127}," initialize",[117,326,277],{"class":127},[117,328,329],{"class":127}," temperature",[117,331,332],{"class":127}," sensor:",[117,334,277],{"class":127},[117,336,337],{"class":127}," port",[117,339,340],{"class":127}," not",[117,342,343],{"class":127}," found:",[117,345,346],{"class":127}," /dev/ttyACM0\n",[117,348,350],{"class":119,"line":349},7,[117,351,352],{"class":169},"[1]    85289 abort      ./build/arduino_iot_collector\n",[12,354,355],{},"Open Claude Code and prompt it for help:",[108,357,359],{"className":160,"code":358,"language":162,"meta":113,"style":113},"Please help me fix the Arduino IoT Collector sensor - it crashes.\n",[104,360,361],{"__ignoreMap":113},[117,362,363],{"class":119,"line":120},[117,364,358],{"class":169},[12,366,367,368,370,371,374],{},"Claude Code searches the code base and identifies the problem in the ",[104,369,199],{}," file, which throws an ",[104,372,373],{},"std::runtime_error()"," exception causing the application to immediately crash. The expected behavior is to log a user-friendly configuration error and continue running the application.",[12,376,377],{},"After successful source code fix and build, we need to create a Git branch, commit, and merge request to trigger CI/CD pipelines, security scanning, and code review workflows.",[12,379,380],{},"You can use different ways to work with Git in Claude Code:",[25,382,383,389],{},[28,384,385,386],{},"Use a prompt: ",[104,387,388],{},"Please help me create a Git branch and commit and push the changes.",[28,390,391,392,395,396,399,400,403,404,407,408,410],{},"Execute the shell commands: Open the command prompt with ",[104,393,394],{},"!",", followed by ",[104,397,398],{},"git checkout -b fix-arduino-sensor",", ",[104,401,402],{},"git commit -avm “...”"," and ",[104,405,406],{},"git push"," commands. The ",[104,409,406],{}," output generates an MR creation URL. Click on it to open the browser and fill in the form.",[12,412,413,414,419],{},"CI/CD pipelines are triggered on MR creation and verify that the build and tests are working. Security scanning ensures that no new vulnerabilities are introduced. The new MR automatically triggers the ",[48,415,418],{"href":416,"rel":417},"https://docs.gitlab.com/user/duo_agent_platform/flows/foundational_flows/code_review/",[],"GitLab Duo Code Review Flow",", which assesses the correctness of the fix, following the development style guides and custom review instructions.",[12,421,422],{},[184,423],{"alt":424,"src":425,"title":424},"GitLab Duo Code Review custom instructions for C++","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079019/wasta2rqivrvrsjtw1jv.png",[12,427,428],{},[184,429],{"alt":430,"src":431,"title":430},"GitLab Duo Code Review Flow review feedback comment","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079019/r2oalo1xwkpbmeispflo.png",[12,433,434],{},"Here is a quick recording of Claude Code, GitLab CI/CD, and GitLab Duo Agent Platform in action:",[436,437,440,441],"figure",{"className":438},[439],"video_container","\n  ",[442,443,447],"iframe",{"src":444,"frameBorder":445,"allowFullScreen":446},"https://www.youtube.com/embed/JH4Sae3eDpw","0","true"," ",[38,449,451],{"id":450},"fixing-a-c-bug-with-gitlab-mcp-in-claude-code","Fixing a C++ bug with GitLab MCP in Claude Code",[12,453,454],{},"The previous scenario led Claude Code to search the local code repository, and it made assumptions on a potential fix based on available context. But it lacked the knowledge of a GitLab issue describing the bug, debugging discussions, and proposed ways to fix and address the problem long term. It also did not take into account any history of past code changes saved in merge requests and issues with similar reports as software development lifecycle (SDLC) context.",[12,456,457,458,462],{},"In order to enable this rich GitLab SDLC context, we can bring the ",[48,459,461],{"href":67,"rel":460},[],"GitLab MCP Server"," into Claude Code.",[81,464,466],{"id":465},"configure-the-gitlab-mcp-server","Configure the GitLab MCP Server",[12,468,469,470,475],{},"Ensure that the GitLab MCP Server is ",[48,471,474],{"href":472,"rel":473},"https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/#prerequisites",[],"enabled"," on the instance or top-level group.",[12,477,478,479,482,483,486],{},"Open a new terminal, and add the ",[48,480,461],{"href":67,"rel":481},[]," to Claude Code using the ",[104,484,485],{},"http"," transport type.",[12,488,489,490,493,494,497],{},"Modify ",[104,491,492],{},"gitlab.example.com"," to your GitLab instance, or use ",[104,495,496],{},"GitLab.com",":",[108,499,501],{"className":110,"code":500,"language":112,"meta":113,"style":113},"claude mcp add --transport http GitLab https://gitlab.example.com/api/v4/mcp\n",[104,502,503],{"__ignoreMap":113},[117,504,505,507,510,513,516,519,522],{"class":119,"line":120},[117,506,106],{"class":123},[117,508,509],{"class":127}," mcp",[117,511,512],{"class":127}," add",[117,514,515],{"class":137}," --transport",[117,517,518],{"class":127}," http",[117,520,521],{"class":127}," GitLab",[117,523,524],{"class":127}," https://gitlab.example.com/api/v4/mcp\n",[12,526,527,528,530,531,534],{},"Run ",[104,529,106],{}," in a new terminal session, and type ",[104,532,533],{},"/mcp"," to authenticate with the GitLab MCP Server using OAuth in the opened browser page.",[108,536,538],{"className":110,"code":537,"language":112,"meta":113,"style":113},"claude\n\n/mcp\n",[104,539,540,544,548],{"__ignoreMap":113},[117,541,542],{"class":119,"line":120},[117,543,154],{"class":123},[117,545,546],{"class":119,"line":134},[117,547,148],{"emptyLinePlaceholder":147},[117,549,550],{"class":119,"line":144},[117,551,552],{"class":123},"/mcp\n",[12,554,555],{},"To verify the connection, ask Claude:",[108,557,559],{"className":160,"code":558,"language":162,"meta":113,"style":113},"Which GitLab MCP tools are available to you?\n\nShow the GitLab MCP Server version\n",[104,560,561,566,570],{"__ignoreMap":113},[117,562,563],{"class":119,"line":120},[117,564,565],{"class":169},"Which GitLab MCP tools are available to you?\n",[117,567,568],{"class":119,"line":134},[117,569,148],{"emptyLinePlaceholder":147},[117,571,572],{"class":119,"line":144},[117,573,574],{"class":169},"Show the GitLab MCP Server version\n",[12,576,577],{},[184,578],{"alt":579,"src":580,"title":579},"Claude Code, investigating the GitLab MCP Server version","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079019/f2ygt6wuuvxxbpticcgt.png",[12,582,583,584,589],{},"When you authenticate Claude Code with the GitLab MCP server, it connects through ",[48,585,588],{"href":586,"rel":587},"https://datatracker.ietf.org/doc/html/rfc7591",[],"OAuth"," and acts with your existing GitLab identity, not with elevated, separate permissions. In practice, that means Claude Code can only see projects, issues, merge requests, and other GitLab data that you already have access to through your account and project/group membership. That is an important guardrail: MCP expands context inside the AI tool, but it does not bypass GitLab visibility controls or invent broader access on its own.",[12,591,592],{},"A second guardrail is user approval. In this flow, Claude Code identifies the MCP tool it wants to call and asks for approval before proceeding, so developers stay in the loop when external context is fetched. For security-sensitive environments, it is also worth being explicit that teams should stay mindful of what data is exposed in prompts and use MCP primarily with trusted GitLab content.",[81,594,596],{"id":595},"work-on-a-bug-report-issue","Work on a bug report issue",[12,598,599,600,603],{},"Let's fetch the issue context into Claude Code by referencing ",[48,601,195],{"href":193,"rel":602},[]," in the prompt. If you do not have an issue in your project, clone/copy Issue 4, and adjust the number in the prompt.",[108,605,607],{"className":160,"code":606,"language":162,"meta":113,"style":113},"Please help me fix issue 4\n",[104,608,609],{"__ignoreMap":113},[117,610,611],{"class":119,"line":120},[117,612,606],{"class":169},[12,614,615,616,619],{},"Claude Code identifies the need to call the MCP tool ",[104,617,618],{},"get_issue"," and asks for approval. You can also approve future use automatically.",[12,621,622],{},[184,623],{"alt":624,"src":625,"title":624},"Claude Code fetching the issue context with MCP tools","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079021/tj6dpxbemvvgqnbifzjy.png",[12,627,628],{},"Once Claude Code has fetched the necessary context from the issue, it starts analyzing the sensor’s C++ source code directly. After creating and verifying a fix, you can ask to create a new Git branch, commit, and MR if Claude Code is not actively doing this already.",[108,630,632],{"className":160,"code":631,"language":162,"meta":113,"style":113},"Please create a new Git branch, commit the changes, and create a new merge request\n",[104,633,634],{"__ignoreMap":113},[117,635,636],{"class":119,"line":120},[117,637,631],{"class":169},[12,639,640,641,644],{},"Claude Code finds the MCP tool ",[104,642,643],{},"create_merge_request"," and handles the MR creation directly without context switching into the browser.",[12,646,647],{},[184,648],{"alt":649,"src":650,"title":649},"Claude Code created an MR using MCP tools, linked to Issue 4","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079021/bo41ti93yonvsy9q2gbw.png",[12,652,653],{},"In GitLab, the MR creation event triggers multiple parallel workflows automatically:",[25,655,656,659,667],{},[28,657,658],{},"CI/CD pipeline for automated builds and tests",[28,660,661,662],{},"security scanning with ",[48,663,666],{"href":664,"rel":665},"https://docs.gitlab.com/user/application_security/sast/advanced_sast_cpp/",[],"Advanced SAST for C++",[28,668,669,670,674],{},"a ",[48,671,673],{"href":416,"rel":672},[],"Code Review Flow"," by GitLab Duo Agent Platform",[12,676,677],{},"These automated and agentic workflows within GitLab accelerate software delivery as much as Claude Code accelerates AI coding for issue resolution.",[12,679,680],{},[184,681],{"alt":682,"src":683,"title":682},"CI/CD pipeline status in MR - tests and security scanning","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079022/yd3kzf9yp4usdldovs1a.png",[12,685,686],{},"You can either open the MR in the browser, or stay in the terminal and prompt Claude Code with:",[108,688,690],{"className":160,"code":689,"language":162,"meta":113,"style":113},"Is the Merge Request running OK?\n",[104,691,692],{"__ignoreMap":113},[117,693,694],{"class":119,"line":120},[117,695,689],{"class":169},[12,697,698,699,702],{},"It will use the MCP tool ",[104,700,701],{},"get_merge_request_pipelines"," to fetch the MR pipeline status being green and ready to merge.",[12,704,705],{},[184,706],{"alt":707,"src":708,"title":707},"Claude Code fetching MR pipeline status using MCP tools","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079019/s8cwcvc3r5moui2twjpd.png",[12,710,711],{},"Watch the recording to learn how Claude Code fixes the problem with the help from the GitLab MCP Server:",[436,713,440,715],{"className":714},[439],[442,716,447],{"src":717,"frameBorder":445,"allowFullScreen":446},"https://www.youtube.com/embed/q8XWnmdIaI0",[38,719,721],{"id":720},"claude-code-as-external-agent-reviewer","Claude Code as external agent reviewer",[12,723,724,725,730],{},"In this last scenario, Claude Code helped implement a new feature based on the requirements in ",[48,726,729],{"href":727,"rel":728},"https://gitlab.com/gitlab-da/use-cases/ai/gitlab-duo-agent-platform/demo-environments/tanuki-iot-platform/-/work_items/24",[],"Issue 24"," — a Spring Boot API server with a REST/Websocket backend. The CI/CD pipelines and security scans are OK, but there is code review feedback waiting in the MR.",[12,732,733],{},[184,734],{"alt":735,"src":736,"title":735},"GitLab Duo Code Review feedback on Spring Boot API Server MR","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079022/to7zvyrarrvcnyuuzldi.png",[12,738,739,740,744],{},"You can add Claude Code as collaboration partner in issues, epics, and MRs, and tackle tasks together. Follow the ",[48,741,743],{"href":73,"rel":742},[],"external agents documentation"," for the prerequisites.",[12,746,747,748,751,752,756,757,76],{},"Enable the ",[104,749,750],{},"Claude Agent by GitLab"," in the project menu in ",[753,754,755],"strong",{},"AI > Agents",". Note the service account name on how to mention or assign the agent later, it uses the pattern: ",[104,758,759],{},"@ai-\u003Cagent-name>-\u003Ctop-level-group-name>",[12,761,762,763,768,769,76],{},"Next, open the MR with the code review feedback, and inspect the requested changes. The screenshot uses ",[48,764,767],{"href":765,"rel":766},"https://gitlab.com/gitlab-da/use-cases/ai/gitlab-duo-agent-platform/demo-environments/tanuki-iot-platform/-/merge_requests/78",[],"MR 78",", and GitLab Duo Code Review follows ",[48,770,773],{"href":771,"rel":772},"https://docs.gitlab.com/user/duo_agent_platform/customize/review_instructions/?tab=Java",[],"custom review instructions for Java",[12,775,776],{},[184,777],{"alt":778,"src":779,"title":778},"GitLab Duo Code Review Flow feedback on insecure AllowedOriginPatterns for the API endpoints introduced in the MR","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079039/gvgqmcnijllptvnnyyjc.png",[12,781,782],{},"Create a new comment mentioning the Claude Code Agent:",[108,784,786],{"className":160,"code":785,"language":162,"meta":113,"style":113},"@ai-claude-agent-by-gitlab-\u003Ctop-level-groupname> Can you help me address the review feedback?\n",[104,787,788],{"__ignoreMap":113},[117,789,790,793,797],{"class":119,"line":120},[117,791,792],{"class":169},"@ai-claude-agent-by-gitlab-\u003C",[117,794,796],{"class":795},"shJU0","top-level-groupname",[117,798,799],{"class":169},"> Can you help me address the review feedback?\n",[12,801,802],{},"This mention spawns a new agent session in the background, setting up the Claude Code Agent, which starts to work on the review feedback. Once finished, it follows the instructions to create a Git commit and summary comment in the MR.",[12,804,805],{},[184,806],{"alt":807,"src":808,"title":807},"GitLab Duo Code Review feedback resolved by Claude Agent","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079038/pqy8f4xo8n0i7yvkajso.png",[12,810,811],{},"Your next steps to ensure software development stays within your organizational guardrails would include:",[25,813,814,817,820,828],{},[28,815,816],{},"Address remaining review feedback.",[28,818,819],{},"Review the warning in the CI/CD pipeline jobs.",[28,821,822,823,76],{},"Review the potential security vulnerabilities, for example, using ",[48,824,827],{"href":825,"rel":826},"https://docs.gitlab.com/user/duo_agent_platform/flows/foundational_flows/agentic_sast_vulnerability_resolution/",[],"SAST Vulnerability Resolution",[28,829,830,831,76],{},"Get merge request approval from an eligible developer, configured as ",[48,832,835],{"href":833,"rel":834},"https://docs.gitlab.com/user/project/codeowners/",[],"Code Owner",[12,837,838],{},[184,839],{"alt":840,"src":841,"title":840},"Merge request widgets showing the CI/CD pipeline, required approvals, security findings, and merge status","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778079039/uzegwykldauzuxucrpjf.png",[12,843,844],{},"Watch this video to learn how Claude Code can help with reviews as an external agent in GitLab Duo Agent Platform:",[436,846,440,848],{"className":847},[439],[442,849,447],{"src":850,"frameBorder":445,"allowFullScreen":446},"https://www.youtube.com/embed/Tw0wNet1HCc",[38,852,854],{"id":853},"tips-for-claude-code-and-gitlab","Tips for Claude Code and GitLab",[81,856,858],{"id":857},"custom-instructions","Custom instructions",[12,860,861,862,865,866,497],{},"You can instruct agents to build and test code before commits, keep changes minimal, or understand the project architecture better, using an entry in ",[104,863,864],{},"AGENTS.md",". The Tanuki IoT Platform uses the ",[48,867,870],{"href":868,"rel":869},"https://gitlab.com/gitlab-da/use-cases/ai/gitlab-duo-agent-platform/demo-environments/tanuki-iot-platform/-/blob/main/AGENTS.md?ref_type=heads&plain=1",[],"following production example",[108,872,874],{"className":160,"code":873,"language":162,"meta":113,"style":113},"## Working with sensors\n\n### Before editing\n1. Identify the sensor directory you're working with\n2. Check for an `AGENTS.md` file in that directory\n3. Read sensor-specific instructions before making changes\n4. Follow language-specific style guides\n\n### Making changes\n- Keep changes minimal and focused on the user request\n- Do not refactor existing code unless specifically instructed\n- Preserve original code formatting\n- Only modify code necessary to solve the specific request\n\n### Creating MRs\n- Always run local builds and tests first\n- Create a new branch for changes\n- Automatically create a merge request after successful commits\n- Reference relevant issues or tasks in the MR description\n",[104,875,876,882,886,891,900,914,922,930,935,941,950,958,966,974,979,985,993,1001,1009],{"__ignoreMap":113},[117,877,878],{"class":119,"line":120},[117,879,881],{"class":880},"surfw","## Working with sensors\n",[117,883,884],{"class":119,"line":134},[117,885,148],{"emptyLinePlaceholder":147},[117,887,888],{"class":119,"line":144},[117,889,890],{"class":880},"### Before editing\n",[117,892,893,897],{"class":119,"line":151},[117,894,896],{"class":895},"sqxcx","1.",[117,898,899],{"class":169}," Identify the sensor directory you're working with\n",[117,901,902,905,908,911],{"class":119,"line":271},[117,903,904],{"class":895},"2.",[117,906,907],{"class":169}," Check for an ",[117,909,910],{"class":137},"`AGENTS.md`",[117,912,913],{"class":169}," file in that directory\n",[117,915,916,919],{"class":119,"line":289},[117,917,918],{"class":895},"3.",[117,920,921],{"class":169}," Read sensor-specific instructions before making changes\n",[117,923,924,927],{"class":119,"line":349},[117,925,926],{"class":895},"4.",[117,928,929],{"class":169}," Follow language-specific style guides\n",[117,931,933],{"class":119,"line":932},8,[117,934,148],{"emptyLinePlaceholder":147},[117,936,938],{"class":119,"line":937},9,[117,939,940],{"class":880},"### Making changes\n",[117,942,944,947],{"class":119,"line":943},10,[117,945,946],{"class":895},"-",[117,948,949],{"class":169}," Keep changes minimal and focused on the user request\n",[117,951,953,955],{"class":119,"line":952},11,[117,954,946],{"class":895},[117,956,957],{"class":169}," Do not refactor existing code unless specifically instructed\n",[117,959,961,963],{"class":119,"line":960},12,[117,962,946],{"class":895},[117,964,965],{"class":169}," Preserve original code formatting\n",[117,967,969,971],{"class":119,"line":968},13,[117,970,946],{"class":895},[117,972,973],{"class":169}," Only modify code necessary to solve the specific request\n",[117,975,977],{"class":119,"line":976},14,[117,978,148],{"emptyLinePlaceholder":147},[117,980,982],{"class":119,"line":981},15,[117,983,984],{"class":880},"### Creating MRs\n",[117,986,988,990],{"class":119,"line":987},16,[117,989,946],{"class":895},[117,991,992],{"class":169}," Always run local builds and tests first\n",[117,994,996,998],{"class":119,"line":995},17,[117,997,946],{"class":895},[117,999,1000],{"class":169}," Create a new branch for changes\n",[117,1002,1004,1006],{"class":119,"line":1003},18,[117,1005,946],{"class":895},[117,1007,1008],{"class":169}," Automatically create a merge request after successful commits\n",[117,1010,1012,1014],{"class":119,"line":1011},19,[117,1013,946],{"class":895},[117,1015,1016],{"class":169}," Reference relevant issues or tasks in the MR description\n",[12,1018,1019,1020,1025],{},"These ",[48,1021,1024],{"href":1022,"rel":1023},"https://docs.gitlab.com/user/duo_agent_platform/customize/agents_md/",[],"custom instructions"," are also processed by agents and flows on the GitLab Duo Agent Platform.",[12,1027,1028,1029,1032,1033,1035],{},"Claude Code prefers ",[104,1030,1031],{},"CLAUDE.md",", which can be pointed to ",[104,1034,864],{},", too.",[108,1037,1039],{"className":160,"code":1038,"language":162,"meta":113,"style":113},"@AGENTS.md\n",[104,1040,1041],{"__ignoreMap":113},[117,1042,1043],{"class":119,"line":120},[117,1044,1038],{"class":169},[38,1046,1048],{"id":1047},"summary","Summary",[12,1050,1051],{},"AI coding tools make developers faster at writing code. But writing code and shipping software are not the same thing. The gap between the two grows precisely because the tools are so good at the first part: more code gets written, bug backlogs grow, pipeline failure rates climb, and security vulnerabilities pile up.",[12,1053,1054],{},"Claude Code keeps you productive where the code lives and understands unfamiliar codebases, proposes fixes, and scaffolds features fast. GitLab Duo Agent Platform is what turns that speed for many developers in software teams across enterprise organizations into secure software you can actually ship and certify across many release milestones and many projects. With GitLab, the rest of the software lifecycle – CI/CD pipeline fixes, security scanning, automated remediation, code review, and more with human in the loop workflows – with every agentic action can be traced back and configured to run within your organization's guardrails and security policies.",[12,1056,1057],{},"In this tutorial, you saw three ways to bring Claude Code and GitLab Duo Agent Platform together:",[25,1059,1060,1063,1066],{},[28,1061,1062],{},"Fix a bug with Claude Code and let GitLab CI/CD, security scanning, and Duo Code Review do the rest.",[28,1064,1065],{},"Add GitLab MCP context so Claude works from the actual context saved within the GitLab issue, and not just local files.",[28,1067,1068],{},"Use a Claude-powered external agent in GitLab Duo Agent Platform to address review feedback directly in the MR.",[12,1070,1071],{},"The principle stays the same across all three: Claude moves fast, GitLab certifies the work.",[1073,1074,1075,1083,1091],"blockquote",{},[12,1076,1077,1078,76],{},"If you are not using GitLab Duo Agent Platform today, you can start with ",[48,1079,1082],{"href":1080,"rel":1081},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"a free trial",[12,1084,1085,1086,76],{},"If you are already using GitLab in the free tier, you can sign up for GitLab Duo Agent Platform by ",[48,1087,1090],{"href":1088,"rel":1089},"https://docs.gitlab.com/subscriptions/gitlab_credits/#for-the-free-tier-on-gitlabcom",[],"following a few simple steps",[12,1092,1093,1094,1099,1100,1105],{},"And if you are an existing subscriber to GitLab Premium or Ultimate, you can get started simply by ",[48,1095,1098],{"href":1096,"rel":1097},"https://docs.gitlab.com/user/duo_agent_platform/turn_on_off/",[],"turning on Duo Agent Platform"," and start using the GitLab Credits ",[48,1101,1104],{"href":1102,"rel":1103},"https://docs.gitlab.com/subscriptions/gitlab_credits/#included-credits",[],"that are included"," with your subscription.",[1107,1108,1109],"style",{},"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 .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .surfw, html code.shiki .surfw{--shiki-default:#005CC5;--shiki-default-font-weight:bold}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}",{"title":113,"searchDepth":134,"depth":134,"links":1111},[1112,1115,1116,1120,1121,1124],{"id":40,"depth":134,"text":41,"children":1113},[1114],{"id":83,"depth":144,"text":84},{"id":172,"depth":134,"text":173},{"id":450,"depth":134,"text":451,"children":1117},[1118,1119],{"id":465,"depth":144,"text":466},{"id":595,"depth":144,"text":596},{"id":720,"depth":134,"text":721},{"id":853,"depth":134,"text":854,"children":1122},[1123],{"id":857,"depth":144,"text":858},{"id":1047,"depth":134,"text":1048},"ai","2026-05-06","Agentic coding tools write code fast. But who ships it? Learn how Claude Code and GitLab Duo Agent Platform take you from bug report to production fix.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1778087000/qdfsf8kz6ebfnopx9v2e.png",{},"/en-us/blog/claude-code-and-gitlab",{"config":1134,"title":5,"description":1127},{"noIndex":1135},false,"claude-code-and-gitlab","en-us/blog/claude-code-and-gitlab",[1139,1140,1141],"AI","tutorial","product","BlogPost","Dl2I6ciEX4-u-xOWHUwolVPscyXLkODFz32GXUbAl74",{"logo":1145,"freeTrial":1150,"sales":1155,"login":1160,"items":1165,"search":1485,"minimal":1516,"duo":1535,"switchNav":1544,"pricingDeployment":1555},{"config":1146},{"href":1147,"dataGaName":1148,"dataGaLocation":1149},"/","gitlab logo","header",{"text":1151,"config":1152},"Get free trial",{"href":1153,"dataGaName":1154,"dataGaLocation":1149},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1156,"config":1157},"Talk to sales",{"href":1158,"dataGaName":1159,"dataGaLocation":1149},"/sales/","sales",{"text":1161,"config":1162},"Sign in",{"href":1163,"dataGaName":1164,"dataGaLocation":1149},"https://gitlab.com/users/sign_in/","sign in",[1166,1195,1295,1300,1404,1465],{"text":1167,"config":1168,"menu":1170},"Platform",{"dataNavLevelOne":1169},"platform",{"type":1171,"columns":1172},"cards",[1173,1179,1187],{"title":1167,"description":1174,"link":1175},"The intelligent orchestration platform for DevSecOps",{"text":1176,"config":1177},"Explore our Platform",{"href":1178,"dataGaName":1169,"dataGaLocation":1149},"/platform/",{"title":1180,"description":1181,"link":1182},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1183,"config":1184},"Meet GitLab Duo",{"href":1185,"dataGaName":1186,"dataGaLocation":1149},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1188,"description":1189,"link":1190},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1191,"config":1192},"Learn more",{"href":1193,"dataGaName":1194,"dataGaLocation":1149},"/why-gitlab/","why gitlab",{"text":1196,"left":147,"config":1197,"menu":1199},"Product",{"dataNavLevelOne":1198},"solutions",{"type":1200,"link":1201,"columns":1205,"feature":1274},"lists",{"text":1202,"config":1203},"View all Solutions",{"href":1204,"dataGaName":1198,"dataGaLocation":1149},"/solutions/",[1206,1230,1253],{"title":1207,"description":1208,"link":1209,"items":1214},"Automation","CI/CD and automation to accelerate deployment",{"config":1210},{"icon":1211,"href":1212,"dataGaName":1213,"dataGaLocation":1149},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1215,1219,1222,1226],{"text":1216,"config":1217},"CI/CD",{"href":1218,"dataGaLocation":1149,"dataGaName":1216},"/solutions/continuous-integration/",{"text":1180,"config":1220},{"href":1185,"dataGaLocation":1149,"dataGaName":1221},"gitlab duo agent platform - product menu",{"text":1223,"config":1224},"Source Code Management",{"href":1225,"dataGaLocation":1149,"dataGaName":1223},"/solutions/source-code-management/",{"text":1227,"config":1228},"Automated Software Delivery",{"href":1212,"dataGaLocation":1149,"dataGaName":1229},"Automated software delivery",{"title":1231,"description":1232,"link":1233,"items":1238},"Security","Deliver code faster without compromising security",{"config":1234},{"href":1235,"dataGaName":1236,"dataGaLocation":1149,"icon":1237},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1239,1243,1248],{"text":1240,"config":1241},"Application Security Testing",{"href":1235,"dataGaName":1242,"dataGaLocation":1149},"Application security testing",{"text":1244,"config":1245},"Software Supply Chain Security",{"href":1246,"dataGaLocation":1149,"dataGaName":1247},"/solutions/supply-chain/","Software supply chain security",{"text":1249,"config":1250},"Software Compliance",{"href":1251,"dataGaName":1252,"dataGaLocation":1149},"/solutions/software-compliance/","software compliance",{"title":1254,"link":1255,"items":1260},"Measurement",{"config":1256},{"icon":1257,"href":1258,"dataGaName":1259,"dataGaLocation":1149},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1261,1265,1269],{"text":1262,"config":1263},"Visibility & Measurement",{"href":1258,"dataGaLocation":1149,"dataGaName":1264},"Visibility and Measurement",{"text":1266,"config":1267},"Value Stream Management",{"href":1268,"dataGaLocation":1149,"dataGaName":1266},"/solutions/value-stream-management/",{"text":1270,"config":1271},"Analytics & Insights",{"href":1272,"dataGaLocation":1149,"dataGaName":1273},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1275,"type":1200,"items":1276},"GitLab for",[1277,1283,1289],{"text":1278,"config":1279},"Enterprise",{"icon":1280,"href":1281,"dataGaLocation":1149,"dataGaName":1282},"Building","/enterprise/","enterprise",{"text":1284,"config":1285},"Small Business",{"icon":1286,"href":1287,"dataGaLocation":1149,"dataGaName":1288},"Work","/small-business/","small business",{"text":1290,"config":1291},"Public Sector",{"icon":1292,"href":1293,"dataGaLocation":1149,"dataGaName":1294},"Organization","/solutions/public-sector/","public sector",{"text":1296,"config":1297},"Pricing",{"href":1298,"dataGaName":1299,"dataGaLocation":1149,"dataNavLevelOne":1299},"/pricing/","pricing",{"text":1301,"config":1302,"menu":1304},"Resources",{"dataNavLevelOne":1303},"resources",{"type":1200,"link":1305,"columns":1309,"feature":1393},{"text":1306,"config":1307},"View all resources",{"href":1308,"dataGaName":1303,"dataGaLocation":1149},"/resources/",[1310,1343,1365],{"title":1311,"items":1312},"Getting started",[1313,1318,1323,1328,1333,1338],{"text":1314,"config":1315},"Install",{"href":1316,"dataGaName":1317,"dataGaLocation":1149},"/install/","install",{"text":1319,"config":1320},"Quick start guides",{"href":1321,"dataGaName":1322,"dataGaLocation":1149},"/get-started/","quick setup checklists",{"text":1324,"config":1325},"Learn",{"href":1326,"dataGaLocation":1149,"dataGaName":1327},"https://university.gitlab.com/","learn",{"text":1329,"config":1330},"Product documentation",{"href":1331,"dataGaName":1332,"dataGaLocation":1149},"https://docs.gitlab.com/","product documentation",{"text":1334,"config":1335},"Best practice videos",{"href":1336,"dataGaName":1337,"dataGaLocation":1149},"/getting-started-videos/","best practice videos",{"text":1339,"config":1340},"Integrations",{"href":1341,"dataGaName":1342,"dataGaLocation":1149},"/integrations/","integrations",{"title":1344,"items":1345},"Discover",[1346,1351,1356,1360],{"text":1347,"config":1348},"Customer success stories",{"href":1349,"dataGaName":1350,"dataGaLocation":1149},"/customers/","customer success stories",{"text":1352,"config":1353},"Blog",{"href":1354,"dataGaName":1355,"dataGaLocation":1149},"/blog/","blog",{"text":1357,"config":1358},"The Source",{"href":1359,"dataGaName":1355,"dataGaLocation":1149},"/the-source/",{"text":1361,"config":1362},"Remote",{"href":1363,"dataGaName":1364,"dataGaLocation":1149},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1366,"items":1367},"Connect",[1368,1373,1378,1383,1388],{"text":1369,"config":1370},"GitLab Services",{"href":1371,"dataGaName":1372,"dataGaLocation":1149},"/services/","services",{"text":1374,"config":1375},"Community",{"href":1376,"dataGaName":1377,"dataGaLocation":1149},"/community/","community",{"text":1379,"config":1380},"Forum",{"href":1381,"dataGaName":1382,"dataGaLocation":1149},"https://forum.gitlab.com/","forum",{"text":1384,"config":1385},"Events",{"href":1386,"dataGaName":1387,"dataGaLocation":1149},"/events/","events",{"text":1389,"config":1390},"Partners",{"href":1391,"dataGaName":1392,"dataGaLocation":1149},"/partners/","partners",{"config":1394,"title":1397,"text":1398,"link":1399},{"background":1395,"textColor":1396},"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":1400,"config":1401},"Read the latest",{"href":1402,"dataGaName":1403,"dataGaLocation":1149},"/whats-new/","whats new",{"text":1405,"config":1406,"menu":1408},"Company",{"dataNavLevelOne":1407},"company",{"type":1200,"columns":1409},[1410],{"items":1411},[1412,1417,1423,1425,1430,1435,1440,1445,1450,1455,1460],{"text":1413,"config":1414},"About",{"href":1415,"dataGaName":1416,"dataGaLocation":1149},"/company/","about",{"text":1418,"config":1419,"footerGa":1422},"Jobs",{"href":1420,"dataGaName":1421,"dataGaLocation":1149},"/jobs/","jobs",{"dataGaName":1421},{"text":1384,"config":1424},{"href":1386,"dataGaName":1387,"dataGaLocation":1149},{"text":1426,"config":1427},"Leadership",{"href":1428,"dataGaName":1429,"dataGaLocation":1149},"/company/team/e-group/","leadership",{"text":1431,"config":1432},"Team",{"href":1433,"dataGaName":1434,"dataGaLocation":1149},"/company/team/","team",{"text":1436,"config":1437},"Handbook",{"href":1438,"dataGaName":1439,"dataGaLocation":1149},"https://handbook.gitlab.com/","handbook",{"text":1441,"config":1442},"Investor relations",{"href":1443,"dataGaName":1444,"dataGaLocation":1149},"https://ir.gitlab.com/","investor relations",{"text":1446,"config":1447},"Trust Center",{"href":1448,"dataGaName":1449,"dataGaLocation":1149},"/security/","trust center",{"text":1451,"config":1452},"AI Transparency Center",{"href":1453,"dataGaName":1454,"dataGaLocation":1149},"/ai-transparency-center/","ai transparency center",{"text":1456,"config":1457},"Newsletter",{"href":1458,"dataGaName":1459,"dataGaLocation":1149},"/company/contact/#contact-forms","newsletter",{"text":1461,"config":1462},"Press",{"href":1463,"dataGaName":1464,"dataGaLocation":1149},"/press/","press",{"text":1466,"config":1467,"menu":1468},"Contact us",{"dataNavLevelOne":1407},{"type":1200,"columns":1469},[1470],{"items":1471},[1472,1475,1480],{"text":1156,"config":1473},{"href":1158,"dataGaName":1474,"dataGaLocation":1149},"talk to sales",{"text":1476,"config":1477},"Support portal",{"href":1478,"dataGaName":1479,"dataGaLocation":1149},"https://support.gitlab.com","support portal",{"text":1481,"config":1482},"Customer portal",{"href":1483,"dataGaName":1484,"dataGaLocation":1149},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1486,"login":1487,"suggestions":1494},"Close",{"text":1488,"link":1489},"To search repositories and projects, login to",{"text":1490,"config":1491},"gitlab.com",{"href":1163,"dataGaName":1492,"dataGaLocation":1493},"search login","search",{"text":1495,"default":1496},"Suggestions",[1497,1499,1503,1505,1509,1513],{"text":1180,"config":1498},{"href":1185,"dataGaName":1180,"dataGaLocation":1493},{"text":1500,"config":1501},"Code Suggestions (AI)",{"href":1502,"dataGaName":1500,"dataGaLocation":1493},"/solutions/code-suggestions/",{"text":1216,"config":1504},{"href":1218,"dataGaName":1216,"dataGaLocation":1493},{"text":1506,"config":1507},"GitLab on AWS",{"href":1508,"dataGaName":1506,"dataGaLocation":1493},"/partners/technology-partners/aws/",{"text":1510,"config":1511},"GitLab on Google Cloud",{"href":1512,"dataGaName":1510,"dataGaLocation":1493},"/partners/technology-partners/google-cloud-platform/",{"text":1514,"config":1515},"Why GitLab?",{"href":1193,"dataGaName":1514,"dataGaLocation":1493},{"freeTrial":1517,"mobileIcon":1522,"desktopIcon":1527,"secondaryButton":1530},{"text":1518,"config":1519},"Start free trial",{"href":1520,"dataGaName":1154,"dataGaLocation":1521},"https://gitlab.com/-/trials/new/","nav",{"altText":1523,"config":1524},"Gitlab Icon",{"src":1525,"dataGaName":1526,"dataGaLocation":1521},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1523,"config":1528},{"src":1529,"dataGaName":1526,"dataGaLocation":1521},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1531,"config":1532},"Get Started",{"href":1533,"dataGaName":1534,"dataGaLocation":1521},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1536,"mobileIcon":1540,"desktopIcon":1542},{"text":1537,"config":1538},"Learn more about GitLab Duo",{"href":1185,"dataGaName":1539,"dataGaLocation":1521},"gitlab duo",{"altText":1523,"config":1541},{"src":1525,"dataGaName":1526,"dataGaLocation":1521},{"altText":1523,"config":1543},{"src":1529,"dataGaName":1526,"dataGaLocation":1521},{"button":1545,"mobileIcon":1550,"desktopIcon":1552},{"text":1546,"config":1547},"/switch",{"href":1548,"dataGaName":1549,"dataGaLocation":1521},"#contact","switch",{"altText":1523,"config":1551},{"src":1525,"dataGaName":1526,"dataGaLocation":1521},{"altText":1523,"config":1553},{"src":1554,"dataGaName":1526,"dataGaLocation":1521},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1556,"mobileIcon":1561,"desktopIcon":1563},{"text":1557,"config":1558},"Back to pricing",{"href":1298,"dataGaName":1559,"dataGaLocation":1521,"icon":1560},"back to pricing","GoBack",{"altText":1523,"config":1562},{"src":1525,"dataGaName":1526,"dataGaLocation":1521},{"altText":1523,"config":1564},{"src":1529,"dataGaName":1526,"dataGaLocation":1521},{"title":1566,"button":1567,"config":1572},"See how agentic AI transforms software delivery",{"text":1568,"config":1569},"Sign up for GitLab Transcend on June 10",{"href":1570,"dataGaName":1571,"dataGaLocation":1149},"/events/transcend/virtual/","transcend event",{"layout":1573,"disabled":1135},"release",{"data":1575},{"text":1576,"source":1577,"edit":1583,"contribute":1588,"config":1593,"items":1598,"minimal":1808},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1578,"config":1579},"View page source",{"href":1580,"dataGaName":1581,"dataGaLocation":1582},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1584,"config":1585},"Edit this page",{"href":1586,"dataGaName":1587,"dataGaLocation":1582},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1589,"config":1590},"Please contribute",{"href":1591,"dataGaName":1592,"dataGaLocation":1582},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1594,"facebook":1595,"youtube":1596,"linkedin":1597},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1599,1646,1700,1744,1774],{"title":1296,"links":1600,"subMenu":1615},[1601,1605,1610],{"text":1602,"config":1603},"View plans",{"href":1298,"dataGaName":1604,"dataGaLocation":1582},"view plans",{"text":1606,"config":1607},"Why Premium?",{"href":1608,"dataGaName":1609,"dataGaLocation":1582},"/pricing/premium/","why premium",{"text":1611,"config":1612},"Why Ultimate?",{"href":1613,"dataGaName":1614,"dataGaLocation":1582},"/pricing/ultimate/","why ultimate",[1616],{"title":1617,"links":1618},"Contact Us",[1619,1622,1624,1626,1631,1636,1641],{"text":1620,"config":1621},"Contact sales",{"href":1158,"dataGaName":1159,"dataGaLocation":1582},{"text":1476,"config":1623},{"href":1478,"dataGaName":1479,"dataGaLocation":1582},{"text":1481,"config":1625},{"href":1483,"dataGaName":1484,"dataGaLocation":1582},{"text":1627,"config":1628},"Status",{"href":1629,"dataGaName":1630,"dataGaLocation":1582},"https://status.gitlab.com/","status",{"text":1632,"config":1633},"Terms of use",{"href":1634,"dataGaName":1635,"dataGaLocation":1582},"/terms/","terms of use",{"text":1637,"config":1638},"Privacy statement",{"href":1639,"dataGaName":1640,"dataGaLocation":1582},"/privacy/","privacy statement",{"text":1642,"config":1643},"Cookie preferences",{"dataGaName":1644,"dataGaLocation":1582,"id":1645,"isOneTrustButton":147},"cookie preferences","ot-sdk-btn",{"title":1196,"links":1647,"subMenu":1656},[1648,1652],{"text":1649,"config":1650},"DevSecOps platform",{"href":1178,"dataGaName":1651,"dataGaLocation":1582},"devsecops platform",{"text":1653,"config":1654},"AI-Assisted Development",{"href":1185,"dataGaName":1655,"dataGaLocation":1582},"ai-assisted development",[1657],{"title":1658,"links":1659},"Topics",[1660,1665,1670,1675,1680,1685,1690,1695],{"text":1661,"config":1662},"CICD",{"href":1663,"dataGaName":1664,"dataGaLocation":1582},"/topics/ci-cd/","cicd",{"text":1666,"config":1667},"GitOps",{"href":1668,"dataGaName":1669,"dataGaLocation":1582},"/topics/gitops/","gitops",{"text":1671,"config":1672},"DevOps",{"href":1673,"dataGaName":1674,"dataGaLocation":1582},"/topics/devops/","devops",{"text":1676,"config":1677},"Version Control",{"href":1678,"dataGaName":1679,"dataGaLocation":1582},"/topics/version-control/","version control",{"text":1681,"config":1682},"DevSecOps",{"href":1683,"dataGaName":1684,"dataGaLocation":1582},"/topics/devsecops/","devsecops",{"text":1686,"config":1687},"Cloud Native",{"href":1688,"dataGaName":1689,"dataGaLocation":1582},"/topics/cloud-native/","cloud native",{"text":1691,"config":1692},"AI for Coding",{"href":1693,"dataGaName":1694,"dataGaLocation":1582},"/topics/devops/ai-for-coding/","ai for coding",{"text":1696,"config":1697},"Agentic AI",{"href":1698,"dataGaName":1699,"dataGaLocation":1582},"/topics/agentic-ai/","agentic ai",{"title":1701,"links":1702},"Solutions",[1703,1705,1707,1712,1716,1719,1723,1726,1728,1731,1734,1739],{"text":1240,"config":1704},{"href":1235,"dataGaName":1240,"dataGaLocation":1582},{"text":1229,"config":1706},{"href":1212,"dataGaName":1213,"dataGaLocation":1582},{"text":1708,"config":1709},"Agile development",{"href":1710,"dataGaName":1711,"dataGaLocation":1582},"/solutions/agile-delivery/","agile delivery",{"text":1713,"config":1714},"SCM",{"href":1225,"dataGaName":1715,"dataGaLocation":1582},"source code management",{"text":1661,"config":1717},{"href":1218,"dataGaName":1718,"dataGaLocation":1582},"continuous integration & delivery",{"text":1720,"config":1721},"Value stream management",{"href":1268,"dataGaName":1722,"dataGaLocation":1582},"value stream management",{"text":1666,"config":1724},{"href":1725,"dataGaName":1669,"dataGaLocation":1582},"/solutions/gitops/",{"text":1278,"config":1727},{"href":1281,"dataGaName":1282,"dataGaLocation":1582},{"text":1729,"config":1730},"Small business",{"href":1287,"dataGaName":1288,"dataGaLocation":1582},{"text":1732,"config":1733},"Public sector",{"href":1293,"dataGaName":1294,"dataGaLocation":1582},{"text":1735,"config":1736},"Education",{"href":1737,"dataGaName":1738,"dataGaLocation":1582},"/solutions/education/","education",{"text":1740,"config":1741},"Financial services",{"href":1742,"dataGaName":1743,"dataGaLocation":1582},"/solutions/finance/","financial services",{"title":1301,"links":1745},[1746,1748,1750,1752,1755,1757,1760,1762,1764,1766,1768,1770,1772],{"text":1314,"config":1747},{"href":1316,"dataGaName":1317,"dataGaLocation":1582},{"text":1319,"config":1749},{"href":1321,"dataGaName":1322,"dataGaLocation":1582},{"text":1324,"config":1751},{"href":1326,"dataGaName":1327,"dataGaLocation":1582},{"text":1329,"config":1753},{"href":1331,"dataGaName":1754,"dataGaLocation":1582},"docs",{"text":1352,"config":1756},{"href":1354,"dataGaName":1355,"dataGaLocation":1582},{"text":1758,"config":1759},"What's new",{"href":1402,"dataGaName":1403,"dataGaLocation":1582},{"text":1347,"config":1761},{"href":1349,"dataGaName":1350,"dataGaLocation":1582},{"text":1361,"config":1763},{"href":1363,"dataGaName":1364,"dataGaLocation":1582},{"text":1369,"config":1765},{"href":1371,"dataGaName":1372,"dataGaLocation":1582},{"text":1374,"config":1767},{"href":1376,"dataGaName":1377,"dataGaLocation":1582},{"text":1379,"config":1769},{"href":1381,"dataGaName":1382,"dataGaLocation":1582},{"text":1384,"config":1771},{"href":1386,"dataGaName":1387,"dataGaLocation":1582},{"text":1389,"config":1773},{"href":1391,"dataGaName":1392,"dataGaLocation":1582},{"title":1405,"links":1775},[1776,1778,1780,1782,1784,1786,1788,1792,1797,1799,1801,1803],{"text":1413,"config":1777},{"href":1415,"dataGaName":1407,"dataGaLocation":1582},{"text":1418,"config":1779},{"href":1420,"dataGaName":1421,"dataGaLocation":1582},{"text":1426,"config":1781},{"href":1428,"dataGaName":1429,"dataGaLocation":1582},{"text":1431,"config":1783},{"href":1433,"dataGaName":1434,"dataGaLocation":1582},{"text":1436,"config":1785},{"href":1438,"dataGaName":1439,"dataGaLocation":1582},{"text":1441,"config":1787},{"href":1443,"dataGaName":1444,"dataGaLocation":1582},{"text":1789,"config":1790},"Sustainability",{"href":1791,"dataGaName":1789,"dataGaLocation":1582},"/sustainability/",{"text":1793,"config":1794},"Diversity, inclusion and belonging (DIB)",{"href":1795,"dataGaName":1796,"dataGaLocation":1582},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1446,"config":1798},{"href":1448,"dataGaName":1449,"dataGaLocation":1582},{"text":1456,"config":1800},{"href":1458,"dataGaName":1459,"dataGaLocation":1582},{"text":1461,"config":1802},{"href":1463,"dataGaName":1464,"dataGaLocation":1582},{"text":1804,"config":1805},"Modern Slavery Transparency Statement",{"href":1806,"dataGaName":1807,"dataGaLocation":1582},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1809},[1810,1813,1816],{"text":1811,"config":1812},"Terms",{"href":1634,"dataGaName":1635,"dataGaLocation":1582},{"text":1814,"config":1815},"Cookies",{"dataGaName":1644,"dataGaLocation":1582,"id":1645,"isOneTrustButton":147},{"text":1817,"config":1818},"Privacy",{"href":1639,"dataGaName":1640,"dataGaLocation":1582},[1820],{"id":1821,"title":7,"body":1129,"config":1822,"content":1824,"description":1129,"extension":1828,"meta":1829,"navigation":147,"path":1830,"seo":1831,"stem":1832,"__hash__":1833},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":1823},"BlogAuthor",{"name":7,"config":1825},{"headshot":1826,"ctfId":1827},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659879/Blog/Author%20Headshots/dnsmichi-headshot.jpg","dnsmichi","yml",{},"/en-us/blog/authors/michael-friedrich",{},"en-us/blog/authors/michael-friedrich","lJ-nfRIhdG49Arfrxdn1Vv4UppwD51BB13S3HwIswt4",[1835,1843,1849],{"title":1836,"description":1837,"heroImage":1838,"category":1125,"date":1839,"authors":1840,"slug":1842,"externalUrl":1129},"Transform MRs from manual tasks to an automated workflow","This release brings a more powerful Developer Flow, autonomous merge conflict resolution, and one-click rebase and merge to GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1779189265/iqzyhhiwagxzwywvjzow.png","2026-05-21",[1841],"Corinne Dent","transform-mrs-to-automated-workflow",{"title":1844,"description":1845,"heroImage":1838,"category":1125,"date":1839,"authors":1846,"slug":1848,"externalUrl":1129},"More AI models for GitLab Duo Agent Platform Self-Hosted","GitLab 19.0 brings broader open source model support for Duo Agent Platform Self-Hosted. Customers in air-gapped and regulated environments now have more capable AI options.",[1847],"Jordan Janes","more-ai-models-for-duo-agent-platform-self-hosted",{"title":1850,"description":1851,"heroImage":1852,"category":1125,"date":1853,"authors":1854,"slug":1856,"externalUrl":1129},"Beyond BYOK: Why governance matters for AI agents","Copilot's BYOK offers flexibility, but true enterprise governance requires more. GitLab Duo CLI provides auditable, controlled CI/CD automation for AI agents.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-05-18",[1855],"Jessica Hurwitz","gitlab-duo-cli-governance",{"promotions":1858},[1859,1872,1883,1895],{"id":1860,"categories":1861,"header":1862,"text":1863,"button":1864,"image":1869},"ai-modernization",[1125],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1865,"config":1866},"Get your AI maturity score",{"href":1867,"dataGaName":1868,"dataGaLocation":1355},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1870},{"src":1871},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1873,"categories":1874,"header":1875,"text":1863,"button":1876,"image":1880},"devops-modernization",[1141,1684],"Are you just managing tools or shipping innovation?",{"text":1877,"config":1878},"Get your DevOps maturity score",{"href":1879,"dataGaName":1868,"dataGaLocation":1355},"/assessments/devops-modernization-assessment/",{"config":1881},{"src":1882},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1884,"categories":1885,"header":1887,"text":1863,"button":1888,"image":1892},"security-modernization",[1886],"security","Are you trading speed for security?",{"text":1889,"config":1890},"Get your security maturity score",{"href":1891,"dataGaName":1868,"dataGaLocation":1355},"/assessments/security-modernization-assessment/",{"config":1893},{"src":1894},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1896,"paths":1897,"header":1900,"text":1901,"button":1902,"image":1907},"github-azure-migration",[1898,1899],"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":1903,"config":1904},"See how GitLab compares to GitHub",{"href":1905,"dataGaName":1906,"dataGaLocation":1355},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1908},{"src":1882},{"header":1910,"blurb":1911,"button":1912,"secondaryButton":1917},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1913,"config":1914},"Get your free trial",{"href":1915,"dataGaName":1154,"dataGaLocation":1916},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1620,"config":1918},{"href":1158,"dataGaName":1159,"dataGaLocation":1916},1779493410372]