[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"btz8hO-MXSFLpybqvfjYVBre4OvrEJO1wFySe3Zmv-s":3,"9_t0YFtO844PW3-iCfPxRTbw8yv0-2zzu2bChZFenjo":39,"3lpQzgft2RhUzOZWaD7MStl0_BJN77gHq2SMhUIEhFE":75,"BJYazUZEV4gMSOXDQRhr94Ctn_gNzZlMKmR-F3beBdI":197,"_apollo:default":239},{"menu":4},{"__typename":5,"id":6,"name":7,"items":8},"Menu","footer","Fußzeile",[9,24,29,34],{"__typename":10,"id":11,"title":12,"description":13,"url":14,"langcode":15,"internal":20,"expanded":21,"attributes":22},"MenuItem","e2873307-b50a-4aab-b6b2-1950fd99c72e","Impressum",null,"/impressum",{"__typename":16,"id":17,"name":18,"direction":19},"Language","de","German","ltr",true,false,{"__typename":23,"class":13},"MenuItemAttributes",{"__typename":10,"id":25,"title":26,"description":13,"url":27,"langcode":15,"internal":20,"expanded":21,"attributes":28},"2cd9b7c9-142a-4ea3-b898-a0952c54a195","Datenschutz","/datenschutz",{"__typename":23,"class":13},{"__typename":10,"id":30,"title":31,"description":13,"url":32,"langcode":15,"internal":20,"expanded":21,"attributes":33},"a5effba3-5a8c-4125-8d78-0cdba09824db","AGB","/agb",{"__typename":23,"class":13},{"__typename":10,"id":35,"title":36,"description":13,"url":37,"langcode":15,"internal":21,"expanded":21,"attributes":38},"114bf071-bdbb-44cf-85c1-69e9d9e0777d","Newsletter","https://liechtenecker.at/newsletter-subscribe",{"__typename":23,"class":13},{"menu":40},{"__typename":5,"id":41,"name":42,"items":43},"nuxt-main-menu","Nuxt Hauptmenü",[44,50,55,60,65,70],{"__typename":10,"id":45,"title":46,"description":13,"url":47,"langcode":48,"internal":20,"expanded":21,"attributes":49},"9ffc5019-cbd8-4b2e-8eb7-9feae486d4a1","Blog","/know-how",{"__typename":16,"id":17,"name":18,"direction":19},{"__typename":23,"class":13},{"__typename":10,"id":51,"title":52,"description":13,"url":53,"langcode":48,"internal":20,"expanded":21,"attributes":54},"1c7a5430-8a42-4b24-9544-252adabc2f4c","Projekte","/projekte",{"__typename":23,"class":13},{"__typename":10,"id":56,"title":57,"description":13,"url":58,"langcode":48,"internal":20,"expanded":21,"attributes":59},"9c4feedc-79e4-4fbf-b68c-065f33ebfe4c","Sparring","/workshop-ux-sparring-fuer-unternehmen",{"__typename":23,"class":13},{"__typename":10,"id":61,"title":62,"description":13,"url":63,"langcode":48,"internal":20,"expanded":21,"attributes":64},"3b77a27b-272a-489f-843e-53e23ed07741","Trainings","/liechtenecker-ux-academy",{"__typename":23,"class":13},{"__typename":10,"id":66,"title":67,"description":13,"url":68,"langcode":48,"internal":20,"expanded":21,"attributes":69},"ce0bb82b-e1ee-4036-be95-f693a62e9f4a","Über uns","/about",{"__typename":23,"class":13},{"__typename":10,"id":71,"title":72,"description":13,"url":73,"langcode":48,"internal":20,"expanded":21,"attributes":74},"04a19381-81a9-4694-8653-182d8855d2b5","Kontakt","/kontakt",{"__typename":23,"class":13},{"route":76},{"__typename":77,"entity":78},"RouteInternal",{"__typename":79,"id":80,"title":81,"changed":82,"created":88,"langcode":91,"path":92,"promote":21,"status":20,"sticky":21,"metatag":93,"postCategory":118,"postContentElements":13,"evergreen":13,"tags":143,"postWpBody":164,"wpHeaderImage":168,"wpHeaderImageOld":180,"wpHeaderImageOldSmall":13,"wpOgImage":181,"wpPromotedTeaserImage":13,"wpShareDescription":13,"wpShareTitle":113,"wpTeaserText":167,"wpYoastHead":190,"author":191},"NodeWpPost","758","Automatische Deployments: Einsatz und Vorteile bei Liechtenecker",{"__typename":83,"timestamp":84,"timezone":85,"offset":86,"time":87},"DateTime",1658381836,"UTC","+00:00","2022-07-21T05:37:16+00:00",{"__typename":83,"timestamp":89,"timezone":85,"offset":86,"time":90},1657618484,"2022-07-12T09:34:44+00:00",{"__typename":16,"id":17,"name":18,"direction":19},"/blog/automatische-deployments",[94,101,108,114],{"__typename":95,"tag":96,"attributes":97},"MetaTagValue","meta",{"__typename":98,"name":99,"content":100},"MetaTagValueAttributes","title","automatische deployments | Liechtenecker UX Design Studio",{"__typename":102,"tag":103,"attributes":104},"MetaTagLink","link",{"__typename":105,"href":106,"hreflang":13,"rel":107,"media":13,"sizes":13,"type":13},"MetaTagLinkAttributes","http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/blog/automatische-deployments","canonical",{"__typename":109,"tag":96,"attributes":110},"MetaTagProperty",{"__typename":111,"property":112,"content":113},"MetaTagPropertyAttributes","og:title","automatische deployments",{"__typename":109,"tag":96,"attributes":115},{"__typename":111,"property":116,"content":117},"og:image","http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/styles/meta_og_image/public/wp-migration/wordpress-media-image/2022/07/Daniel_sharing.jpg?h=3ecc83bb&itok=43A9rwVY",{"__typename":119,"id":120,"name":121,"path":122,"status":20,"weight":123,"description":124,"langcode":128,"changed":129,"metatag":132},"TermCategories","7","Technologie","/kategorie/technologie",0,{"__typename":125,"processed":126,"format":127},"Text","Development Themen sowie zukünftige Technologien, mit denen wir uns auseinandersetzen. ","wp_html",{"__typename":16,"id":17,"name":18,"direction":19},{"__typename":83,"timestamp":130,"timezone":85,"offset":86,"time":131},1713772777,"2024-04-22T07:59:37+00:00",[133,136,140],{"__typename":95,"tag":96,"attributes":134},{"__typename":98,"name":99,"content":135},"Technologie | Liechtenecker UX Design Studio",{"__typename":95,"tag":96,"attributes":137},{"__typename":98,"name":138,"content":139},"description","Development Themen sowie zukünftige Technologien, mit denen wir uns auseinandersetzen.",{"__typename":102,"tag":103,"attributes":141},{"__typename":105,"href":142,"hreflang":13,"rel":107,"media":13,"sizes":13,"type":13},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/kategorie/technologie",[144,148,152,156,160],{"__typename":145,"id":146,"name":113,"path":147,"weight":123},"TermTags","120","/tag/automatische-deployments",{"__typename":145,"id":149,"name":150,"path":151,"weight":123},"323","deployment","/tag/deployment",{"__typename":145,"id":153,"name":154,"path":155,"weight":123},"370","docker","/tag/docker",{"__typename":145,"id":157,"name":158,"path":159,"weight":123},"731","kubernetes cluster","/tag/kubernetes-cluster",{"__typename":145,"id":161,"name":162,"path":163,"weight":123},"1300","technology","/tag/technology",{"__typename":165,"processed":166,"format":127,"summary":167},"TextSummary","\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \u003Cdiv class=\"blog-drop-cap\">\n                    \u003Cdiv class=\"blog-drop-cap-background\">\nL\u003C/div>\n\u003Cp class=\"has-drop-cap\">Lange ist’s her, als ich euch für Docker zu begeistern versuchte. In meinem Beitrag \u003Ca href=\"/blog/lets-dockerize-everything\" target=\"_blank\" rel=\"noreferrer noopener\">Let’s Dockerize everything!\u003C/a>\u003Ca href=\"/blog/lets-dockerize-everything\"> \u003C/a>habe ich bereits jede Menge Vorteile von Docker zusammengefasst. In diesem Beitrag möchte ich euch – darauf aufbauend – unsere automatischen Deployments näher bringen. Um euch einen guten Überblick zu verschaffen, werde ich versuchen, alle sich bei uns im Einsatz befindlichen Komponenten grob zu umreißen. Daraus resultiert natürlich, dass ich in diesem Beitrag auf keine davon im Detail eingehen werde.\u003C/p>\n\u003C/div>        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wir verwenden Docker für unsere lokalen Entwicklungsumgebungen: die Projekte liegen also bereits als Container-Image vor. Da wäre es natürlich schade, wenn wir die Images nicht auch für das Hosting der Applikationen nutzen würden.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Ch2>Kubernetes\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Auf der Suche nach Container-Orchestrierungs-Software stößt man schnell auf Kubernetes, eine der populärsten ihrer Art. Auf der \u003Ca href=\"https://kubernetes.io/de/docs/concepts/overview/what-is-kubernetes/\" target=\"_blank\" rel=\"noreferrer noopener\">offiziellen Dokumentations-Webseit\u003C/a>\u003Ca href=\"https://kubernetes.io/de/docs/concepts/overview/what-is-kubernetes/\">e\u003C/a> beschreibt es sich wie folgt:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \u003Cblockquote>\n                \u003Cspan class=\"quote-text\" data-ftf=\"true\">\n                    \n\u003Cspan class=\"wp-block-lie-quote-dynamic\">&lt;em&gt;“Kubernetes ist eine portable, erweiterbare Open-Source-Plattform zur Verwaltung von containerisierten Arbeitslasten und Services, die sowohl die deklarative Konfiguration als auch die Automatisierung erleichtert.”&lt;/em&gt;\u003C/span>\n                \u003C/span>\n                                    \u003Ccite class=\"author\">\n                        Kubernetes Website                    \u003C/cite>\n                \n                            \u003C/blockquote>\n\n\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Kubernetes kümmert sich um die “\u003Ca href=\"https://www.redhat.com/de/topics/containers/what-is-container-orchestration\" target=\"_blank\" rel=\"noreferrer noopener\">Orchestrierung\u003C/a>” von Docker-Containern innerhalb eines Kubernetes Clusters. Gesteuert wird ein Cluster mithilfe der \u003Ca href=\"https://kubernetes.io/docs/concepts/overview/kubernetes-api/\">Kubernetes API\u003C/a>, über die API Objekte in Kubernetes (\u003Ca href=\"https://kubernetes.io/docs/concepts/workloads/pods/\" target=\"_blank\" rel=\"noreferrer noopener\">PODs,\u003C/a> \u003Ca href=\"https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\" target=\"_blank\" rel=\"noreferrer noopener\">Namespaces,\u003C/a> \u003Ca href=\"https://kubernetes.io/docs/concepts/services-networking/service/\" target=\"_blank\" rel=\"noreferrer noopener\">Services,\u003C/a> \u003Ca href=\"https://kubernetes.io/docs/reference/kubernetes-api/\" target=\"_blank\" rel=\"noreferrer noopener\">etc.)\u003C/a> abgefragt und manipuliert werden können. Des Weiteren gibt es ein offizielles Command Line Tool, \u003Ca href=\"https://kubernetes.io/docs/reference/kubectl/\" target=\"_blank\" rel=\"noreferrer noopener\">kubectl\u003C/a>, welches die Steuerung des Clusters im Terminal, bzw. durch Skripte ermöglicht.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ich muss gestehen, dass das Handling von Kubernetes etwas gewöhnungsbedürftig ist. Speziell wenn man von der klassischen Schiene kommt: auf den \u003Ca href=\"https://de.wikipedia.org/wiki/Server\" target=\"_blank\" rel=\"noreferrer noopener\">Server\u003C/a> verbinden, Änderungen vom \u003Ca href=\"https://de.wikipedia.org/wiki/Versionsverwaltung\" target=\"_blank\" rel=\"noreferrer noopener\">VCS\u003C/a> pullen und \u003Ca href=\"https://de.wikipedia.org/wiki/Datenbank\" target=\"_blank\" rel=\"noreferrer noopener\">Datenbank-Updates\u003C/a> ausführen.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Im Gegensatz dazu verbindet man sich nämlich nirgends hin, man pullt keine Änderungen und auch die Updates werden nicht mehr manuell ausgeführt. Stattdessen erstellt/updatet man Kubernetes Objekte über die Kubernetes API. Man informiert Kubernetes sozusagen darüber, welches Docker-Image mit welchem Tag deployed werden soll. Den Rest erledigt dann Kubernetes.&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Unter dem Rest kann man sich unter anderem folgendes vorstellen:&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Cul>\u003Cli>Lastverteilung innerhalb des Clusters\u003C/li>\u003Cli>Load-Balancing von Traffic zwischen mehreren Replikaten einer App\u003C/li>\u003Cli>Healthchecks\u003C/li>\u003Cli>das automatische Neustarten von Apps bei Fehlern\u003C/li>\u003Cli>uvm.\u003C/li>\u003C/ul>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Ch3>\u003Cstrong>Geil, oder?!\u003C/strong>\u003C/h3>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Aufmerksame Leser haben sicherlich bemerkt, dass Datenbank-Updates nicht mehr manuell durchgeführt werden. Demzufolge muss die Applikation soweit automatisiert sein, dass solche Tasks automatisch ausgeführt werden können.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wir haben für unsere Systeme Update Skripts geschrieben, welche sich um die korrekte Ausführung der Updates kümmern.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Klar: Initial bedeutet das Aufwand. Aber glaubt mir, sobald die Automatisierungs-Skripts geschrieben sind, erleichtern sie einem das Leben ungemein. Es bietet auch mehr Sicherheit, da man im Skript die korrekte Ausführung der Updates sicherstellen kann. Man kann und sollte natürlich auch gleich Backup- und Restore Strategien einbauen.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Soweit so gut.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ich denke, ihr habt nun einen guten Überblick über Kubernetes.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Falls ihr noch mehr darüber lesen wollt, kann ich euch die \u003Ca href=\"https://kubernetes.io/docs/home/\" target=\"_blank\" rel=\"noreferrer noopener\">offizielle Docs Seite\u003C/a> ans Herz legen.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Ch2>Helm\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Also, statt pullen Konfigurationen anwenden. Das klingt erstmal nach einer großen Menge Konfigurationsfiles. Ohne weitere Hilfsmittel landet man schnell in einer Konfigurations-Dateien-Hölle. Speziell wenn man bei komplexeren Projekten mehrere Kubernetes Objekte mit ähnlichen oder gleichen Konfigurationen hat. Als Beispiel kann man sich den Cronjob Container und den PHP-Apache Container vorstellen, die beide dieselben Environment Variablen für die Datenbankverbindung benötigen. In klassischen Kubernetes Konfigurationsfiles müssten diese Werte in 2 Konfigurationsfiles (deployment.yaml und cronjob.yaml) angepasst werden! Und um dieses Problem zu lösen, gibt es \u003Ca href=\"https://helm.sh/\" target=\"_blank\" rel=\"noreferrer noopener\">Helm\u003C/a>.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Helm ist ein \u003Cstrong>Open Source Package Manager für Kubernetes\u003C/strong>. Anstatt fix-fertige Kubernetes Konfigurationsfiles anzulegen, kann man Helm Templates erstellen. Die Templates können wiederum Platzhalter enthalten, welche dann von Helm mit Werten aus den sogenannten \u003Ca href=\"https://helm.sh/docs/chart_template_guide/values_files/\" target=\"_blank\" rel=\"noreferrer noopener\">“Values-Files”\u003C/a> ersetzt werden.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Man kann also Environment-spezifische Konfigurationen anlegen, indem man pro Environment ein Values-File erstellt.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wir haben pro System ein \u003Ca href=\"https://helm.sh/docs/glossary/#chart\" target=\"_blank\" rel=\"noreferrer noopener\">Helm Chart\u003C/a> mit Templates für alle nötigen Kubernetes-Konfigurationen erstellt, in dem diverse Werte mittels Values-File übergeben werden können. Jedes der Charts lässt sich auf das System optimiert konfigurieren.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Ch2>Jenkins\u003C/h2>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ihr wisst nun, dass wir pro Projekt ein Docker Image haben, welches wir mittels Helm auf einen Kubernetes Cluster deployen. Was noch fehlt, sind automatischen Deployments. Dafür verwenden wir \u003Ca href=\"https://www.jenkins.io/\" target=\"_blank\" rel=\"noreferrer noopener\">Jenkins\u003C/a>, eine der bekanntesten Open Source Automatisierungs-Lösungen.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Falls ihr’s noch nicht bemerkt habt: Wir sind Kubernetes Fans! 😉 Daher haben wir einen Kubernetes Cluster bei \u003Ca href=\"https://www.digitalocean.com/\" target=\"_blank\" rel=\"noreferrer noopener\">DigitalOcean\u003C/a> angelegt, auf dem all unsere Develop-, Staging- und QA-Umgebungen gehostet werden. Das hat den Vorteil, dass wir für sehr viele unterschiedliche Projekte und Environments nur sehr wenige Server benötigen.&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Und warum erzähle ich das? Weil auf diesem Cluster auch Jenkins mithilfe des \u003Ca href=\"https://github.com/jenkinsci/helm-charts\" target=\"_blank\" rel=\"noreferrer noopener\">offiziellen Helm Charts\u003C/a> installiert ist.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wir haben unsere Jenkins Projekte als \u003Ca href=\"https://www.jenkins.io/doc/book/pipeline/multibranch/#creating-a-multibranch-pipeline\" target=\"_blank\" rel=\"noreferrer noopener\">Multibranch-Pipeline\u003C/a> konfiguriert, welche durch Pushes in ausgewählte Branches eines ausgewählten Git Repositories gestartet wird.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Ch3>Unsere hausinterne Standard-Pipeline besteht aus folgenden Schritten:\u003C/h3>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Cul>\u003Cli>Docker Tag generieren: wir verwenden dafür den Branch-Namen und den Build-Timestamp → somit haben wir einen eindeutigen Tag-Namen pro Build\u003C/li>\u003Cli>Docker Images builden: für unsere Zwecke bauen wir 2 Docker Images parallel:\u003Cul>\u003Cli>ein Test-Image inklusive DEV-Dependencies (also dem Test-Framework, etc.)\u003C/li>\u003Cli>das Haupt-Image ohne DEV-Dependencies, welches dann unter dem Tag in unsere Docker Registry gepusht wird\u003C/li>\u003C/ul>\u003C/li>\u003Cli>Automatisierte Tests im Test-Image ausführen\u003C/li>\u003Cli>Haupt-Image mit dem Docker-Image-Tag in ein privates Repository auf \u003Ca href=\"https://hub.docker.com/\" target=\"_blank\" rel=\"noreferrer noopener\">Dockerhub\u003C/a> pushen\u003C/li>\u003Cli>\u003Cstrong>in allen nicht-produktiv-Umgebungen:\u003C/strong> Upgrade vom Helm Release mit einem branch-spezifischen Values-File\u003C/li>\u003C/ul>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Der letzte Punkt wird natürlich nur in Test-Environments automatisch durchgeführt. Für Releases in Produktivumgebungen muss dieser Schritt zur Sicherheit manuell gestartet werden.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Wenn einer der Build-Steps fehlschlägt, bricht die komplette Pipeline ab. Somit wird sichergestellt, dass keine Updates deployed werden, wenn beispielsweise die Tests fehlschlagen.&nbsp;\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Für uns Entwickler bedeutet das, dass wir nur noch Features in Environments mergen müssen. Das Bauen der Docker-Images und das Update der Helm Releases passiert dann automatisch via Jenkins.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Durch die automatischen Deployments ergeben sich unter anderem folgende Vorteile:\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3  standard-list\">\n            \n\u003Cul>\u003Cli>einheitliche Deployment Strategie über alle Projekte\u003C/li>\u003Cli>erhöhte Systemstabilität durch automatisierte Tests\u003C/li>\u003Cli>erhöhte Sicherheit durch automatisierte Backups vor Deployments\u003C/li>\u003Cli>Verhinderung menschlicher Fehler bei Deployments\u003C/li>\u003C/ul>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Sobald die Helm-Charts und Pipelines initial eingerichtet wurden, lassen sich diese sehr einfach auf neue Projekte übertragen.\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>Ich hoffe, ich konnte einige von euch überzeugen, sich mit den Systemen auseinanderzusetzen. Wir arbeiten nun seit ungefähr eineinhalb Jahren damit und sind sehr zufrieden. Wir verbessern natürlich auch regelmäßig die einzelnen Komponenten unserer Automatisierungssysteme. Also, je früher man damit startet, desto früher kann man mit den Erweiterungen beginnen, die einem das Leben noch leichter machen! 🙂\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n\n\n\n\u003Cdiv class=\"grid-wrapper\">\n    \u003Cdiv class=\"row\">\n        \u003Cdiv class=\"default-left col-xsmall-12 col-medium-6 col-medium-offset-2 col-large-6 col-large-offset-3 \">\n            \n\u003Cp>\u003C/p>\n        \u003C/div>\n    \u003C/div>\n\u003C/div>\n\n","In diesem Beitrag möchte ich euch unsere automatischen Deployments näher bringen. Um euch einen guten Überblick zu verschaffen, werde ich versuchen, alle sich bei uns im Einsatz befindlichen Komponenten grob zu umreißen. ",{"__typename":169,"id":170,"excludeFromScreenreader":13,"mediaImage":171,"name":176,"path":179,"status":20},"MediaImage","597",{"__typename":172,"url":173,"width":174,"height":175,"alt":13,"title":176,"size":177,"mime":178},"Image","http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/wp-migration/wordpress-media-image/2022/07/Daniel_titel-scaled.jpg",2560,1156,"Daniel_titel",460587,"image/jpeg","/media/597/edit",{"__typename":169,"id":170,"excludeFromScreenreader":13,"mediaImage":171,"name":176,"path":179,"status":20},{"__typename":169,"id":182,"excludeFromScreenreader":13,"mediaImage":183,"name":187,"path":189,"status":20},"596",{"__typename":172,"url":184,"width":185,"height":186,"alt":13,"title":187,"size":188,"mime":178},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/wp-migration/wordpress-media-image/2022/07/Daniel_sharing.jpg",1204,630,"Daniel_sharing",497279,"/media/596/edit","\u003C!-- This site is optimized with the Yoast SEO plugin v15.7 - https://yoast.com/wordpress/plugins/seo/ -->\n\u003Cmeta name=\"description\" content=\"In diesem Beitrag über Deployment-Automatisierung geben wir euch einen Überblick über alle Komponenten, die wir im Einsatz haben.\" />\n\u003Cmeta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" />\n\u003Clink rel=\"canonical\" href=\"https://legacy.liechtenecker.dev/blog/automatische-deployments/\" />\n\u003Cmeta property=\"og:locale\" content=\"de_DE\" />\n\u003Cmeta property=\"og:type\" content=\"article\" />\n\u003Cmeta property=\"og:title\" content=\"Automatische Deployments: Einsatz und Vorteile bei Liechtenecker - Liechtenecker\" />\n\u003Cmeta property=\"og:description\" content=\"In diesem Beitrag über Deployment-Automatisierung geben wir euch einen Überblick über alle Komponenten, die wir im Einsatz haben.\" />\n\u003Cmeta property=\"og:url\" content=\"https://legacy.liechtenecker.dev/blog/automatische-deployments/\" />\n\u003Cmeta property=\"og:site_name\" content=\"Liechtenecker\" />\n\u003Cmeta property=\"article:published_time\" content=\"2022-07-12T11:34:44+00:00\" />\n\u003Cmeta property=\"article:modified_time\" content=\"2022-07-21T07:37:16+00:00\" />\n\u003Cmeta name=\"twitter:card\" content=\"summary_large_image\" />\n\u003Cmeta name=\"twitter:label1\" content=\"Geschätzte Lesezeit\">\n\t\u003Cmeta name=\"twitter:data1\" content=\"5 Minuten\">\n\u003Cscript type=\"application/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https://legacy.liechtenecker.dev/#website\",\"url\":\"https://legacy.liechtenecker.dev/\",\"name\":\"Liechtenecker\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https://legacy.liechtenecker.dev/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"WebPage\",\"@id\":\"https://legacy.liechtenecker.dev/blog/automatische-deployments/#webpage\",\"url\":\"https://legacy.liechtenecker.dev/blog/automatische-deployments/\",\"name\":\"Automatische Deployments: Einsatz und Vorteile bei Liechtenecker - Liechtenecker\",\"isPartOf\":{\"@id\":\"https://legacy.liechtenecker.dev/#website\"},\"datePublished\":\"2022-07-12T11:34:44+00:00\",\"dateModified\":\"2022-07-21T07:37:16+00:00\",\"author\":{\"@id\":\"https://legacy.liechtenecker.dev/#/schema/person/d8b80cc046b867225321ea8b7a2a6de7\"},\"description\":\"In diesem Beitrag \\u00fcber Deployment-Automatisierung geben wir euch einen \\u00dcberblick \\u00fcber alle Komponenten, die wir im Einsatz haben.\",\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https://legacy.liechtenecker.dev/blog/automatische-deployments/\"]}]},{\"@type\":\"Person\",\"@id\":\"https://legacy.liechtenecker.dev/#/schema/person/d8b80cc046b867225321ea8b7a2a6de7\",\"name\":\"Daniel\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://legacy.liechtenecker.dev/#personlogo\",\"inLanguage\":\"de-DE\",\"url\":\"https://secure.gravatar.com/avatar/5708f7599c8e99528411ef29bef1ee34?s=96&d=mm&r=g\",\"caption\":\"Daniel\"}}]}\u003C/script>\n\u003C!-- / Yoast SEO plugin. -->",{"__typename":192,"id":193,"myRole":194,"name":195,"nickname":196},"User","5","Backend Development🤓","d-steindl","Daniel",{"latestKnowhow":198},[199,214,227],{"__typename":79,"id":200,"title":201,"path":202,"wpTeaserText":203,"wpPromotedTeaserImage":13,"wpHeaderImage":204},"1619","Behind the scenes: Ein Barrierefreiheits-Audit","/blog/behind-scenes-ein-barrierefreiheits-audit","”Entspricht unsere Website den gesetzlichen Anforderungen und wenn nicht, was genau müssen wir ändern?”\r\nDiese Frage lieben wir. Echt! Und so sieht unsere Antwort aus.",{"__typename":169,"id":205,"excludeFromScreenreader":13,"mediaImage":206,"name":212,"path":213,"status":20},"3364",{"__typename":172,"url":207,"width":208,"height":209,"alt":210,"title":13,"size":211,"mime":178},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/2026-04/Headerbilder%20Blogartikel%20Behind%20the%20scene%20Accessibility%20Audit.jpg",2880,1300,"Headline mit Sujet: Tastatur mit Symbolen für Barrierefreiheit im Fokus auf hellem  Hintergrund",838204,"Headerbilder Blogartikel Behind the scene Accessibility Audit.jpg","/media/3364/edit",{"__typename":79,"id":215,"title":216,"path":217,"wpTeaserText":218,"wpPromotedTeaserImage":13,"wpHeaderImage":219},"1616","Agentic KI trifft Design-System: Wie unser Presentation Maker entstand.","/blog/agentic-ki-trifft-design-system-wie-unser-presentation-maker-entstand","Nein, wir wollen euch jetzt nicht erzählen, was KI alles kann. Aber wir möchten euch zeigen, wie wir mit KI umgehen. \r\n",{"__typename":169,"id":220,"excludeFromScreenreader":13,"mediaImage":221,"name":225,"path":226,"status":20},"3355",{"__typename":172,"url":222,"width":208,"height":209,"alt":223,"title":13,"size":224,"mime":178},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/2026-03/BLOG_Presentation%20Tool_TITEL-2880x1300px_1.jpg","Lukas und Daniel  arbeiten an Computern im Büro.",2621988,"BLOG_Presentation Tool_TITEL-2880x1300px.jpg","/media/3355/edit",{"__typename":79,"id":228,"title":229,"path":230,"wpTeaserText":13,"wpPromotedTeaserImage":13,"wpHeaderImage":231},"1606","UI Trends 2026","/blog/ui-trends-2026",{"__typename":169,"id":232,"excludeFromScreenreader":21,"mediaImage":233,"name":237,"path":238,"status":20},"3303",{"__typename":172,"url":234,"width":208,"height":209,"alt":235,"title":13,"size":236,"mime":178},"http://liechtenecker-cms.liechtenecker-cms.svc.cluster.local/sites/default/files/2026-01/BLOG_Trendbericht%202026.jpg","UI Trends 2026, gelber Hintergrund, schwarze Schrift.",4700748,"BLOG_Trendbericht 2026.jpg","/media/3303/edit",{"Language:de":240,"MenuItem:e2873307-b50a-4aab-b6b2-1950fd99c72e":241,"MenuItem:2cd9b7c9-142a-4ea3-b898-a0952c54a195":245,"MenuItem:a5effba3-5a8c-4125-8d78-0cdba09824db":248,"MenuItem:114bf071-bdbb-44cf-85c1-69e9d9e0777d":251,"Menu:footer":254,"ROOT_QUERY":264,"MenuItem:9ffc5019-cbd8-4b2e-8eb7-9feae486d4a1":280,"MenuItem:1c7a5430-8a42-4b24-9544-252adabc2f4c":283,"MenuItem:9c4feedc-79e4-4fbf-b68c-065f33ebfe4c":286,"MenuItem:3b77a27b-272a-489f-843e-53e23ed07741":289,"MenuItem:ce0bb82b-e1ee-4036-be95-f693a62e9f4a":292,"MenuItem:04a19381-81a9-4694-8653-182d8855d2b5":295,"Menu:nuxt-main-menu":298,"TermCategories:7":312,"TermTags:120":323,"TermTags:323":324,"TermTags:370":325,"TermTags:731":326,"TermTags:1300":327,"MediaImage:597":328,"MediaImage:596":330,"User:5":332,"NodeWpPost:758":333,"MediaImage:3364":367,"NodeWpPost:1619":369,"MediaImage:3355":372,"NodeWpPost:1616":374,"MediaImage:3303":377,"NodeWpPost:1606":379},["null","__typename",16,"id",17,"name",18,"direction",19],["null","__typename",10,"id",11,"title",12,"description",13,"url",14,"langcode",242,"internal",20,"expanded",21,"attributes",244],{"__ref":243},"Language:de",["null","__typename",23,"class",13],["null","__typename",10,"id",25,"title",26,"description",13,"url",27,"langcode",246,"internal",20,"expanded",21,"attributes",247],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",10,"id",30,"title",31,"description",13,"url",32,"langcode",249,"internal",20,"expanded",21,"attributes",250],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",10,"id",35,"title",36,"description",13,"url",37,"langcode",252,"internal",21,"expanded",21,"attributes",253],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",5,"id",6,"name",7,"items",255],[256,258,260,262],{"__ref":257},"MenuItem:e2873307-b50a-4aab-b6b2-1950fd99c72e",{"__ref":259},"MenuItem:2cd9b7c9-142a-4ea3-b898-a0952c54a195",{"__ref":261},"MenuItem:a5effba3-5a8c-4125-8d78-0cdba09824db",{"__ref":263},"MenuItem:114bf071-bdbb-44cf-85c1-69e9d9e0777d",["null","__typename",265,"menu({\"name\":\"FOOTER\"})",266,"menu({\"name\":\"NUXT_MAIN_MENU\"})",268,"route({\"path\":\"/blog/automatische-deployments\"})",270,"latestKnowhow({\"excludeId\":\"758\",\"limit\":3})",273],"Query",{"__ref":267},"Menu:footer",{"__ref":269},"Menu:nuxt-main-menu",["null","__typename",77,"entity",271],{"__ref":272},"NodeWpPost:758",[274,276,278],{"__ref":275},"NodeWpPost:1619",{"__ref":277},"NodeWpPost:1616",{"__ref":279},"NodeWpPost:1606",["null","__typename",10,"id",45,"title",46,"description",13,"url",47,"langcode",281,"internal",20,"expanded",21,"attributes",282],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",10,"id",51,"title",52,"description",13,"url",53,"langcode",284,"internal",20,"expanded",21,"attributes",285],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",10,"id",56,"title",57,"description",13,"url",58,"langcode",287,"internal",20,"expanded",21,"attributes",288],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",10,"id",61,"title",62,"description",13,"url",63,"langcode",290,"internal",20,"expanded",21,"attributes",291],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",10,"id",66,"title",67,"description",13,"url",68,"langcode",293,"internal",20,"expanded",21,"attributes",294],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",10,"id",71,"title",72,"description",13,"url",73,"langcode",296,"internal",20,"expanded",21,"attributes",297],{"__ref":243},["null","__typename",23,"class",13],["null","__typename",5,"id",41,"name",42,"items",299],[300,302,304,306,308,310],{"__ref":301},"MenuItem:9ffc5019-cbd8-4b2e-8eb7-9feae486d4a1",{"__ref":303},"MenuItem:1c7a5430-8a42-4b24-9544-252adabc2f4c",{"__ref":305},"MenuItem:9c4feedc-79e4-4fbf-b68c-065f33ebfe4c",{"__ref":307},"MenuItem:3b77a27b-272a-489f-843e-53e23ed07741",{"__ref":309},"MenuItem:ce0bb82b-e1ee-4036-be95-f693a62e9f4a",{"__ref":311},"MenuItem:04a19381-81a9-4694-8653-182d8855d2b5",["null","__typename",119,"id",120,"name",121,"path",122,"status",20,"weight",123,"description",313,"langcode",314,"changed",315,"metatag",316],["null","__typename",125,"processed",126,"format",127],{"__ref":243},["null","__typename",83,"timestamp",130,"timezone",85,"offset",86,"time",131],[317,319,321],["null","__typename",95,"tag",96,"attributes",318],["null","__typename",98,"name",99,"content",135],["null","__typename",95,"tag",96,"attributes",320],["null","__typename",98,"name",138,"content",139],["null","__typename",102,"tag",103,"attributes",322],["null","__typename",105,"href",142,"hreflang",13,"rel",107,"media",13,"sizes",13,"type",13],["null","__typename",145,"id",146,"name",113,"path",147,"weight",123],["null","__typename",145,"id",149,"name",150,"path",151,"weight",123],["null","__typename",145,"id",153,"name",154,"path",155,"weight",123],["null","__typename",145,"id",157,"name",158,"path",159,"weight",123],["null","__typename",145,"id",161,"name",162,"path",163,"weight",123],["null","__typename",169,"id",170,"excludeFromScreenreader",13,"mediaImage",329,"name",176,"path",179,"status",20],["null","__typename",172,"url",173,"width",174,"height",175,"alt",13,"title",176,"size",177,"mime",178],["null","__typename",169,"id",182,"excludeFromScreenreader",13,"mediaImage",331,"name",187,"path",189,"status",20],["null","__typename",172,"url",184,"width",185,"height",186,"alt",13,"title",187,"size",188,"mime",178],["null","__typename",192,"id",193,"myRole",194,"name",195,"nickname",196],["null","__typename",79,"id",80,"title",81,"changed",334,"created",335,"langcode",336,"path",92,"promote",21,"status",20,"sticky",21,"metatag",337,"category",346,"contentElements",13,"evergreen",13,"tags",348,"wpBody",359,"wpHeaderImage",360,"wpHeaderImageOld",362,"wpHeaderImageOldSmall",13,"wpOgImage",363,"wpPromotedTeaserImage",13,"wpShareDescription",13,"wpShareTitle",113,"wpTeaserText",167,"wpYoastHead",190,"author",365],["null","__typename",83,"timestamp",84,"timezone",85,"offset",86,"time",87],["null","__typename",83,"timestamp",89,"timezone",85,"offset",86,"time",90],{"__ref":243},[338,340,342,344],["null","__typename",95,"tag",96,"attributes",339],["null","__typename",98,"name",99,"content",100],["null","__typename",102,"tag",103,"attributes",341],["null","__typename",105,"href",106,"hreflang",13,"rel",107,"media",13,"sizes",13,"type",13],["null","__typename",109,"tag",96,"attributes",343],["null","__typename",111,"property",112,"content",113],["null","__typename",109,"tag",96,"attributes",345],["null","__typename",111,"property",116,"content",117],{"__ref":347},"TermCategories:7",[349,351,353,355,357],{"__ref":350},"TermTags:120",{"__ref":352},"TermTags:323",{"__ref":354},"TermTags:370",{"__ref":356},"TermTags:731",{"__ref":358},"TermTags:1300",["null","__typename",165,"processed",166,"format",127,"summary",167],{"__ref":361},"MediaImage:597",{"__ref":361},{"__ref":364},"MediaImage:596",{"__ref":366},"User:5",["null","__typename",169,"id",205,"excludeFromScreenreader",13,"mediaImage",368,"name",212,"path",213,"status",20],["null","__typename",172,"url",207,"width",208,"height",209,"alt",210,"title",13,"size",211,"mime",178],["null","__typename",79,"id",200,"title",201,"path",202,"wpTeaserText",203,"wpPromotedTeaserImage",13,"wpHeaderImage",370],{"__ref":371},"MediaImage:3364",["null","__typename",169,"id",220,"excludeFromScreenreader",13,"mediaImage",373,"name",225,"path",226,"status",20],["null","__typename",172,"url",222,"width",208,"height",209,"alt",223,"title",13,"size",224,"mime",178],["null","__typename",79,"id",215,"title",216,"path",217,"wpTeaserText",218,"wpPromotedTeaserImage",13,"wpHeaderImage",375],{"__ref":376},"MediaImage:3355",["null","__typename",169,"id",232,"excludeFromScreenreader",21,"mediaImage",378,"name",237,"path",238,"status",20],["null","__typename",172,"url",234,"width",208,"height",209,"alt",235,"title",13,"size",236,"mime",178],["null","__typename",79,"id",228,"title",229,"path",230,"wpTeaserText",13,"wpPromotedTeaserImage",13,"wpHeaderImage",380],{"__ref":381},"MediaImage:3303"]