[{"data":1,"prerenderedAt":1768},["ShallowReactive",2],{"/blog/automating-agile-workflows-with-the-gitlab-triage-gem":3,"navigation-en-us":991,"banner-en-us":1417,"footer-en-us":1427,"blog-post-authors-en-us-GitLab":1671,"blog-related-posts-en-us-automating-agile-workflows-with-the-gitlab-triage-gem":1686,"blog-promotions-en-us":1705,"next-steps-en-us":1758},{"id":4,"title":5,"authors":6,"body":8,"category":970,"date":971,"description":972,"extension":973,"externalUrl":974,"faq":974,"featured":975,"heroImage":976,"meta":977,"navigation":297,"path":978,"seo":979,"slug":983,"stem":984,"tags":985,"template":989,"updatedDate":974,"__hash__":990},"blogPosts/en-us/blog/automating-agile-workflows-with-the-gitlab-triage-gem.md","Automating Agile workflows with the gitlab-triage gem",[7],"GitLab",{"type":9,"value":10,"toc":959},"minimark",[11,18,31,36,39,45,74,81,87,124,134,138,141,147,172,178,206,212,219,395,398,410,415,418,456,481,485,498,545,569,586,590,595,621,629,760,767,775,781,784,790,793,799,831,840,844,882,886,892,911,915,918,955],[12,13,14],"p",{},[15,16,17],"em",{},"Welcome to our \"Getting started with GitLab\" series, where we help newcomers get familiar with the GitLab DevSecOps platform.",[12,19,20,21,30],{},"This post dives into the ",[22,23,26],"a",{"href":24,"rel":25},"https://gitlab.com/gitlab-org/ruby/gems/gitlab-triage",[],[27,28,29],"code",{},"gitlab-triage"," gem, a powerful tool that lets you create bots to automate your Agile workflow. Say goodbye to manual tasks and hello to streamlined efficiency.",[32,33,35],"h2",{"id":34},"why-automate-your-workflow","Why automate your workflow?",[12,37,38],{},"Efficiency is key in software development. Automating repetitive tasks like triaging issues and merge requests frees up valuable time for your team to focus on what matters most: building amazing software.",[12,40,41,42,44],{},"With ",[27,43,29],{},", you can:",[46,47,48,56,62,68],"ul",{},[49,50,51,55],"li",{},[52,53,54],"strong",{},"Ensure consistency:"," Apply labels and assign issues automatically based on predefined rules.",[49,57,58,61],{},[52,59,60],{},"Improve response times:"," Get immediate feedback on new issues and merge requests.",[49,63,64,67],{},[52,65,66],{},"Reduce manual effort:"," Eliminate the need for manual triage and updates.",[49,69,70,73],{},[52,71,72],{},"Boost productivity:"," Free up your team to focus on coding and innovation.",[32,75,77,78,80],{"id":76},"introducing-the-gitlab-triage-gem","Introducing the ",[27,79,29],{}," gem",[12,82,83,84,86],{},"The ",[27,85,29],{}," gem is a Ruby library that allows you to create bots that interact with your GitLab projects. These bots can automatically perform a wide range of actions, including:",[46,88,89,95,101,107,113,119],{},[49,90,91,94],{},[52,92,93],{},"Labeling:"," Automatically categorize issues and merge requests.",[49,96,97,100],{},[52,98,99],{},"Commenting:"," Provide updates, request information, or give feedback.",[49,102,103,106],{},[52,104,105],{},"Assigning:"," Assign issues and merge requests to the appropriate team members.",[49,108,109,112],{},[52,110,111],{},"Closing:"," Close stale or resolved issues and merge requests.",[49,114,115,118],{},[52,116,117],{},"Creating:"," Generate new issues based on specific events or conditions.",[49,120,121],{},[52,122,123],{},"And much more!",[12,125,126,127,133],{},"Check out the ",[22,128,130,132],{"href":24,"rel":129},[],[27,131,29],{}," gem repository",".",[32,135,137],{"id":136},"setting-up-your-triage-bot","Setting up your triage bot",[12,139,140],{},"Let's get your first triage bot up and running!",[142,143,144],"ol",{},[49,145,146],{},"Install the gem. (Note: The gem command is available with Ruby programming language installed.)",[148,149,154],"pre",{"className":150,"code":151,"language":152,"meta":153,"style":153},"language-bash shiki shiki-themes github-light","gem install gitlab-triage\n","bash","",[27,155,156],{"__ignoreMap":153},[157,158,161,165,169],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"s7eDp","gem",[157,166,168],{"class":167},"sYBdl"," install",[157,170,171],{"class":167}," gitlab-triage\n",[142,173,175],{"start":174},2,[49,176,177],{},"Get your GitLab API token.",[46,179,180,188,194,201],{},[49,181,182,183,133],{},"Go to your GitLab ",[22,184,187],{"href":185,"rel":186},"https://gitlab.com/-/profile/preferences",[],"profile settings",[49,189,190,191,133],{},"Navigate to ",[52,192,193],{},"Access Tokens",[49,195,196,197,200],{},"Create a new token with the ",[27,198,199],{},"api"," scope.",[49,202,203],{},[52,204,205],{},"Keep your token secure and set an expiration date for it based on when you will be done with this walkthrough!",[142,207,209],{"start":208},3,[49,210,211],{},"Define your triage policies.",[12,213,214,215,218],{},"Create a file named ",[27,216,217],{},".triage-policies.yml"," in your project's root directory. This file will contain the rules that govern your bot's behavior. Here's a simple example:",[148,220,224],{"className":221,"code":222,"language":223,"meta":153,"style":153},"language-yaml shiki shiki-themes github-light","---\n- name: \"Apply 'WIP' label\"\n  condition:\n    draft: true\n  action:\n    labels:\n      - status::wip\n\n- name: \"Request more information on old issue\"\n  condition:\n   date:\n    attribute: updated_at\n    condition: older_than\n    interval_type: months\n    interval: 12\n  action:\n    comment: |\n      {{author}} This issue has been open for more than 12 months, is this still an issue?\n\n","yaml",[27,225,226,231,247,255,267,275,283,292,299,311,318,326,337,348,359,370,377,389],{"__ignoreMap":153},[157,227,228],{"class":159,"line":160},[157,229,230],{"class":163},"---\n",[157,232,233,237,241,244],{"class":159,"line":174},[157,234,236],{"class":235},"sgsFI","- ",[157,238,240],{"class":239},"shJU0","name",[157,242,243],{"class":235},": ",[157,245,246],{"class":167},"\"Apply 'WIP' label\"\n",[157,248,249,252],{"class":159,"line":208},[157,250,251],{"class":239},"  condition",[157,253,254],{"class":235},":\n",[157,256,258,261,263],{"class":159,"line":257},4,[157,259,260],{"class":239},"    draft",[157,262,243],{"class":235},[157,264,266],{"class":265},"sYu0t","true\n",[157,268,270,273],{"class":159,"line":269},5,[157,271,272],{"class":239},"  action",[157,274,254],{"class":235},[157,276,278,281],{"class":159,"line":277},6,[157,279,280],{"class":239},"    labels",[157,282,254],{"class":235},[157,284,286,289],{"class":159,"line":285},7,[157,287,288],{"class":235},"      - ",[157,290,291],{"class":167},"status::wip\n",[157,293,295],{"class":159,"line":294},8,[157,296,298],{"emptyLinePlaceholder":297},true,"\n",[157,300,302,304,306,308],{"class":159,"line":301},9,[157,303,236],{"class":235},[157,305,240],{"class":239},[157,307,243],{"class":235},[157,309,310],{"class":167},"\"Request more information on old issue\"\n",[157,312,314,316],{"class":159,"line":313},10,[157,315,251],{"class":239},[157,317,254],{"class":235},[157,319,321,324],{"class":159,"line":320},11,[157,322,323],{"class":239},"   date",[157,325,254],{"class":235},[157,327,329,332,334],{"class":159,"line":328},12,[157,330,331],{"class":239},"    attribute",[157,333,243],{"class":235},[157,335,336],{"class":167},"updated_at\n",[157,338,340,343,345],{"class":159,"line":339},13,[157,341,342],{"class":239},"    condition",[157,344,243],{"class":235},[157,346,347],{"class":167},"older_than\n",[157,349,351,354,356],{"class":159,"line":350},14,[157,352,353],{"class":239},"    interval_type",[157,355,243],{"class":235},[157,357,358],{"class":167},"months\n",[157,360,362,365,367],{"class":159,"line":361},15,[157,363,364],{"class":239},"    interval",[157,366,243],{"class":235},[157,368,369],{"class":265},"12\n",[157,371,373,375],{"class":159,"line":372},16,[157,374,272],{"class":239},[157,376,254],{"class":235},[157,378,380,383,385],{"class":159,"line":379},17,[157,381,382],{"class":239},"    comment",[157,384,243],{"class":235},[157,386,388],{"class":387},"sD7c4","|\n",[157,390,392],{"class":159,"line":391},18,[157,393,394],{"class":167},"      {{author}} This issue has been open for more than 12 months, is this still an issue?\n",[12,396,397],{},"This configuration defines two policies:",[46,399,400,407],{},[49,401,402,403,406],{},"The first policy applies the ",[27,404,405],{},"status::wip"," label to any issue that is in draft.",[49,408,409],{},"The second policy adds a comment to an issue that the issue has not been updated in 12 months.",[142,411,412],{"start":257},[49,413,414],{},"Run your bot.",[12,416,417],{},"You can run your bot manually using the following command:",[148,419,421],{"className":150,"code":420,"language":152,"meta":153,"style":153},"gitlab-triage -t \u003Cyour_api_token> -p \u003Cyour_project_id>\n",[27,422,423],{"__ignoreMap":153},[157,424,425,427,430,433,436,439,442,445,447,450,453],{"class":159,"line":160},[157,426,29],{"class":163},[157,428,429],{"class":265}," -t",[157,431,432],{"class":387}," \u003C",[157,434,435],{"class":167},"your_api_toke",[157,437,438],{"class":235},"n",[157,440,441],{"class":387},">",[157,443,444],{"class":265}," -p",[157,446,432],{"class":387},[157,448,449],{"class":167},"your_project_i",[157,451,452],{"class":235},"d",[157,454,455],{"class":387},">\n",[12,457,458,459,462,463,466,467,472,473,476,477,480],{},"Replace ",[27,460,461],{},"\u003Cyour_api_token>"," with your GitLab API token and ",[27,464,465],{},"\u003Cyour_project_id>"," with the ",[22,468,471],{"href":469,"rel":470},"https://docs.gitlab.com/user/project/working_with_projects/#access-a-project-by-using-the-project-id",[],"ID of your GitLab project",". If you would like to see the impact of actions before they are taken, you can add the ",[27,474,475],{},"-n"," or ",[27,478,479],{},"--dry-run"," to test out the policies first.",[32,482,484],{"id":483},"automating-with-gitlab-cicd","Automating with GitLab CI/CD",[12,486,487,488,493,494,497],{},"To automate the execution of your triage bot, integrate it with ",[22,489,492],{"href":490,"rel":491},"https://about.gitlab.com/blog/ultimate-guide-to-ci-cd-fundamentals-to-advanced-implementation/",[],"GitLab CI/CD",". Here's an example ",[27,495,496],{},".gitlab-ci.yml"," configuration:",[148,499,501],{"className":221,"code":500,"language":223,"meta":153,"style":153},"triage:\n  script:\n    - gem install gitlab-triage\n    - gitlab-triage -t $GITLAB_TOKEN -p $CI_PROJECT_ID\n  only:\n    - schedules\n\n",[27,502,503,510,517,524,531,538],{"__ignoreMap":153},[157,504,505,508],{"class":159,"line":160},[157,506,507],{"class":239},"triage",[157,509,254],{"class":235},[157,511,512,515],{"class":159,"line":174},[157,513,514],{"class":239},"  script",[157,516,254],{"class":235},[157,518,519,522],{"class":159,"line":208},[157,520,521],{"class":235},"    - ",[157,523,151],{"class":167},[157,525,526,528],{"class":159,"line":257},[157,527,521],{"class":235},[157,529,530],{"class":167},"gitlab-triage -t $GITLAB_TOKEN -p $CI_PROJECT_ID\n",[157,532,533,536],{"class":159,"line":269},[157,534,535],{"class":239},"  only",[157,537,254],{"class":235},[157,539,540,542],{"class":159,"line":277},[157,541,521],{"class":235},[157,543,544],{"class":167},"schedules\n",[12,546,547,548,550,551,554,555,560,561,564,565,568],{},"This configuration defines a job named \"triage\" that installs the ",[27,549,29],{}," gem and runs the bot using the ",[27,552,553],{},"$GITLAB_TOKEN"," (a predefined ",[22,556,559],{"href":557,"rel":558},"https://docs.gitlab.com/ci/variables/",[],"CI/CD variable",") and the ",[27,562,563],{},"$CI_PROJECT_ID"," variable. The ",[27,566,567],{},"only: schedules"," clause ensures that the job runs only on a schedule.",[12,570,571,572,577,578,581,582,585],{},"To create a ",[22,573,576],{"href":574,"rel":575},"https://docs.gitlab.com/ci/pipelines/schedules/",[],"schedule",", go to your project's ",[52,579,580],{},"CI/CD"," settings and navigate to ",[52,583,584],{},"Schedules",". Create a new schedule and define the frequency at which you want your bot to run (e.g., daily, hourly).",[32,587,589],{"id":588},"advanced-triage-policies","Advanced triage policies",[12,591,592,594],{},[27,593,29],{}," offers a range of advanced features for creating more complex triage policies:",[46,596,597,603,609],{},[49,598,599,602],{},[52,600,601],{},"Regular expressions:"," Use regular expressions for more powerful pattern matching.",[49,604,605,608],{},[52,606,607],{},"Summary policies:"," Consolidate related issues into a single summary issue.",[49,610,611,614,615,620],{},[52,612,613],{},"Custom actions:"," Define custom actions using ",[22,616,619],{"href":617,"rel":618},"https://gitlab.com/gitlab-org/ruby/gems/gitlab-triage#can-i-customize",[],"Ruby code blocks"," to perform more complex operations using the GitLab API.",[12,622,623,624,133],{},"Here are two advanced real-world examples from the triage bot used by the Developer Advocacy team at GitLab. You can view the full policies in ",[22,625,628],{"href":626,"rel":627},"https://gitlab.com/gitlab-da/projects/devrel-bot/-/blob/master/.triage-policies.yml?ref_type=heads",[],"this file",[148,630,632],{"className":221,"code":631,"language":223,"meta":153,"style":153},"- name: Issues where DA team member is an assignee outside DA-Meta project i.e. DevRel-Influenced\n  conditions:\n    assignee_member:\n      source: group\n      condition: member_of\n      source_id: 1008\n    state: opened\n    ruby: get_project_id != 18 \n    forbidden_labels:\n      - developer-advocacy\n  actions:   \n    labels:\n      - developer-advocacy\n      - DevRel-Influenced\n      - DA-Bot::Skip\n\n",[27,633,634,645,652,659,669,679,689,699,712,719,726,734,740,746,753],{"__ignoreMap":153},[157,635,636,638,640,642],{"class":159,"line":160},[157,637,236],{"class":235},[157,639,240],{"class":239},[157,641,243],{"class":235},[157,643,644],{"class":167},"Issues where DA team member is an assignee outside DA-Meta project i.e. DevRel-Influenced\n",[157,646,647,650],{"class":159,"line":174},[157,648,649],{"class":239},"  conditions",[157,651,254],{"class":235},[157,653,654,657],{"class":159,"line":208},[157,655,656],{"class":239},"    assignee_member",[157,658,254],{"class":235},[157,660,661,664,666],{"class":159,"line":257},[157,662,663],{"class":239},"      source",[157,665,243],{"class":235},[157,667,668],{"class":167},"group\n",[157,670,671,674,676],{"class":159,"line":269},[157,672,673],{"class":239},"      condition",[157,675,243],{"class":235},[157,677,678],{"class":167},"member_of\n",[157,680,681,684,686],{"class":159,"line":277},[157,682,683],{"class":239},"      source_id",[157,685,243],{"class":235},[157,687,688],{"class":265},"1008\n",[157,690,691,694,696],{"class":159,"line":285},[157,692,693],{"class":239},"    state",[157,695,243],{"class":235},[157,697,698],{"class":167},"opened\n",[157,700,701,704,706,709],{"class":159,"line":294},[157,702,703],{"class":239},"    ruby",[157,705,243],{"class":235},[157,707,708],{"class":167},"get_project_id != 18",[157,710,711],{"class":235}," \n",[157,713,714,717],{"class":159,"line":301},[157,715,716],{"class":239},"    forbidden_labels",[157,718,254],{"class":235},[157,720,721,723],{"class":159,"line":313},[157,722,288],{"class":235},[157,724,725],{"class":167},"developer-advocacy\n",[157,727,728,731],{"class":159,"line":320},[157,729,730],{"class":239},"  actions",[157,732,733],{"class":235},":   \n",[157,735,736,738],{"class":159,"line":328},[157,737,280],{"class":239},[157,739,254],{"class":235},[157,741,742,744],{"class":159,"line":339},[157,743,288],{"class":235},[157,745,725],{"class":167},[157,747,748,750],{"class":159,"line":350},[157,749,288],{"class":235},[157,751,752],{"class":167},"DevRel-Influenced\n",[157,754,755,757],{"class":159,"line":361},[157,756,288],{"class":235},[157,758,759],{"class":167},"DA-Bot::Skip\n",[12,761,762,763,766],{},"This example for issues across a group, excluding those in the project with the ID of 18, have assignees who are members of the group with ID of 1008 and do not have the label ",[27,764,765],{},"developer-advocacy"," on them. This policy helps the Developer Advocacy team at GitLab to find issues members of the team are assigned to but are not in their team’s project. This helps the team identify and keep track of contributions made outside of the team by adding the teams’ labels.",[148,768,773],{"className":769,"code":771,"language":772,"meta":153},[770],"language-text","- name: Missing Due Dates\n  conditions:\n    ruby: missing_due_date\n    state: opened\n    labels:\n      - developer-advocacy\n    forbidden_labels:\n      - DA-Due::N/A\n      - DA-Bot::Skip\n      - DA-Status::FYI\n      - DA-Status::OnHold\n      - CFP\n      - DA-Bot::Triage\n  actions:\n    labels:\n      - DA-Bot-Auto-Due-Date\n    comment: |\n      /due #{get_current_quarter_last_date}\n\n","text",[27,774,771],{"__ignoreMap":153},[12,776,777,778,780],{},"This second example checks for all issues with the ",[27,779,765],{}," label, which do not include labels in the forbidden labels list and when their due dates have passed. It updates the due dates automatically by commenting on the issue with a slash command and a date that is generated using Ruby.",[12,782,783],{},"The Ruby scripts used in the policies are defined in a separate file as shown below. This feature allows you to be flexible in working with your filters and actions. You can see functions are created for different Ruby commands that we used in our policies.",[148,785,788],{"className":786,"code":787,"language":772,"meta":153},[770],"require 'json'\nrequire 'date'\nrequire \"faraday\"\nrequire 'dotenv/load'\n\nmodule DATriagePlugin\n  def last_comment_at\n    conn = Faraday.new(\n      url: notes_url+\"?sort=desc&order_by=created_at&pagination=keyset&per_page=1\",\n      headers: {'PRIVATE-TOKEN' => ENV.fetch(\"PRIV_KEY\"), 'Content-Type' => 'application/json' }\n    )\n\n    response = conn.get()\n    if response.status == 200\n      jsonData = JSON.parse(response.body)\n      if jsonData.length > 0\n        Date.parse(jsonData[0]['created_at'])\n      else\n        Date.parse(resource[:created_at])\n      end\n    else\n      Date.parse(resource[:created_at])\n    end\n  end\n\n  def notes_url\n    resource[:_links][:notes]\n  end\n\n  def get_project_id\n    resource[:project_id]\n  end\n\n  def get_current_quarter_last_date()\n    yr = Time.now.year\n    case Time.now.month\n    when 2..4\n      lm = 4\n    when 5..7\n      lm = 7\n    when 8..10\n      lm = 10\n    when 11..12\n      lm = 1\n      yr = yr + 1\n    else\n      lm = 1    \n    end\n\n    return Date.new(yr, lm, -1) \n  end\n\n  def one_week_to_due_date\n    if(resource[:due_date] == nil)\n      false\n    else\n      days_to_due = (Date.parse(resource[:due_date]) - Date.today).to_i\n      if(days_to_due > 0 && days_to_due \u003C 7)\n        true\n      else\n        false\n      end\n    end\n  end\n\n  def due_date_past\n    if(resource[:due_date] == nil)\n      false\n    else\n      Date.today > Date.parse(resource[:due_date])\n    end\n  end\n\n  def missing_due_date\n    if(resource[:due_date] == nil)\n      true\n    else\n      false\n    end\n  end\n\nend\n\nGitlab::Triage::Resource::Context.include DATriagePlugin\n",[27,789,787],{"__ignoreMap":153},[12,791,792],{},"The triage bot is executed using the command:",[148,794,797],{"className":795,"code":796,"language":772,"meta":153},[770],"`gitlab-triage -r ./triage_bot/issue_triage_plugin.rb --debug --token $PRIV_KEY --source-id gitlab-com --source groups`  \n",[27,798,796],{"__ignoreMap":153},[46,800,801,807,813,819,825],{},[49,802,803,806],{},[27,804,805],{},"-r",": Passes in a  file of requirements for the performing triage. In this case we are passing in our Ruby functions.",[49,808,809,812],{},[27,810,811],{},"--debug",": Prints debugging information as part of the output.",[49,814,815,818],{},[27,816,817],{},"--token",": Is used to pass in a valid GitLab API token.",[49,820,821,824],{},[27,822,823],{},"--source",": Specifies if the sources of the issues it will search is within a group or a project.",[49,826,827,830],{},[27,828,829],{},"--source-id",": Takes in the ID of the selected source type – in this case, a group.",[12,832,833,834,839],{},"The GitLab ",[22,835,838],{"href":836,"rel":837},"https://gitlab.com/gitlab-org/quality/triage-ops",[],"triage-ops"," project is another real-world example that is more complex and you can learn how to build your own triage bot.",[32,841,843],{"id":842},"best-practices","Best practices",[46,845,846,852,858,864,870,876],{},[49,847,848,851],{},[52,849,850],{},"Start simple:"," Begin with basic policies and gradually increase complexity as needed.",[49,853,854,857],{},[52,855,856],{},"Test thoroughly:"," Test your policies in a staging environment before deploying them to production.",[49,859,860,863],{},[52,861,862],{},"Monitor regularly:"," Monitor your bot's activity to ensure it's behaving as expected.",[49,865,866,869],{},[52,867,868],{},"Use descriptive names:"," Give your policies clear and descriptive names for easy maintenance.",[49,871,872,875],{},[52,873,874],{},"Be mindful of the scope of your filters:"," You might be tempted to filter issues across groups where thousands of issues exist. However, this can slow down the triage and also make the process fail due to rate limitations against the GitLab API.",[49,877,878,881],{},[52,879,880],{},"Prioritize using labels for triages:"," To avoid spamming other users, labels are a good way to perform triages without cluttering comments and issues.",[32,883,885],{"id":884},"take-control-of-your-workflow","Take control of your workflow",[12,887,888,889,891],{},"With the ",[27,890,29],{}," gem, you can automate your GitLab workflow and unlock new levels of efficiency. Start by creating simple triage bots and gradually explore the more advanced features. You'll be amazed at how much time and effort you can save!",[893,894,895],"blockquote",{},[896,897,899,900,905,906,133],"h4",{"id":898},"want-to-take-your-learning-to-the-next-level-sign-up-for-gitlab-university-courses-or-you-can-get-going-right-away-with-a-free-trial-of-gitlab-ultimate","Want to take your learning to the next level? ",[22,901,904],{"href":902,"rel":903},"https://university.gitlab.com/",[],"Sign up for GitLab University courses",". Or you can get going right away with a ",[22,907,910],{"href":908,"rel":909},"https://about.gitlab.com/free-trial/",[],"free trial of GitLab Ultimate",[32,912,914],{"id":913},"getting-started-with-gitlab-series","\"Getting started with GitLab\" series",[12,916,917],{},"Read more articles in our \"Getting started with GitLab\" series:",[46,919,920,927,934,941,948],{},[49,921,922],{},[22,923,926],{"href":924,"rel":925},"https://about.gitlab.com/blog/getting-started-with-gitlab-how-to-manage-users/",[],"How to manage users",[49,928,929],{},[22,930,933],{"href":931,"rel":932},"https://about.gitlab.com/blog/getting-started-with-gitlab-how-to-import-your-projects-to-gitlab/",[],"How to import your projects to GitLab",[49,935,936],{},[22,937,940],{"href":938,"rel":939},"https://about.gitlab.com/blog/getting-started-with-gitlab-mastering-project-management/",[],"Mastering project management",[49,942,943],{},[22,944,947],{"href":945,"rel":946},"https://about.gitlab.com/blog/getting-started-with-gitlab-understanding-ci-cd/",[],"Understanding CI/CD",[49,949,950],{},[22,951,954],{"href":952,"rel":953},"https://about.gitlab.com/blog/getting-started-with-gitlab-working-with-ci-cd-variables/",[],"Working with CI/CD variables",[956,957,958],"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 .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 .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":153,"searchDepth":174,"depth":174,"links":960},[961,962,964,965,966,967,968,969],{"id":34,"depth":174,"text":35},{"id":76,"depth":174,"text":963},"Introducing the gitlab-triage gem",{"id":136,"depth":174,"text":137},{"id":483,"depth":174,"text":484},{"id":588,"depth":174,"text":589},{"id":842,"depth":174,"text":843},{"id":884,"depth":174,"text":885},{"id":913,"depth":174,"text":914},"product","2025-03-13","Learn how to automate repetitive tasks like triaging issues and merge requests to free up valuable developer time in our \"Getting Started with GitLab\" series.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659525/Blog/Hero%20Images/blog-getting-started-with-gitlab-banner-0497-option4-fy25.png",{},"/en-us/blog/automating-agile-workflows-with-the-gitlab-triage-gem",{"title":5,"description":972,"ogTitle":5,"ogDescription":972,"noIndex":975,"ogImage":976,"ogUrl":980,"ogSiteName":981,"ogType":982,"canonicalUrls":980},"https://about.gitlab.com/blog/automating-agile-workflows-with-the-gitlab-triage-gem","https://about.gitlab.com","article","automating-agile-workflows-with-the-gitlab-triage-gem","en-us/blog/automating-agile-workflows-with-the-gitlab-triage-gem",[986,987,970,988,580],"DevSecOps platform","tutorial","agile","BlogPost","6H_Hgby72gDlyYORBWNWiYqCUZdoBXAop75jogbOh18",{"logo":992,"freeTrial":997,"sales":1002,"login":1007,"items":1012,"search":1337,"minimal":1368,"duo":1387,"switchNav":1396,"pricingDeployment":1407},{"config":993},{"href":994,"dataGaName":995,"dataGaLocation":996},"/","gitlab logo","header",{"text":998,"config":999},"Get free trial",{"href":1000,"dataGaName":1001,"dataGaLocation":996},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1003,"config":1004},"Request a demo",{"href":1005,"dataGaName":1006,"dataGaLocation":996},"/sales/?contact-topic=request-demo","sales",{"text":1008,"config":1009},"Sign in",{"href":1010,"dataGaName":1011,"dataGaLocation":996},"https://gitlab.com/users/sign_in/","sign in",[1013,1042,1141,1146,1259,1315],{"text":1014,"config":1015,"menu":1017},"Platform",{"dataNavLevelOne":1016},"platform",{"type":1018,"columns":1019},"cards",[1020,1026,1034],{"title":1014,"description":1021,"link":1022},"The intelligent orchestration platform for DevSecOps",{"text":1023,"config":1024},"Explore our Platform",{"href":1025,"dataGaName":1016,"dataGaLocation":996},"/platform/",{"title":1027,"description":1028,"link":1029},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1030,"config":1031},"Meet GitLab Duo",{"href":1032,"dataGaName":1033,"dataGaLocation":996},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1035,"description":1036,"link":1037},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1038,"config":1039},"Learn more",{"href":1040,"dataGaName":1041,"dataGaLocation":996},"/why-gitlab/","why gitlab",{"text":1043,"left":297,"config":1044,"menu":1046},"Product",{"dataNavLevelOne":1045},"solutions",{"type":1047,"link":1048,"columns":1052,"feature":1120},"lists",{"text":1049,"config":1050},"View all Solutions",{"href":1051,"dataGaName":1045,"dataGaLocation":996},"/solutions/",[1053,1076,1099],{"title":1054,"description":1055,"link":1056,"items":1061},"Automation","CI/CD and automation to accelerate deployment",{"config":1057},{"icon":1058,"href":1059,"dataGaName":1060,"dataGaLocation":996},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1062,1065,1068,1072],{"text":580,"config":1063},{"href":1064,"dataGaLocation":996,"dataGaName":580},"/solutions/continuous-integration/",{"text":1027,"config":1066},{"href":1032,"dataGaLocation":996,"dataGaName":1067},"gitlab duo agent platform - product menu",{"text":1069,"config":1070},"Source Code Management",{"href":1071,"dataGaLocation":996,"dataGaName":1069},"/solutions/source-code-management/",{"text":1073,"config":1074},"Automated Software Delivery",{"href":1059,"dataGaLocation":996,"dataGaName":1075},"Automated software delivery",{"title":1077,"description":1078,"link":1079,"items":1084},"Security","Deliver code faster without compromising security",{"config":1080},{"href":1081,"dataGaName":1082,"dataGaLocation":996,"icon":1083},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1085,1089,1094],{"text":1086,"config":1087},"Application Security Testing",{"href":1081,"dataGaName":1088,"dataGaLocation":996},"Application security testing",{"text":1090,"config":1091},"Software Supply Chain Security",{"href":1092,"dataGaLocation":996,"dataGaName":1093},"/solutions/supply-chain/","Software supply chain security",{"text":1095,"config":1096},"Software Compliance",{"href":1097,"dataGaName":1098,"dataGaLocation":996},"/solutions/software-compliance/","software compliance",{"title":1100,"link":1101,"items":1106},"Measurement",{"config":1102},{"icon":1103,"href":1104,"dataGaName":1105,"dataGaLocation":996},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1107,1111,1115],{"text":1108,"config":1109},"Visibility & Measurement",{"href":1104,"dataGaLocation":996,"dataGaName":1110},"Visibility and Measurement",{"text":1112,"config":1113},"Value Stream Management",{"href":1114,"dataGaLocation":996,"dataGaName":1112},"/solutions/value-stream-management/",{"text":1116,"config":1117},"Analytics & Insights",{"href":1118,"dataGaLocation":996,"dataGaName":1119},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1121,"type":1047,"items":1122},"GitLab for",[1123,1129,1135],{"text":1124,"config":1125},"Enterprise",{"icon":1126,"href":1127,"dataGaLocation":996,"dataGaName":1128},"Building","/enterprise/","enterprise",{"text":1130,"config":1131},"Small Business",{"icon":1132,"href":1133,"dataGaLocation":996,"dataGaName":1134},"Work","/small-business/","small business",{"text":1136,"config":1137},"Public Sector",{"icon":1138,"href":1139,"dataGaLocation":996,"dataGaName":1140},"Organization","/solutions/public-sector/","public sector",{"text":1142,"config":1143},"Pricing",{"href":1144,"dataGaName":1145,"dataGaLocation":996,"dataNavLevelOne":1145},"/pricing/","pricing",{"text":1147,"config":1148,"menu":1150},"Resources",{"dataNavLevelOne":1149},"resources",{"type":1047,"link":1151,"columns":1155,"feature":1248},{"text":1152,"config":1153},"View all resources",{"href":1154,"dataGaName":1149,"dataGaLocation":996},"/resources/",[1156,1188,1215],{"title":1157,"items":1158},"Getting started",[1159,1164,1169,1173,1178,1183],{"text":1160,"config":1161},"Install",{"href":1162,"dataGaName":1163,"dataGaLocation":996},"/install/","install",{"text":1165,"config":1166},"Quick start guides",{"href":1167,"dataGaName":1168,"dataGaLocation":996},"/get-started/","quick setup checklists",{"text":1170,"config":1171},"Learn",{"href":902,"dataGaLocation":996,"dataGaName":1172},"learn",{"text":1174,"config":1175},"Product documentation",{"href":1176,"dataGaName":1177,"dataGaLocation":996},"https://docs.gitlab.com/","product documentation",{"text":1179,"config":1180},"Best practice videos",{"href":1181,"dataGaName":1182,"dataGaLocation":996},"/getting-started-videos/","best practice videos",{"text":1184,"config":1185},"Integrations",{"href":1186,"dataGaName":1187,"dataGaLocation":996},"/integrations/","integrations",{"title":1189,"items":1190},"Discover",[1191,1196,1201,1206,1210],{"text":1192,"config":1193},"Customer success stories",{"href":1194,"dataGaName":1195,"dataGaLocation":996},"/customers/","customer success stories",{"text":1197,"config":1198},"Blog",{"href":1199,"dataGaName":1200,"dataGaLocation":996},"/blog/","blog",{"text":1202,"config":1203},"Demo Hub",{"href":1204,"dataGaName":1205,"dataGaLocation":996},"/demo-hub/","demo hub",{"text":1207,"config":1208},"The Source",{"href":1209,"dataGaName":1200,"dataGaLocation":996},"/the-source/",{"text":1211,"config":1212},"Remote",{"href":1213,"dataGaName":1214,"dataGaLocation":996},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1216,"items":1217},"Connect",[1218,1223,1228,1233,1238,1243],{"text":1219,"config":1220},"GitLab Services",{"href":1221,"dataGaName":1222,"dataGaLocation":996},"/services/","services",{"text":1224,"config":1225},"Contribute",{"href":1226,"dataGaName":1227,"dataGaLocation":996},"https://contributors.gitlab.com","contribute",{"text":1229,"config":1230},"Community",{"href":1231,"dataGaName":1232,"dataGaLocation":996},"/community/","community",{"text":1234,"config":1235},"Forum",{"href":1236,"dataGaName":1237,"dataGaLocation":996},"https://forum.gitlab.com/","forum",{"text":1239,"config":1240},"Events",{"href":1241,"dataGaName":1242,"dataGaLocation":996},"/events/","events",{"text":1244,"config":1245},"Partners",{"href":1246,"dataGaName":1247,"dataGaLocation":996},"/partners/","partners",{"config":1249,"title":1252,"text":1253,"link":1254},{"background":1250,"textColor":1251},"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":1255,"config":1256},"Read the latest",{"href":1257,"dataGaName":1258,"dataGaLocation":996},"/whats-new/","whats new",{"text":1260,"config":1261,"menu":1263},"Company",{"dataNavLevelOne":1262},"company",{"type":1047,"columns":1264},[1265],{"items":1266},[1267,1272,1278,1280,1285,1290,1295,1300,1305,1310],{"text":1268,"config":1269},"About",{"href":1270,"dataGaName":1271,"dataGaLocation":996},"/company/","about",{"text":1273,"config":1274,"footerGa":1277},"Jobs",{"href":1275,"dataGaName":1276,"dataGaLocation":996},"/jobs/","jobs",{"dataGaName":1276},{"text":1239,"config":1279},{"href":1241,"dataGaName":1242,"dataGaLocation":996},{"text":1281,"config":1282},"Leadership",{"href":1283,"dataGaName":1284,"dataGaLocation":996},"/company/team/e-group/","leadership",{"text":1286,"config":1287},"Handbook",{"href":1288,"dataGaName":1289,"dataGaLocation":996},"https://handbook.gitlab.com/","handbook",{"text":1291,"config":1292},"Investor relations",{"href":1293,"dataGaName":1294,"dataGaLocation":996},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1296,"config":1297},"Trust Center",{"href":1298,"dataGaName":1299,"dataGaLocation":996},"/security/","trust center",{"text":1301,"config":1302},"AI Transparency Center",{"href":1303,"dataGaName":1304,"dataGaLocation":996},"/ai-transparency-center/","ai transparency center",{"text":1306,"config":1307},"Newsletter",{"href":1308,"dataGaName":1309,"dataGaLocation":996},"/company/contact/#contact-forms","newsletter",{"text":1311,"config":1312},"Press",{"href":1313,"dataGaName":1314,"dataGaLocation":996},"/press/","press",{"text":1316,"config":1317,"menu":1318},"Contact us",{"dataNavLevelOne":1262},{"type":1047,"columns":1319},[1320],{"items":1321},[1322,1327,1332],{"text":1323,"config":1324},"Talk to sales",{"href":1325,"dataGaName":1326,"dataGaLocation":996},"/sales/","talk to sales",{"text":1328,"config":1329},"Support portal",{"href":1330,"dataGaName":1331,"dataGaLocation":996},"https://support.gitlab.com/hc/en-us","support portal",{"text":1333,"config":1334},"Customer portal",{"href":1335,"dataGaName":1336,"dataGaLocation":996},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1338,"login":1339,"suggestions":1346},"Close",{"text":1340,"link":1341},"To search repositories and projects, login to",{"text":1342,"config":1343},"gitlab.com",{"href":1010,"dataGaName":1344,"dataGaLocation":1345},"search login","search",{"text":1347,"default":1348},"Suggestions",[1349,1351,1355,1357,1361,1365],{"text":1027,"config":1350},{"href":1032,"dataGaName":1027,"dataGaLocation":1345},{"text":1352,"config":1353},"Code Suggestions (AI)",{"href":1354,"dataGaName":1352,"dataGaLocation":1345},"/solutions/code-suggestions/",{"text":580,"config":1356},{"href":1064,"dataGaName":580,"dataGaLocation":1345},{"text":1358,"config":1359},"GitLab on AWS",{"href":1360,"dataGaName":1358,"dataGaLocation":1345},"/partners/technology-partners/aws/",{"text":1362,"config":1363},"GitLab on Google Cloud",{"href":1364,"dataGaName":1362,"dataGaLocation":1345},"/partners/technology-partners/google-cloud-platform/",{"text":1366,"config":1367},"Why GitLab?",{"href":1040,"dataGaName":1366,"dataGaLocation":1345},{"freeTrial":1369,"mobileIcon":1374,"desktopIcon":1379,"secondaryButton":1382},{"text":1370,"config":1371},"Start free trial",{"href":1372,"dataGaName":1001,"dataGaLocation":1373},"https://gitlab.com/-/trials/new/","nav",{"altText":1375,"config":1376},"Gitlab Icon",{"src":1377,"dataGaName":1378,"dataGaLocation":1373},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1375,"config":1380},{"src":1381,"dataGaName":1378,"dataGaLocation":1373},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1383,"config":1384},"Get Started",{"href":1385,"dataGaName":1386,"dataGaLocation":1373},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1388,"mobileIcon":1392,"desktopIcon":1394},{"text":1389,"config":1390},"Learn more about GitLab Duo",{"href":1032,"dataGaName":1391,"dataGaLocation":1373},"gitlab duo",{"altText":1375,"config":1393},{"src":1377,"dataGaName":1378,"dataGaLocation":1373},{"altText":1375,"config":1395},{"src":1381,"dataGaName":1378,"dataGaLocation":1373},{"button":1397,"mobileIcon":1402,"desktopIcon":1404},{"text":1398,"config":1399},"/switch",{"href":1400,"dataGaName":1401,"dataGaLocation":1373},"#contact","switch",{"altText":1375,"config":1403},{"src":1377,"dataGaName":1378,"dataGaLocation":1373},{"altText":1375,"config":1405},{"src":1406,"dataGaName":1378,"dataGaLocation":1373},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1408,"mobileIcon":1413,"desktopIcon":1415},{"text":1409,"config":1410},"Back to pricing",{"href":1144,"dataGaName":1411,"dataGaLocation":1373,"icon":1412},"back to pricing","GoBack",{"altText":1375,"config":1414},{"src":1377,"dataGaName":1378,"dataGaLocation":1373},{"altText":1375,"config":1416},{"src":1381,"dataGaName":1378,"dataGaLocation":1373},{"title":1418,"titleMobile":1419,"button":1420,"config":1425},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1038,"config":1421},{"href":1422,"dataGaName":1423,"dataGaLocation":1424},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1426,"disabled":975},"release",{"data":1428},{"text":1429,"source":1430,"edit":1436,"contribute":1441,"config":1446,"items":1451,"minimal":1660},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1431,"config":1432},"View page source",{"href":1433,"dataGaName":1434,"dataGaLocation":1435},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1437,"config":1438},"Edit this page",{"href":1439,"dataGaName":1440,"dataGaLocation":1435},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1442,"config":1443},"Please contribute",{"href":1444,"dataGaName":1445,"dataGaLocation":1435},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1447,"facebook":1448,"youtube":1449,"linkedin":1450},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1452,1499,1552,1596,1628],{"title":1142,"links":1453,"subMenu":1468},[1454,1458,1463],{"text":1455,"config":1456},"View plans",{"href":1144,"dataGaName":1457,"dataGaLocation":1435},"view plans",{"text":1459,"config":1460},"Why Premium?",{"href":1461,"dataGaName":1462,"dataGaLocation":1435},"/pricing/premium/","why premium",{"text":1464,"config":1465},"Why Ultimate?",{"href":1466,"dataGaName":1467,"dataGaLocation":1435},"/pricing/ultimate/","why ultimate",[1469],{"title":1470,"links":1471},"Contact Us",[1472,1475,1477,1479,1484,1489,1494],{"text":1473,"config":1474},"Contact sales",{"href":1325,"dataGaName":1006,"dataGaLocation":1435},{"text":1328,"config":1476},{"href":1330,"dataGaName":1331,"dataGaLocation":1435},{"text":1333,"config":1478},{"href":1335,"dataGaName":1336,"dataGaLocation":1435},{"text":1480,"config":1481},"Status",{"href":1482,"dataGaName":1483,"dataGaLocation":1435},"https://status.gitlab.com/","status",{"text":1485,"config":1486},"Terms of use",{"href":1487,"dataGaName":1488,"dataGaLocation":1435},"/terms/","terms of use",{"text":1490,"config":1491},"Privacy statement",{"href":1492,"dataGaName":1493,"dataGaLocation":1435},"/privacy/","privacy statement",{"text":1495,"config":1496},"Cookie preferences",{"dataGaName":1497,"dataGaLocation":1435,"id":1498,"isOneTrustButton":297},"cookie preferences","ot-sdk-btn",{"title":1043,"links":1500,"subMenu":1508},[1501,1504],{"text":986,"config":1502},{"href":1025,"dataGaName":1503,"dataGaLocation":1435},"devsecops platform",{"text":1505,"config":1506},"AI-Assisted Development",{"href":1032,"dataGaName":1507,"dataGaLocation":1435},"ai-assisted development",[1509],{"title":1510,"links":1511},"Topics",[1512,1517,1522,1527,1532,1537,1542,1547],{"text":1513,"config":1514},"CICD",{"href":1515,"dataGaName":1516,"dataGaLocation":1435},"/topics/ci-cd/","cicd",{"text":1518,"config":1519},"GitOps",{"href":1520,"dataGaName":1521,"dataGaLocation":1435},"/topics/gitops/","gitops",{"text":1523,"config":1524},"DevOps",{"href":1525,"dataGaName":1526,"dataGaLocation":1435},"/topics/devops/","devops",{"text":1528,"config":1529},"Version Control",{"href":1530,"dataGaName":1531,"dataGaLocation":1435},"/topics/version-control/","version control",{"text":1533,"config":1534},"DevSecOps",{"href":1535,"dataGaName":1536,"dataGaLocation":1435},"/topics/devsecops/","devsecops",{"text":1538,"config":1539},"Cloud Native",{"href":1540,"dataGaName":1541,"dataGaLocation":1435},"/topics/cloud-native/","cloud native",{"text":1543,"config":1544},"AI for Coding",{"href":1545,"dataGaName":1546,"dataGaLocation":1435},"/topics/devops/ai-for-coding/","ai for coding",{"text":1548,"config":1549},"Agentic AI",{"href":1550,"dataGaName":1551,"dataGaLocation":1435},"/topics/agentic-ai/","agentic ai",{"title":1553,"links":1554},"Solutions",[1555,1557,1559,1564,1568,1571,1575,1578,1580,1583,1586,1591],{"text":1086,"config":1556},{"href":1081,"dataGaName":1086,"dataGaLocation":1435},{"text":1075,"config":1558},{"href":1059,"dataGaName":1060,"dataGaLocation":1435},{"text":1560,"config":1561},"Agile development",{"href":1562,"dataGaName":1563,"dataGaLocation":1435},"/solutions/agile-delivery/","agile delivery",{"text":1565,"config":1566},"SCM",{"href":1071,"dataGaName":1567,"dataGaLocation":1435},"source code management",{"text":1513,"config":1569},{"href":1064,"dataGaName":1570,"dataGaLocation":1435},"continuous integration & delivery",{"text":1572,"config":1573},"Value stream management",{"href":1114,"dataGaName":1574,"dataGaLocation":1435},"value stream management",{"text":1518,"config":1576},{"href":1577,"dataGaName":1521,"dataGaLocation":1435},"/solutions/gitops/",{"text":1124,"config":1579},{"href":1127,"dataGaName":1128,"dataGaLocation":1435},{"text":1581,"config":1582},"Small business",{"href":1133,"dataGaName":1134,"dataGaLocation":1435},{"text":1584,"config":1585},"Public sector",{"href":1139,"dataGaName":1140,"dataGaLocation":1435},{"text":1587,"config":1588},"Education",{"href":1589,"dataGaName":1590,"dataGaLocation":1435},"/solutions/education/","education",{"text":1592,"config":1593},"Financial services",{"href":1594,"dataGaName":1595,"dataGaLocation":1435},"/solutions/finance/","financial services",{"title":1147,"links":1597},[1598,1600,1602,1604,1607,1609,1612,1614,1616,1618,1620,1622,1624,1626],{"text":1160,"config":1599},{"href":1162,"dataGaName":1163,"dataGaLocation":1435},{"text":1165,"config":1601},{"href":1167,"dataGaName":1168,"dataGaLocation":1435},{"text":1170,"config":1603},{"href":902,"dataGaName":1172,"dataGaLocation":1435},{"text":1174,"config":1605},{"href":1176,"dataGaName":1606,"dataGaLocation":1435},"docs",{"text":1197,"config":1608},{"href":1199,"dataGaName":1200,"dataGaLocation":1435},{"text":1610,"config":1611},"What's new",{"href":1257,"dataGaName":1258,"dataGaLocation":1435},{"text":1192,"config":1613},{"href":1194,"dataGaName":1195,"dataGaLocation":1435},{"text":1211,"config":1615},{"href":1213,"dataGaName":1214,"dataGaLocation":1435},{"text":1219,"config":1617},{"href":1221,"dataGaName":1222,"dataGaLocation":1435},{"text":1224,"config":1619},{"href":1226,"dataGaName":1227,"dataGaLocation":1435},{"text":1229,"config":1621},{"href":1231,"dataGaName":1232,"dataGaLocation":1435},{"text":1234,"config":1623},{"href":1236,"dataGaName":1237,"dataGaLocation":1435},{"text":1239,"config":1625},{"href":1241,"dataGaName":1242,"dataGaLocation":1435},{"text":1244,"config":1627},{"href":1246,"dataGaName":1247,"dataGaLocation":1435},{"title":1260,"links":1629},[1630,1632,1634,1636,1638,1640,1644,1649,1651,1653,1655],{"text":1268,"config":1631},{"href":1270,"dataGaName":1262,"dataGaLocation":1435},{"text":1273,"config":1633},{"href":1275,"dataGaName":1276,"dataGaLocation":1435},{"text":1281,"config":1635},{"href":1283,"dataGaName":1284,"dataGaLocation":1435},{"text":1286,"config":1637},{"href":1288,"dataGaName":1289,"dataGaLocation":1435},{"text":1291,"config":1639},{"href":1293,"dataGaName":1294,"dataGaLocation":1435},{"text":1641,"config":1642},"Sustainability",{"href":1643,"dataGaName":1641,"dataGaLocation":1435},"/sustainability/",{"text":1645,"config":1646},"Diversity, inclusion and belonging (DIB)",{"href":1647,"dataGaName":1648,"dataGaLocation":1435},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1296,"config":1650},{"href":1298,"dataGaName":1299,"dataGaLocation":1435},{"text":1306,"config":1652},{"href":1308,"dataGaName":1309,"dataGaLocation":1435},{"text":1311,"config":1654},{"href":1313,"dataGaName":1314,"dataGaLocation":1435},{"text":1656,"config":1657},"Modern Slavery Transparency Statement",{"href":1658,"dataGaName":1659,"dataGaLocation":1435},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1661},[1662,1665,1668],{"text":1663,"config":1664},"Terms",{"href":1487,"dataGaName":1488,"dataGaLocation":1435},{"text":1666,"config":1667},"Cookies",{"dataGaName":1497,"dataGaLocation":1435,"id":1498,"isOneTrustButton":297},{"text":1669,"config":1670},"Privacy",{"href":1492,"dataGaName":1493,"dataGaLocation":1435},[1672],{"id":1673,"title":1674,"body":974,"config":1675,"content":1677,"description":974,"extension":1680,"meta":1681,"navigation":297,"path":1682,"seo":1683,"stem":1684,"__hash__":1685},"blogAuthors/en-us/blog/authors/gitlab.yml","Gitlab",{"template":1676},"BlogAuthor",{"name":7,"config":1678},{"headshot":1679,"ctfId":7},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","yml",{},"/en-us/blog/authors/gitlab",{},"en-us/blog/authors/gitlab","XCBKIcPoCs6zi2oHG7o-bAp52Jhaw8_zGhIJ2jNrEjU",[1687,1693,1697],{"title":1688,"description":1689,"heroImage":1690,"category":970,"date":1691,"authors":974,"slug":974,"externalUrl":1692},"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":1694,"description":1689,"heroImage":1690,"category":970,"date":1695,"authors":974,"slug":974,"externalUrl":1696}," 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":1698,"description":1699,"heroImage":1700,"category":970,"date":1701,"authors":1702,"slug":1704,"externalUrl":974},"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",[1703],"Cesar Saavedra","how-to-use-a-work-item-created-trigger",{"promotions":1706},[1707,1721,1732,1744],{"id":1708,"categories":1709,"header":1711,"text":1712,"button":1713,"image":1718},"ai-modernization",[1710],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1714,"config":1715},"Get your AI maturity score",{"href":1716,"dataGaName":1717,"dataGaLocation":1200},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1719},{"src":1720},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1722,"categories":1723,"header":1724,"text":1712,"button":1725,"image":1729},"devops-modernization",[970,1536],"Are you just managing tools or shipping innovation?",{"text":1726,"config":1727},"Get your DevOps maturity score",{"href":1728,"dataGaName":1717,"dataGaLocation":1200},"/assessments/devops-modernization-assessment/",{"config":1730},{"src":1731},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1733,"categories":1734,"header":1736,"text":1712,"button":1737,"image":1741},"security-modernization",[1735],"security","Are you trading speed for security?",{"text":1738,"config":1739},"Get your security maturity score",{"href":1740,"dataGaName":1717,"dataGaLocation":1200},"/assessments/security-modernization-assessment/",{"config":1742},{"src":1743},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1745,"paths":1746,"header":1749,"text":1750,"button":1751,"image":1756},"github-azure-migration",[1747,1748],"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":1752,"config":1753},"See how GitLab compares to GitHub",{"href":1754,"dataGaName":1755,"dataGaLocation":1200},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1757},{"src":1731},{"header":1759,"blurb":1760,"button":1761,"secondaryButton":1766},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1762,"config":1763},"Get your free trial",{"href":1764,"dataGaName":1001,"dataGaLocation":1765},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1473,"config":1767},{"href":1325,"dataGaName":1006,"dataGaLocation":1765},1786803747127]