[{"data":1,"prerenderedAt":1587},["ShallowReactive",2],{"/de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab":3,"navigation-de-de":809,"banner-de-de":1240,"footer-de-de":1247,"blog-post-authors-de-de-Ben Ridley":1486,"blog-related-posts-de-de-tutorial-automated-release-and-release-notes-with-gitlab":1501,"blog-promotions-de-de":1524,"next-steps-de-de":1577},{"id":4,"title":5,"authors":6,"body":8,"category":785,"date":786,"description":787,"extension":606,"externalUrl":788,"faq":788,"featured":789,"heroImage":790,"meta":791,"navigation":328,"path":792,"seo":793,"slug":797,"stem":798,"tags":799,"template":806,"updatedDate":807,"__hash__":808},"blogPosts/de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab.md","GitLab-Tutorial: Releases & Versionshinweise automatisieren",[7],"Ben Ridley",{"type":9,"value":10,"toc":776},"minimark",[11,28,31,34,37,42,45,48,59,62,66,90,97,100,104,107,114,118,121,132,138,141,148,154,165,177,181,199,206,516,533,588,592,599,602,700,703,710,714,721,728,740,754,760,772],[12,13,14],"p",{},[15,16,17,21,22],"em",{},[18,19,20],"strong",{},"Update 2025"," - Die Änderungsprotokoll-API wurde weiterentwickelt und enthält jetzt geniale neue Funktionen, auf die wir in diesem Blog nicht eingehen, wie die Möglichkeit, benutzerdefinierte Änderungsprotokolle mit Vorlagenwerten aus deinem Commit-Verlauf bereitzustellen. ",[23,24,27],"a",{"href":25,"rel":26},"https://docs.gitlab.com/user/project/changelogs/",[],"Mehr dazu erfährst du in der offiziellen Dokumentation zu Änderungsprotokollen (nur in englischer Sprache verfügbar).",[12,29,30],{},"Wenn du Software entwickelst, auf die sich Benutzer(innen) verlassen, ist eine effektive Kommunikation über Änderungen bei jeder Release unerlässlich. Indem du Benutzer(innen) über neue Funktionen sowie darüber informierst, was geändert oder entfernt wurde, stellst du sicher, dass sie die Vorteile der Software wirklich nutzen können und sie bei Upgrades keine unangenehmen Überraschungen erwarten.",[12,32,33],{},"In der Vergangenheit war das Erstellen von Versionshinweisen und die Pflege eines Änderungsprotokolls eine mühsame Aufgabe, bei der Entwickler(innen) die Änderungen extern überwachen oder eigene Release Manager den Verlauf der Zusammenführungen durcharbeiten mussten. Mit der Änderungsprotokoll-API von GitLab kannst du den umfassenden Verlauf, der in unserem Git-Repository gespeichert ist, heranziehen, um ganz einfach Versionshinweise zu erstellen und ein Änderungsprotokoll zu führen.",[12,35,36],{},"In diesem Tutorial sehen wir uns an, wie du Releases mit GitLab automatisieren kannst und finden heraus, wie man Release-Artefakte, Versionshinweise und ein umfassendes Änderungsprotokoll, das alle benutzerbezogenen Software-Änderungen enthält, erstellt.",[38,39,41],"h2",{"id":40},"releases-in-gitlab","Releases in GitLab",[12,43,44],{},"Zuerst wollen wir uns ansehen, wie Releases in GitLab funktionieren.",[12,46,47],{},"In GitLab ist eine Release eine bestimmte Version deines Codes, die durch ein Git-Tag identifiziert wird. Dieses enthält Details zu den Änderungen seit der letzten Release (und Versionshinweise) sowie zugehörige Artefakte, die aus dieser Version des Codes erstellt wurden, wie Docker-Images, Installationspakete und Dokumentation.",[12,49,50,51,55,56,58],{},"Du kannst Releases in GitLab über die UI erstellen und nachverfolgen, indem du unsere Release-API aufrufst oder den Job ",[52,53,54],"code",{},"release"," innerhalb einer CI-Pipeline aufrufst. In diesem Tutorial verwenden wir den Job ",[52,57,54],{}," in einer CI/CD-Pipeline, sodass wir die Automatisierung, die wir in unserer Pipeline zum Testen, für Code-Scans und mehr verwenden, auch für automatisierte Releases nutzen können.",[12,60,61],{},"Um unsere Releases zu automatisieren, müssen wir zunächst die folgende Frage beantworten: Wo bekommen wir für unsere Versionshinweise und unser Änderungsprotokoll Informationen zu den vorgenommenen Änderungen? Die Antwort: In unserem Git-Repository, in dem wir durch Commit-Nachrichten und den Merge-Commit-Verlauf eine umfassende Übersicht über die Entwicklungsaktivitäten haben. Sehen wir uns an, ob wir diesen umfassenden Verlauf nutzen können, um automatisch unsere Versionshinweise und Änderungsprotokolle zu erstellen.",[38,63,65],{"id":64},"einführung-in-commit-trailer","Einführung in Commit-Trailer",[12,67,68,73,74,77,78,81,82,85,86,89],{},[23,69,72],{"href":70,"rel":71},"https://git-scm.com/docs/git-interpret-trailers",[],"Commit-Trailer"," sind strukturierte Einträge in deinen Git-Commits, die erstellt werden, indem du einfach die Formatierungsnachrichten ",[52,75,76],{},"\u003CHEADER>:\u003CBODY>"," am Ende deines Commits einfügst. Das CLI-Tool ",[52,79,80],{},"git"," kann diese dann parsen und für die Verwendung in anderen Systemen extrahieren. Ein Beispiel, das du vielleicht schon einmal verwendet hast, ist ",[52,83,84],{},"git commit --sign-off",", um ein Commit zu beenden. Dies wird implementiert, indem der Trailer ",[52,87,88],{},"Signed-off-by: \u003CDein Name>"," zum Commit hinzugefügt wird. Wir können hier beliebige strukturierte Daten hinzufügen, sodass dies eine tolle Möglichkeit ist, Informationen zu speichern, die für das Änderungsprotokoll nützlich sein könnten.",[12,91,92,93,96],{},"Wenn wir in unseren Commits den Trailer ",[52,94,95],{},"Changelog: \u003Cadded/changed/removed>"," verwenden, parst die Änderungsprotokoll-API von GitLab diese und verwendet sie, um automatisch ein Änderungsprotokoll für uns zu erstellen!",[12,98,99],{},"Sehen wir uns das in Aktion an, indem wir Änderungen an einer echten Codebase vornehmen, eine Release durchführen und dann Versionshinweise und Änderungsprotokoll-Einträge generieren.",[38,101,103],{"id":102},"beispielprojekt","Beispielprojekt",[12,105,106],{},"Für diesen Blog verwende ich ein einfaches Python-Web-App-Repository. Nehmen wir an, dass Version 1.0.0 der Anwendung gerade veröffentlicht wurde und die aktuelle Version des Codes ist. Ich habe auch die Release 1.0.0 in GitLab erstellt, was ich manuell tun musste, da wir unsere automatisierte Release-Pipeline ja noch nicht erstellt haben:",[12,108,109],{},[110,111],"img",{"alt":112,"src":113},"Ein Screenshot der GitLab-UI, die eine Release für Version 1.0.0 zeigt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397825/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/1-0-release.png",[38,115,117],{"id":116},"nehmen-wir-unsere-änderungen-vor","Nehmen wir unsere Änderungen vor",[12,119,120],{},"Wir entwickeln rasend schnell und arbeiten daher schon daran, Version 2.0.0 unserer Anwendung heute zu veröffentlichen. Im Rahmen unserer Release 2.0.0 fügen wir eine neue Funktion zu unserer App hinzu: einen Chatbot! Wir werden auch die Quanten-Blockchain-Funktion entfernen, da wir diese nur für die erste Finanzierungsrunde benötigt haben. Außerdem fügen wir einen automatisierten Release-Job zu unserer CI/CD-Pipeline für unsere Release 2.0.0 hinzu.",[12,122,123,124,127,128,131],{},"Zuerst entfernen wir die nicht benötigten Funktionen. Ich habe einen Merge Request erstellt, der die notwendigen Änderungen enthält. Wir müssen sicherstellen, dass wir eine Commit-Nachricht haben, die den Trailer ",[52,125,126],{},"Changelog: removed"," enthält. Dazu gibt es mehrere Möglichkeiten: Wir können ihn unter anderem direkt in einen Commit einbauen oder einen interaktiven Rebase durchführen und über das CLI hinzufügen. Der einfachste Weg in unserem Fall ist meiner Meinung nach, bis zum Ende zu warten und dann die Schaltfläche ",[52,129,130],{},"Edit commit message"," in GitLab zu verwenden, um den Trailer folgendermaßen zum Merge-Commit hinzuzufügen:",[12,133,134],{},[110,135],{"alt":136,"src":137},"Screenshot der GitLab-UI, der einen Merge Request zum Entfernen nicht verwendeter Funktionen zeigt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/remove-unused-features-mr.png",[12,139,140],{},"Mit dieser Methode kannst du auch den Titel des Merge-Commits auf einen prägnanteren Titel ändern. Ich habe den Titel meines Merge-Commit auf „Nicht verwendete Funktionen entfernen“ geändert, da dies im Eintrag im Änderungsprotokoll angezeigt wird.",[12,142,143,144,147],{},"Als nächstes fügen wir einige neue Funktionen für die Version 2.0.0 hinzu. Hier müssen wir nur einen weiteren Merge Request öffnen, der unsere neuen Funktionen enthält, und dann den Merge-Commit bearbeiten, sodass er den Trailer ",[52,145,146],{},"Changelog: added"," enthält, und dann den Commit-Titel auf einen prägnanteren Titel ändern:",[12,149,150],{},[110,151],{"alt":152,"src":153},"Screenshot der GitLab-UI, der einen Merge Request zum Hinzufügen neuer Funktionen zeigt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/add-chatbot-mr.png",[12,155,156,157,160,161,164],{},"Jetzt sind wir eigentlich bereit, 2.0.0 zu veröffentlichen. Aber dieses Mal möchten wir unsere Release nicht manuell erstellen. Deshalb fügen wir vor der Release einige Jobs zur Datei ",[52,158,159],{},".gitlab-ci.yml"," hinzu, die die Release automatisch für uns durchführen und die entsprechenden Versionshinweise und Einträge ins Änderungsprotokoll erstellen, wenn wir unseren Code mit einer neuen Version wie z. B. ",[52,162,163],{},"2.0.0"," taggen.",[12,166,167,170,171,176],{},[18,168,169],{},"Hinweis:"," Wenn du Änderungsprotokoll-Trailer erzwingen möchtest, solltest du überlegen, etwas wie ",[23,172,175],{"href":173,"rel":174},"https://docs.gitlab.com/development/dangerbot/",[],"Gefahr bei der Durchführung automatischer Überprüfungen für MR-Konventionen (nur in englischer Sprache verfügbar)"," zu verwenden.",[38,178,180],{"id":179},"erstellen-einer-automatisierten-release-pipeline","Erstellen einer automatisierten Release-Pipeline",[12,182,183,184,189,190,194,195,198],{},"Damit unsere Pipeline funktioniert, müssen wir ein Projektzugriffstoken erstellen, mit dem wir die GitLab-API aufrufen können, damit sie die Einträge im Änderungsprotokoll erstellt. ",[23,185,188],{"href":186,"rel":187},"https://docs.gitlab.com/user/project/settings/project_access_tokens/#create-a-project-access-token",[],"Erstelle ein Projektzugriffstoken im API-Bereich (nur in englischer Sprache verfügbar)"," und [speichere das Token dann als CI/CD-Variable (nur in englischer Sprache verfügbar)]((",[23,191,192],{"href":192,"rel":193},"https://docs.gitlab.com/ci/variables/#define-a-cicd-variable-in-the-ui",[],") mit dem Namen ",[52,196,197],{},"CI_API_TOKEN",". Wir verweisen auf diese Variable, um uns bei der API zu authentifizieren.",[12,200,201,202,205],{},"Nun fügen wir zwei neue Jobs zu unserer Datei ",[52,203,204],{},"gitlab-ci.yml"," hinzu:",[207,208,213],"pre",{"className":209,"code":210,"language":211,"meta":212,"style":212},"language-yaml shiki shiki-themes github-light","prepare_job:\n  stage: prepare\n  image: alpine:latest\n  rules:\n  - if: '$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n  script:\n    - apk add curl jq\n    - 'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\" | jq -r .notes > release_notes.md'\n  artifacts:\n    paths:\n    - release_notes.md\n\nrelease_job:\n  stage: release\n  image: registry.gitlab.com/gitlab-org/release-cli:latest\n  needs:\n    - job: prepare_job\n      artifacts: true\n  rules:\n  - if: '$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n  script:\n    - echo \"Creating release\"\n  release:\n    name: 'Release $CI_COMMIT_TAG'\n    description: release_notes.md\n    tag_name: '$CI_COMMIT_TAG'\n    ref: '$CI_COMMIT_SHA'\n    assets:\n      links:\n        - name: 'Container Image $CI_COMMIT_TAG'\n          url: \"https://$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA\"\n","yaml","",[52,214,215,228,241,252,260,274,282,291,299,307,315,323,330,338,348,358,366,379,391,398,409,416,424,432,443,453,464,475,483,491,505],{"__ignoreMap":212},[216,217,220,224],"span",{"class":218,"line":219},"line",1,[216,221,223],{"class":222},"shJU0","prepare_job",[216,225,227],{"class":226},"sgsFI",":\n",[216,229,231,234,237],{"class":218,"line":230},2,[216,232,233],{"class":222},"  stage",[216,235,236],{"class":226},": ",[216,238,240],{"class":239},"sYBdl","prepare\n",[216,242,244,247,249],{"class":218,"line":243},3,[216,245,246],{"class":222},"  image",[216,248,236],{"class":226},[216,250,251],{"class":239},"alpine:latest\n",[216,253,255,258],{"class":218,"line":254},4,[216,256,257],{"class":222},"  rules",[216,259,227],{"class":226},[216,261,263,266,269,271],{"class":218,"line":262},5,[216,264,265],{"class":226},"  - ",[216,267,268],{"class":222},"if",[216,270,236],{"class":226},[216,272,273],{"class":239},"'$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n",[216,275,277,280],{"class":218,"line":276},6,[216,278,279],{"class":222},"  script",[216,281,227],{"class":226},[216,283,285,288],{"class":218,"line":284},7,[216,286,287],{"class":226},"    - ",[216,289,290],{"class":239},"apk add curl jq\n",[216,292,294,296],{"class":218,"line":293},8,[216,295,287],{"class":226},[216,297,298],{"class":239},"'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\" | jq -r .notes > release_notes.md'\n",[216,300,302,305],{"class":218,"line":301},9,[216,303,304],{"class":222},"  artifacts",[216,306,227],{"class":226},[216,308,310,313],{"class":218,"line":309},10,[216,311,312],{"class":222},"    paths",[216,314,227],{"class":226},[216,316,318,320],{"class":218,"line":317},11,[216,319,287],{"class":226},[216,321,322],{"class":239},"release_notes.md\n",[216,324,326],{"class":218,"line":325},12,[216,327,329],{"emptyLinePlaceholder":328},true,"\n",[216,331,333,336],{"class":218,"line":332},13,[216,334,335],{"class":222},"release_job",[216,337,227],{"class":226},[216,339,341,343,345],{"class":218,"line":340},14,[216,342,233],{"class":222},[216,344,236],{"class":226},[216,346,347],{"class":239},"release\n",[216,349,351,353,355],{"class":218,"line":350},15,[216,352,246],{"class":222},[216,354,236],{"class":226},[216,356,357],{"class":239},"registry.gitlab.com/gitlab-org/release-cli:latest\n",[216,359,361,364],{"class":218,"line":360},16,[216,362,363],{"class":222},"  needs",[216,365,227],{"class":226},[216,367,369,371,374,376],{"class":218,"line":368},17,[216,370,287],{"class":226},[216,372,373],{"class":222},"job",[216,375,236],{"class":226},[216,377,378],{"class":239},"prepare_job\n",[216,380,382,385,387],{"class":218,"line":381},18,[216,383,384],{"class":222},"      artifacts",[216,386,236],{"class":226},[216,388,390],{"class":389},"sYu0t","true\n",[216,392,394,396],{"class":218,"line":393},19,[216,395,257],{"class":222},[216,397,227],{"class":226},[216,399,401,403,405,407],{"class":218,"line":400},20,[216,402,265],{"class":226},[216,404,268],{"class":222},[216,406,236],{"class":226},[216,408,273],{"class":239},[216,410,412,414],{"class":218,"line":411},21,[216,413,279],{"class":222},[216,415,227],{"class":226},[216,417,419,421],{"class":218,"line":418},22,[216,420,287],{"class":226},[216,422,423],{"class":239},"echo \"Creating release\"\n",[216,425,427,430],{"class":218,"line":426},23,[216,428,429],{"class":222},"  release",[216,431,227],{"class":226},[216,433,435,438,440],{"class":218,"line":434},24,[216,436,437],{"class":222},"    name",[216,439,236],{"class":226},[216,441,442],{"class":239},"'Release $CI_COMMIT_TAG'\n",[216,444,446,449,451],{"class":218,"line":445},25,[216,447,448],{"class":222},"    description",[216,450,236],{"class":226},[216,452,322],{"class":239},[216,454,456,459,461],{"class":218,"line":455},26,[216,457,458],{"class":222},"    tag_name",[216,460,236],{"class":226},[216,462,463],{"class":239},"'$CI_COMMIT_TAG'\n",[216,465,467,470,472],{"class":218,"line":466},27,[216,468,469],{"class":222},"    ref",[216,471,236],{"class":226},[216,473,474],{"class":239},"'$CI_COMMIT_SHA'\n",[216,476,478,481],{"class":218,"line":477},28,[216,479,480],{"class":222},"    assets",[216,482,227],{"class":226},[216,484,486,489],{"class":218,"line":485},29,[216,487,488],{"class":222},"      links",[216,490,227],{"class":226},[216,492,494,497,500,502],{"class":218,"line":493},30,[216,495,496],{"class":226},"        - ",[216,498,499],{"class":222},"name",[216,501,236],{"class":226},[216,503,504],{"class":239},"'Container Image $CI_COMMIT_TAG'\n",[216,506,508,511,513],{"class":218,"line":507},31,[216,509,510],{"class":222},"          url",[216,512,236],{"class":226},[216,514,515],{"class":239},"\"https://$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA\"\n",[12,517,518,519,521,522,525,526,529,530,532],{},"In der oben angeführten Konfiguration verwendet ",[52,520,223],{}," die Befehle ",[52,523,524],{},"curl"," und ",[52,527,528],{},"jq",", um den Endpunkt der Änderungsprotokoll-API von GitLab aufzurufen und übergibt dies dann an unser ",[52,531,335],{},", um die Release zu erstellen. Genauer gesagt sieht das so aus:",[534,535,536,540,559,569,575,585],"ul",{},[537,538,539],"li",{},"Wir verwenden das Projektzugriffstoken, dass wir zuvor erstellt haben, um die Änderungsprotokoll-API von GitLab aufzurufen, die dann die Versionshinweise erstellt. Wir speichern dies als Artefakt.",[537,541,542,543,546,547,549,550,553,554],{},"Wir verwenden die Variable ",[52,544,545],{},"$CI_COMMIT_TAG"," als Version. Dazu müssen wir eine semantische Versionierung für unsere Tags verwenden (beispielsweise so etwas wie ",[52,548,163],{},"). Du wirst auch bemerkt haben, dass ich den Release-Job mit dem Abschnitt ",[52,551,552],{},"rules"," eingeschränkt habe, der auf ein semantisches Versions-Tag überprüft.\n",[534,555,556],{},[537,557,558],{},"Damit die Änderungsprotokoll-API von GitLab funktioniert, ist eine semantische Versionierung erforderlich. Sie verwendet dieses Format, um die neueste Release zu finden und sie mit unserer aktuellen Release zu vergleichen.",[537,560,561,562,565,566,568],{},"Wir verwenden das offizielle Image ",[52,563,564],{},"release-cli"," von GitLab. „release-cli“ ist erforderlich, um das Schlüsselwort ",[52,567,54],{}," in einem Job zu verwenden.",[537,570,571,572,574],{},"Wir verwenden das Schlüsselwort ",[52,573,54],{},", um eine Release in GitLab zu erstellen. Dies ist ein spezielles Job-Schlüsselwort, das für die Erstellung einer Release und das Ausfüllen der erforderlichen Felder reserviert ist.",[537,576,577,578,581,582,584],{},"Wir können eine Datei als Argument an die ",[52,579,580],{},"description"," der Release übergeben. In unserem Fall ist es die Datei, die wir in ",[52,583,223],{}," erstellt haben und die als Artefakt an diesen Job übergeben wurde.",[537,586,587],{},"Wir haben auch unser Container-Image, das früher in der Pipeline erstellt wurde, als Release-Asset hinzugefügt. Du kannst alle Assets aus deinem Build-Prozess anhängen, die du möchtest, z. B. Binärdateien oder Dokumentationen, indem du eine URL zu dem Ort angibst, an den du sie zuvor in der Pipeline hochgeladen hast.",[38,589,591],{"id":590},"durchführen-einer-automatisierten-release","Durchführen einer automatisierten Release",[12,593,594,595],{},"Mit dieser Konfiguration müssen wir nur ein Tag in unser Repository übertragen, das unserem Versionsschema entspricht, um eine Release durchzuführen. Du kannst einfach ein Tag mit dem CLI pushen. Für dieses Beispiel wird die GitLab-UI verwendet, um ein Tag im main-Branch zu erstellen. Erstelle ein Tag, indem du in der Seitenleiste „Code“ -> „Tags“ -> „Neues Tag“ auswählst:\n",[110,596],{"alt":597,"src":598},"Screenshot der GitLab-UI, der zeigt, wie man ein Tag erstellt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397835/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/create-2-tag.png",[12,600,601],{},"Nach der Erstellung werden unsere Pipelines ausgeführt. Die Änderungsprotokoll-API von GitLab generiert automatisch Versionshinweise für uns als Markdown, der alle Änderungen zwischen dieser Release und der vorherigen Release enthält. Hier ist der Markdown, der in unserem Beispiel generiert wurde:",[207,603,607],{"className":604,"code":605,"language":606,"meta":212,"style":212},"language-md shiki shiki-themes github-light","## 2.0.0 (2023-08-25)\n\n### added (1 change)\n\n- [Add ChatBot](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@0c3601a45af617c5481322bfce4d71db1f911b02) ([merge request](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!4))\n\n### removed (1 change)\n\n- [Remove Unused Features](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@463d453c5ae0f4fc611ea969e5442e3298bf0d8a) ([merge request](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!3))\n","md",[52,608,609,615,619,624,628,662,666,671,675],{"__ignoreMap":212},[216,610,611],{"class":218,"line":219},[216,612,614],{"class":613},"surfw","## 2.0.0 (2023-08-25)\n",[216,616,617],{"class":218,"line":230},[216,618,329],{"emptyLinePlaceholder":328},[216,620,621],{"class":218,"line":243},[216,622,623],{"class":613},"### added (1 change)\n",[216,625,626],{"class":218,"line":254},[216,627,329],{"emptyLinePlaceholder":328},[216,629,630,634,637,641,644,648,651,654,656,659],{"class":218,"line":262},[216,631,633],{"class":632},"sqxcx","-",[216,635,636],{"class":226}," [",[216,638,640],{"class":639},"sEuWB","Add ChatBot",[216,642,643],{"class":226},"](",[216,645,647],{"class":646},"se9n6","gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@0c3601a45af617c5481322bfce4d71db1f911b02",[216,649,650],{"class":226},") ([",[216,652,653],{"class":639},"merge request",[216,655,643],{"class":226},[216,657,658],{"class":646},"gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!4",[216,660,661],{"class":226},"))\n",[216,663,664],{"class":218,"line":276},[216,665,329],{"emptyLinePlaceholder":328},[216,667,668],{"class":218,"line":284},[216,669,670],{"class":613},"### removed (1 change)\n",[216,672,673],{"class":218,"line":293},[216,674,329],{"emptyLinePlaceholder":328},[216,676,677,679,681,684,686,689,691,693,695,698],{"class":218,"line":301},[216,678,633],{"class":632},[216,680,636],{"class":226},[216,682,683],{"class":639},"Remove Unused Features",[216,685,643],{"class":226},[216,687,688],{"class":646},"gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@463d453c5ae0f4fc611ea969e5442e3298bf0d8a",[216,690,650],{"class":226},[216,692,653],{"class":639},[216,694,643],{"class":226},[216,696,697],{"class":646},"gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!3",[216,699,661],{"class":226},[12,701,702],{},"Wie du sehen kannst, hat GitLab die Einträge für unsere Versionshinweise automatisch mit unseren Git-Commit-Trailern extrahiert. Außerdem werden hilfreiche Links zum Merge Request bereitgestellt, damit die Leser(innen) weitere Details und Diskussionen zu den Änderungen sehen können.",[12,704,705,706],{},"Und jetzt folgt unsere letzte Release:\n",[110,707],{"alt":708,"src":709},"GitLab-Release-UI, die ein Release für Version 2.0.0 zeigt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/2-0-release.png",[38,711,713],{"id":712},"erstellen-des-änderungsprotokolls","Erstellen des Änderungsprotokolls",[12,715,716,717,720],{},"Als nächstes möchten wir unser Änderungsprotokoll aktualisieren (das im Grunde ein gesammelter Verlauf aller deiner Versionshinweise ist). Du kannst dazu eine ",[52,718,719],{},"POST","-Anfrage an den Änderungsprotokoll-API-Endpunkt senden, den wir zuvor verwendet haben.",[12,722,723,724,727],{},"Du kannst dies auch als Teil deiner Release-Pipeline tun, wenn du möchtest. Dazu kannst du beispielswiese den folgenden Code in den Abschnitt ",[52,725,726],{},"script"," deines Vorbereitungsjobs einfügen:",[207,729,733],{"className":730,"code":731,"language":732,"meta":212,"style":212},"language-sh shiki shiki-themes github-light","'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" -X POST \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\"\n","sh",[52,734,735],{"__ignoreMap":212},[216,736,737],{"class":218,"line":219},[216,738,731],{"class":739},"s7eDp",[12,741,742,745,746,749,750],{},[18,743,744],{},"Beachte dabei, dass dies das Repository ändert."," Es wird ein Commit erstellt, um die neuesten Notizen zu einer Datei ",[52,747,748],{},"CHANGELOG.md"," hinzuzufügen:\n",[110,751],{"alt":752,"src":753},"Screenshot des Repositorys, der einen Commit zeigt, der die Änderungsprotokolldatei aktualisiert","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/changelog-api-commit.png",[12,755,756,757,759],{},"Und das war’s auch schon! Indem wir den umfassenden Verlauf, den uns ",[52,758,80],{}," bietet, mit praktischen Commit-Trailern nutzen, können wir die leistungsstarke API und die CI/CD-Pipelines von GitLab optimal einsetzen, um unsere Release-Prozesse zu automatisieren und Versionshinweise für uns zu erstellen.",[761,762,763],"blockquote",{},[12,764,765,766,771],{},"Wenn du das Projekt erkunden möchtest, das wir für diesen Artikel verwendet haben, ",[23,767,770],{"href":768,"rel":769},"https://gitlab.com/gitlab-learn-labs/sample-projects/release-automation-demo",[],"findest du es unter diesem Link",".",[773,774,775],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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 .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}html pre.shiki code .sEuWB, html code.shiki .sEuWB{--shiki-default:#032F62;--shiki-default-text-decoration:underline}html pre.shiki code .se9n6, html code.shiki .se9n6{--shiki-default:#24292E;--shiki-default-text-decoration:underline}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}",{"title":212,"searchDepth":230,"depth":230,"links":777},[778,779,780,781,782,783,784],{"id":40,"depth":230,"text":41},{"id":64,"depth":230,"text":65},{"id":102,"depth":230,"text":103},{"id":116,"depth":230,"text":117},{"id":179,"depth":230,"text":180},{"id":590,"depth":230,"text":591},{"id":712,"depth":230,"text":713},"product","2023-11-01","Mit GitLab kannst du Release-Artefakte, Versionshinweise und Änderungsprotokolle, die benutzerbezogenen Software-Änderungen enthalten, automatisieren.",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659978/Blog/Hero%20Images/automation.png",{},"/de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab",{"title":5,"description":787,"ogTitle":5,"ogDescription":787,"noIndex":789,"ogImage":790,"ogUrl":794,"ogSiteName":795,"ogType":796,"canonicalUrls":794},"https://about.gitlab.com/blog/tutorial-automated-release-and-release-notes-with-gitlab","https://about.gitlab.com","Artikel","tutorial-automated-release-and-release-notes-with-gitlab","de-de/blog/tutorial-automated-release-and-release-notes-with-gitlab",[800,801,802,803,804,805],"Tutorial","CI","CI/CD","DevOps","DevSecOps","Git","BlogPost","2025-06-05","-FQF_yHKRAiu-U4VjchEimg5weAKc6AQisloux6FKVg",{"logo":810,"freeTrial":815,"sales":820,"login":825,"items":830,"search":1158,"minimal":1192,"duo":1210,"switchNav":1219,"pricingDeployment":1230},{"config":811},{"href":812,"dataGaName":813,"dataGaLocation":814},"/de-de/","gitlab logo","header",{"text":816,"config":817},"Kostenlose Testversion anfordern",{"href":818,"dataGaName":819,"dataGaLocation":814},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":821,"config":822},"Demo anfordern",{"href":823,"dataGaName":824,"dataGaLocation":814},"/de-de/sales/?contact-topic=request-demo","sales",{"text":826,"config":827},"Anmelden",{"href":828,"dataGaName":829,"dataGaLocation":814},"https://gitlab.com/users/sign_in/","sign in",[831,860,961,966,1080,1136],{"text":832,"config":833,"menu":835},"Plattform",{"dataNavLevelOne":834},"platform",{"type":836,"columns":837},"cards",[838,844,852],{"title":832,"description":839,"link":840},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":841,"config":842},"Die Plattform erkunden",{"href":843,"dataGaName":834,"dataGaLocation":814},"/de-de/platform/",{"title":845,"description":846,"link":847},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":848,"config":849},"Lerne GitLab Duo kennen",{"href":850,"dataGaName":851,"dataGaLocation":814},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":853,"description":854,"link":855},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":856,"config":857},"Mehr erfahren",{"href":858,"dataGaName":859,"dataGaLocation":814},"/de-de/why-gitlab/","why gitlab",{"text":861,"left":328,"config":862,"menu":864},"Produkt",{"dataNavLevelOne":863},"solutions",{"type":865,"link":866,"columns":870,"feature":940},"lists",{"text":867,"config":868},"Alle Lösungen anzeigen",{"href":869,"dataGaName":863,"dataGaLocation":814},"/de-de/solutions/",[871,895,918],{"title":872,"description":873,"link":874,"items":879},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":875},{"icon":876,"href":877,"dataGaName":878,"dataGaLocation":814},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[880,883,886,891],{"text":802,"config":881},{"href":882,"dataGaLocation":814,"dataGaName":802},"/de-de/solutions/continuous-integration/",{"text":845,"config":884},{"href":850,"dataGaLocation":814,"dataGaName":885},"gitlab duo agent platform - product menu",{"text":887,"config":888},"Quellcodeverwaltung",{"href":889,"dataGaLocation":814,"dataGaName":890},"/de-de/solutions/source-code-management/","Source Code Management",{"text":892,"config":893},"Automatische Softwarebereitstellung",{"href":877,"dataGaLocation":814,"dataGaName":894},"Automated software delivery",{"title":896,"description":897,"link":898,"items":903},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":899},{"href":900,"dataGaName":901,"dataGaLocation":814,"icon":902},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[904,908,913],{"text":905,"config":906},"Anwendungssicherheitstests",{"href":900,"dataGaName":907,"dataGaLocation":814},"Application security testing",{"text":909,"config":910},"Schutz der Software-Lieferkette",{"href":911,"dataGaLocation":814,"dataGaName":912},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":914,"config":915},"Software-Compliance",{"href":916,"dataGaName":917,"dataGaLocation":814},"/de-de/solutions/software-compliance/","software compliance",{"title":919,"link":920,"items":925},"Messung",{"config":921},{"icon":922,"href":923,"dataGaName":924,"dataGaLocation":814},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[926,930,935],{"text":927,"config":928},"Sichtbarkeit und Messung",{"href":923,"dataGaLocation":814,"dataGaName":929},"Visibility and Measurement",{"text":931,"config":932},"Wertstrommanagement",{"href":933,"dataGaLocation":814,"dataGaName":934},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":936,"config":937},"Analysen und Einblicke",{"href":938,"dataGaLocation":814,"dataGaName":939},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":941,"type":865,"items":942},"GitLab für",[943,949,955],{"text":944,"config":945},"Enterprise",{"icon":946,"href":947,"dataGaLocation":814,"dataGaName":948},"Building","/de-de/enterprise/","enterprise",{"text":950,"config":951},"Kleinunternehmen",{"icon":952,"href":953,"dataGaLocation":814,"dataGaName":954},"Work","/de-de/small-business/","small business",{"text":956,"config":957},"Öffentlicher Sektor",{"icon":958,"href":959,"dataGaLocation":814,"dataGaName":960},"Organization","/de-de/solutions/public-sector/","public sector",{"text":962,"config":963},"Preise",{"href":964,"dataGaName":965,"dataGaLocation":814,"dataNavLevelOne":965},"/de-de/pricing/","pricing",{"text":967,"config":968,"menu":970},"Ressourcen",{"dataNavLevelOne":969},"resources",{"type":865,"link":971,"columns":975,"feature":1069},{"text":972,"config":973},"Alle Ressourcen anzeigen",{"href":974,"dataGaName":969,"dataGaLocation":814},"/de-de/resources/",[976,1009,1036],{"title":977,"items":978},"Erste Schritte",[979,984,989,994,999,1004],{"text":980,"config":981},"Installieren",{"href":982,"dataGaName":983,"dataGaLocation":814},"/de-de/install/","install",{"text":985,"config":986},"Kurzanleitungen",{"href":987,"dataGaName":988,"dataGaLocation":814},"/de-de/get-started/","quick setup checklists",{"text":990,"config":991},"Lernen",{"href":992,"dataGaLocation":814,"dataGaName":993},"https://university.gitlab.com/","learn",{"text":995,"config":996},"Produktdokumentation",{"href":997,"dataGaName":998,"dataGaLocation":814},"https://docs.gitlab.com/","product documentation",{"text":1000,"config":1001},"Best-Practice-Videos",{"href":1002,"dataGaName":1003,"dataGaLocation":814},"/de-de/getting-started-videos/","best practice videos",{"text":1005,"config":1006},"Integrationen",{"href":1007,"dataGaName":1008,"dataGaLocation":814},"/de-de/integrations/","integrations",{"title":1010,"items":1011},"Entdecken",[1012,1017,1022,1027,1031],{"text":1013,"config":1014},"Kundenerfolge",{"href":1015,"dataGaName":1016,"dataGaLocation":814},"/de-de/customers/","customer success stories",{"text":1018,"config":1019},"Blog",{"href":1020,"dataGaName":1021,"dataGaLocation":814},"/de-de/blog/","blog",{"text":1023,"config":1024},"Demo-Hub",{"href":1025,"dataGaName":1026,"dataGaLocation":814},"/de-de/demo-hub/","demo hub",{"text":1028,"config":1029},"The Source",{"href":1030,"dataGaName":1021,"dataGaLocation":814},"/de-de/the-source/",{"text":1032,"config":1033},"Remote",{"href":1034,"dataGaName":1035,"dataGaLocation":814},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1037,"items":1038},"Vernetzen",[1039,1044,1049,1054,1059,1064],{"text":1040,"config":1041},"GitLab-Services",{"href":1042,"dataGaName":1043,"dataGaLocation":814},"/de-de/services/","services",{"text":1045,"config":1046},"Beitragen",{"href":1047,"dataGaName":1048,"dataGaLocation":814},"https://contributors.gitlab.com","contribute",{"text":1050,"config":1051},"Community",{"href":1052,"dataGaName":1053,"dataGaLocation":814},"/community/","community",{"text":1055,"config":1056},"Forum",{"href":1057,"dataGaName":1058,"dataGaLocation":814},"https://forum.gitlab.com/","forum",{"text":1060,"config":1061},"Veranstaltungen",{"href":1062,"dataGaName":1063,"dataGaLocation":814},"/events/","events",{"text":1065,"config":1066},"Partner",{"href":1067,"dataGaName":1068,"dataGaLocation":814},"/de-de/partners/","partners",{"config":1070,"title":1073,"text":1074,"link":1075},{"background":1071,"textColor":1072},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":1076,"config":1077},"Aktuelle Nachrichten",{"href":1078,"dataGaName":1079,"dataGaLocation":814},"/de-de/whats-new/","whats new",{"text":1081,"config":1082,"menu":1084},"Unternehmen",{"dataNavLevelOne":1083},"company",{"type":865,"columns":1085},[1086],{"items":1087},[1088,1093,1099,1101,1106,1111,1116,1121,1126,1131],{"text":1089,"config":1090},"Über",{"href":1091,"dataGaName":1092,"dataGaLocation":814},"/de-de/company/","about",{"text":1094,"config":1095,"footerGa":1098},"Karriere",{"href":1096,"dataGaName":1097,"dataGaLocation":814},"/jobs/","jobs",{"dataGaName":1097},{"text":1060,"config":1100},{"href":1062,"dataGaName":1063,"dataGaLocation":814},{"text":1102,"config":1103},"Geschäftsführung",{"href":1104,"dataGaName":1105,"dataGaLocation":814},"/company/team/e-group/","leadership",{"text":1107,"config":1108},"Handbuch",{"href":1109,"dataGaName":1110,"dataGaLocation":814},"https://handbook.gitlab.com/","handbook",{"text":1112,"config":1113},"Investor Relations",{"href":1114,"dataGaName":1115,"dataGaLocation":814},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1117,"config":1118},"Trust Center",{"href":1119,"dataGaName":1120,"dataGaLocation":814},"/de-de/security/","trust center",{"text":1122,"config":1123},"AI Transparency Center",{"href":1124,"dataGaName":1125,"dataGaLocation":814},"/de-de/ai-transparency-center/","ai transparency center",{"text":1127,"config":1128},"Newsletter",{"href":1129,"dataGaName":1130,"dataGaLocation":814},"/company/contact/#contact-forms","newsletter",{"text":1132,"config":1133},"Presse",{"href":1134,"dataGaName":1135,"dataGaLocation":814},"/press/","press",{"text":1137,"config":1138,"menu":1139},"Kontakt",{"dataNavLevelOne":1083},{"type":865,"columns":1140},[1141],{"items":1142},[1143,1148,1153],{"text":1144,"config":1145},"Vertrieb kontaktieren",{"href":1146,"dataGaName":1147,"dataGaLocation":814},"/de-de/sales/","talk to sales",{"text":1149,"config":1150},"Support-Portal",{"href":1151,"dataGaName":1152,"dataGaLocation":814},"https://support.gitlab.com/hc/en-us","support portal",{"text":1154,"config":1155},"Kundenportal",{"href":1156,"dataGaName":1157,"dataGaLocation":814},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1159,"login":1160,"suggestions":1167},"Schließen",{"text":1161,"link":1162},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1163,"config":1164},"gitlab.com",{"href":828,"dataGaName":1165,"dataGaLocation":1166},"search login","search",{"text":1168,"default":1169},"Vorschläge",[1170,1172,1177,1179,1184,1189],{"text":845,"config":1171},{"href":850,"dataGaName":845,"dataGaLocation":1166},{"text":1173,"config":1174},"Codevorschläge (KI)",{"href":1175,"dataGaName":1176,"dataGaLocation":1166},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":802,"config":1178},{"href":882,"dataGaName":802,"dataGaLocation":1166},{"text":1180,"config":1181},"GitLab auf AWS",{"href":1182,"dataGaName":1183,"dataGaLocation":1166},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1185,"config":1186},"GitLab auf Google Cloud",{"href":1187,"dataGaName":1188,"dataGaLocation":1166},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":853,"config":1190},{"href":858,"dataGaName":1191,"dataGaLocation":1166},"Why GitLab?",{"freeTrial":1193,"mobileIcon":1198,"desktopIcon":1203,"secondaryButton":1206},{"text":1194,"config":1195},"Kostenlos testen",{"href":1196,"dataGaName":819,"dataGaLocation":1197},"https://gitlab.com/-/trials/new/","nav",{"altText":1199,"config":1200},"GitLab-Symbol",{"src":1201,"dataGaName":1202,"dataGaLocation":1197},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1199,"config":1204},{"src":1205,"dataGaName":1202,"dataGaLocation":1197},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":977,"config":1207},{"href":1208,"dataGaName":1209,"dataGaLocation":1197},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1211,"mobileIcon":1215,"desktopIcon":1217},{"text":1212,"config":1213},"Mehr über GitLab Duo erfahren",{"href":850,"dataGaName":1214,"dataGaLocation":1197},"gitlab duo",{"altText":1199,"config":1216},{"src":1201,"dataGaName":1202,"dataGaLocation":1197},{"altText":1199,"config":1218},{"src":1205,"dataGaName":1202,"dataGaLocation":1197},{"button":1220,"mobileIcon":1225,"desktopIcon":1227},{"text":1221,"config":1222},"/Option",{"href":1223,"dataGaName":1224,"dataGaLocation":1197},"#contact","switch",{"altText":1199,"config":1226},{"src":1201,"dataGaName":1202,"dataGaLocation":1197},{"altText":1199,"config":1228},{"src":1229,"dataGaName":1202,"dataGaLocation":1197},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1231,"mobileIcon":1236,"desktopIcon":1238},{"text":1232,"config":1233},"Zurück zur Preisübersicht",{"href":964,"dataGaName":1234,"dataGaLocation":1197,"icon":1235},"back to pricing","GoBack",{"altText":1199,"config":1237},{"src":1201,"dataGaName":1202,"dataGaLocation":1197},{"altText":1199,"config":1239},{"src":1205,"dataGaName":1202,"dataGaLocation":1197},{"title":1241,"button":1242,"config":1246},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":856,"config":1243},{"href":1244,"dataGaName":1245,"dataGaLocation":814},"/de-de/gitlab-orbit/","orbit",{"layout":54,"disabled":789},{"data":1248},{"text":1249,"source":1250,"edit":1256,"contribute":1261,"config":1266,"items":1271,"minimal":1475},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":1251,"config":1252},"Quelltext der Seite anzeigen",{"href":1253,"dataGaName":1254,"dataGaLocation":1255},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1257,"config":1258},"Diese Seite bearbeiten",{"href":1259,"dataGaName":1260,"dataGaLocation":1255},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1262,"config":1263},"Beteilige dich",{"href":1264,"dataGaName":1265,"dataGaLocation":1255},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1267,"facebook":1268,"youtube":1269,"linkedin":1270},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1272,1317,1368,1410,1442],{"title":962,"links":1273,"subMenu":1288},[1274,1278,1283],{"text":1275,"config":1276},"Tarife anzeigen",{"href":964,"dataGaName":1277,"dataGaLocation":1255},"view plans",{"text":1279,"config":1280},"Vorteile von Premium",{"href":1281,"dataGaName":1282,"dataGaLocation":1255},"/de-de/pricing/premium/","why premium",{"text":1284,"config":1285},"Vorteile von Ultimate",{"href":1286,"dataGaName":1287,"dataGaLocation":1255},"/de-de/pricing/ultimate/","why ultimate",[1289],{"title":1137,"links":1290},[1291,1293,1295,1297,1302,1307,1312],{"text":1144,"config":1292},{"href":1146,"dataGaName":824,"dataGaLocation":1255},{"text":1149,"config":1294},{"href":1151,"dataGaName":1152,"dataGaLocation":1255},{"text":1154,"config":1296},{"href":1156,"dataGaName":1157,"dataGaLocation":1255},{"text":1298,"config":1299},"Status",{"href":1300,"dataGaName":1301,"dataGaLocation":1255},"https://status.gitlab.com/","status",{"text":1303,"config":1304},"Nutzungsbedingungen",{"href":1305,"dataGaName":1306,"dataGaLocation":1255},"/terms/","terms of use",{"text":1308,"config":1309},"Datenschutzerklärung",{"href":1310,"dataGaName":1311,"dataGaLocation":1255},"/de-de/privacy/","privacy statement",{"text":1313,"config":1314},"Cookie-Einstellungen",{"dataGaName":1315,"dataGaLocation":1255,"id":1316,"isOneTrustButton":328},"cookie preferences","ot-sdk-btn",{"title":861,"links":1318,"subMenu":1327},[1319,1323],{"text":1320,"config":1321},"DevSecOps-Plattform",{"href":843,"dataGaName":1322,"dataGaLocation":1255},"devsecops platform",{"text":1324,"config":1325},"KI-unterstützte Entwicklung",{"href":850,"dataGaName":1326,"dataGaLocation":1255},"ai-assisted development",[1328],{"title":1329,"links":1330},"Themen",[1331,1335,1340,1344,1349,1353,1358,1363],{"text":802,"config":1332},{"href":1333,"dataGaName":1334,"dataGaLocation":1255},"/de-de/topics/ci-cd/","cicd",{"text":1336,"config":1337},"GitOps",{"href":1338,"dataGaName":1339,"dataGaLocation":1255},"/de-de/topics/gitops/","gitops",{"text":803,"config":1341},{"href":1342,"dataGaName":1343,"dataGaLocation":1255},"/de-de/topics/devops/","devops",{"text":1345,"config":1346},"Versionskontrolle",{"href":1347,"dataGaName":1348,"dataGaLocation":1255},"/de-de/topics/version-control/","version control",{"text":804,"config":1350},{"href":1351,"dataGaName":1352,"dataGaLocation":1255},"/de-de/topics/devsecops/","devsecops",{"text":1354,"config":1355},"Cloud-nativ",{"href":1356,"dataGaName":1357,"dataGaLocation":1255},"/de-de/topics/cloud-native/","cloud native",{"text":1359,"config":1360},"KI für das Programmieren",{"href":1361,"dataGaName":1362,"dataGaLocation":1255},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":1364,"config":1365},"Agentische KI",{"href":1366,"dataGaName":1367,"dataGaLocation":1255},"/de-de/topics/agentic-ai/","agentic ai",{"title":1369,"links":1370},"Lösungen",[1371,1374,1376,1381,1385,1388,1391,1394,1396,1398,1400,1405],{"text":905,"config":1372},{"href":900,"dataGaName":1373,"dataGaLocation":1255},"Application Security Testing",{"text":892,"config":1375},{"href":877,"dataGaName":878,"dataGaLocation":1255},{"text":1377,"config":1378},"Agile Entwicklung",{"href":1379,"dataGaName":1380,"dataGaLocation":1255},"/de-de/solutions/agile-delivery/","agile delivery",{"text":1382,"config":1383},"SCM",{"href":889,"dataGaName":1384,"dataGaLocation":1255},"source code management",{"text":802,"config":1386},{"href":882,"dataGaName":1387,"dataGaLocation":1255},"continuous integration & delivery",{"text":931,"config":1389},{"href":933,"dataGaName":1390,"dataGaLocation":1255},"value stream management",{"text":1336,"config":1392},{"href":1393,"dataGaName":1339,"dataGaLocation":1255},"/de-de/solutions/gitops/",{"text":944,"config":1395},{"href":947,"dataGaName":948,"dataGaLocation":1255},{"text":950,"config":1397},{"href":953,"dataGaName":954,"dataGaLocation":1255},{"text":956,"config":1399},{"href":959,"dataGaName":960,"dataGaLocation":1255},{"text":1401,"config":1402},"Bildungswesen",{"href":1403,"dataGaName":1404,"dataGaLocation":1255},"/de-de/solutions/education/","education",{"text":1406,"config":1407},"Finanzdienstleistungen",{"href":1408,"dataGaName":1409,"dataGaLocation":1255},"/de-de/solutions/finance/","financial services",{"title":967,"links":1411},[1412,1414,1416,1418,1421,1423,1426,1428,1430,1432,1434,1436,1438,1440],{"text":980,"config":1413},{"href":982,"dataGaName":983,"dataGaLocation":1255},{"text":985,"config":1415},{"href":987,"dataGaName":988,"dataGaLocation":1255},{"text":990,"config":1417},{"href":992,"dataGaName":993,"dataGaLocation":1255},{"text":995,"config":1419},{"href":997,"dataGaName":1420,"dataGaLocation":1255},"docs",{"text":1018,"config":1422},{"href":1020,"dataGaName":1021,"dataGaLocation":1255},{"text":1424,"config":1425},"Neuerungen",{"href":1078,"dataGaName":1079,"dataGaLocation":1255},{"text":1013,"config":1427},{"href":1015,"dataGaName":1016,"dataGaLocation":1255},{"text":1032,"config":1429},{"href":1034,"dataGaName":1035,"dataGaLocation":1255},{"text":1040,"config":1431},{"href":1042,"dataGaName":1043,"dataGaLocation":1255},{"text":1045,"config":1433},{"href":1047,"dataGaName":1048,"dataGaLocation":1255},{"text":1050,"config":1435},{"href":1052,"dataGaName":1053,"dataGaLocation":1255},{"text":1055,"config":1437},{"href":1057,"dataGaName":1058,"dataGaLocation":1255},{"text":1060,"config":1439},{"href":1062,"dataGaName":1063,"dataGaLocation":1255},{"text":1065,"config":1441},{"href":1067,"dataGaName":1068,"dataGaLocation":1255},{"title":1081,"links":1443},[1444,1446,1448,1450,1452,1454,1459,1464,1466,1468,1470],{"text":1089,"config":1445},{"href":1091,"dataGaName":1083,"dataGaLocation":1255},{"text":1094,"config":1447},{"href":1096,"dataGaName":1097,"dataGaLocation":1255},{"text":1102,"config":1449},{"href":1104,"dataGaName":1105,"dataGaLocation":1255},{"text":1107,"config":1451},{"href":1109,"dataGaName":1110,"dataGaLocation":1255},{"text":1112,"config":1453},{"href":1114,"dataGaName":1115,"dataGaLocation":1255},{"text":1455,"config":1456},"Nachhaltigkeit",{"href":1457,"dataGaName":1458,"dataGaLocation":1255},"/sustainability/","Sustainability",{"text":1460,"config":1461},"Vielfalt, Inklusion und Zugehörigkeit",{"href":1462,"dataGaName":1463,"dataGaLocation":1255},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1117,"config":1465},{"href":1119,"dataGaName":1120,"dataGaLocation":1255},{"text":1127,"config":1467},{"href":1129,"dataGaName":1130,"dataGaLocation":1255},{"text":1132,"config":1469},{"href":1134,"dataGaName":1135,"dataGaLocation":1255},{"text":1471,"config":1472},"Transparenzerklärung zu moderner Sklaverei",{"href":1473,"dataGaName":1474,"dataGaLocation":1255},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1476},[1477,1480,1483],{"text":1478,"config":1479},"Terms",{"href":1305,"dataGaName":1306,"dataGaLocation":1255},{"text":1481,"config":1482},"Cookies",{"dataGaName":1315,"dataGaLocation":1255,"id":1316,"isOneTrustButton":328},{"text":1484,"config":1485},"Datenschutz",{"href":1310,"dataGaName":1311,"dataGaLocation":1255},[1487],{"id":1488,"title":7,"body":788,"config":1489,"content":1491,"description":788,"extension":1495,"meta":1496,"navigation":328,"path":1497,"seo":1498,"stem":1499,"__hash__":1500},"blogAuthors/en-us/blog/authors/ben-ridley.yml",{"template":1490},"BlogAuthor",{"name":7,"config":1492},{"headshot":1493,"ctfId":1494},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659973/Blog/Author%20Headshots/bridley-headshot.jpg","bridley","yml",{},"/en-us/blog/authors/ben-ridley",{},"en-us/blog/authors/ben-ridley","jzbrM-xtuSS5JZxX-wev-ipXW7XmcYogOOxnbq1GSrs",[1502,1510,1517],{"title":1503,"description":1504,"heroImage":1505,"category":785,"date":1506,"authors":1507,"slug":1509,"externalUrl":788},"DevOps Stack aufbauen: Häufige Fehler und Best Practices für moderne Toolchains","Ein DevOps Stack sollte mehr sein als eine Tool-Sammlung. Lerne, wie Teams häufige Fehler vermeiden und mit GitLab Toolchain-Komplexität reduzieren.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775561395/bhe1as7ttjvzltxwgo5m.png","2026-08-07",[1508],"GitLab Germany Team","devops-stack",{"title":1511,"description":1512,"heroImage":1513,"category":785,"date":1514,"authors":1515,"slug":1516,"externalUrl":788},"Sechs Möglichkeiten, die DevOps Kosten zu senken, zu sparen und zu optimieren","Wir zeigen dir sechs Möglichkeiten, wie du deine DevOps Kosten senken kannst.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1775486753/cswmwtygkgkbdsibo09v.png","2026-07-20",[1508],"reduce-devops-costs",{"title":1518,"description":1519,"heroImage":1520,"category":785,"date":1514,"authors":1521,"slug":1523,"externalUrl":788},"Work Items automatisch zuweisen mit dem Trigger \"Work item created\"","Eine Schritt-für-Schritt-Anleitung zum neuen Trigger, der Work Items automatisch zuweist – skalierbare Triage ohne manuelles Eingreifen.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png",[1522],"Cesar Saavedra","how-to-use-a-work-item-created-trigger",{"promotions":1525},[1526,1540,1551,1563],{"id":1527,"categories":1528,"header":1530,"text":1531,"button":1532,"image":1537},"ai-modernization",[1529],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":1533,"config":1534},"Ermittle deinen KI-Reifegrad",{"href":1535,"dataGaName":1536,"dataGaLocation":1021},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":1538},{"src":1539},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1541,"categories":1542,"header":1543,"text":1531,"button":1544,"image":1548},"devops-modernization",[785,1352],"Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":1545,"config":1546},"Ermittle deinen DevOps-Reifegrad",{"href":1547,"dataGaName":1536,"dataGaLocation":1021},"/de-de/assessments/devops-modernization-assessment/",{"config":1549},{"src":1550},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1552,"categories":1553,"header":1555,"text":1531,"button":1556,"image":1560},"security-modernization",[1554],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":1557,"config":1558},"Ermittle deinen Sicherheitsreifegrad",{"href":1559,"dataGaName":1536,"dataGaLocation":1021},"/de-de/assessments/security-modernization-assessment/",{"config":1561},{"src":1562},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1564,"paths":1565,"header":1568,"text":1569,"button":1570,"image":1575},"github-azure-migration",[1566,1567],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":1571,"config":1572},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":1573,"dataGaName":1574,"dataGaLocation":1021},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1576},{"src":1550},{"header":1578,"blurb":1579,"button":1580,"secondaryButton":1585},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":1581,"config":1582},"Kostenlosen Test starten",{"href":1583,"dataGaName":819,"dataGaLocation":1584},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1144,"config":1586},{"href":1146,"dataGaName":824,"dataGaLocation":1584},1786803740573]