{"id":319,"date":"2021-05-30T01:53:21","date_gmt":"2021-05-29T23:53:21","guid":{"rendered":"https:\/\/www.kehrwasser.com\/blog\/?p=319"},"modified":"2021-06-18T15:13:02","modified_gmt":"2021-06-18T13:13:02","slug":"devops-versionierungsstrategie-bei-continuous-delivery","status":"publish","type":"post","link":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/","title":{"rendered":"DevOps: Versionierungsstrategie bei Continuous Delivery"},"content":{"rendered":"<p>Setzen wir die Version aus dem Quelltext heraus? Sollte die CI\/CD-Pipeline die Version setzen und wom\u00f6glich auch einen Tag automatisiert im Version Control System (VCS, z.B. Git, Mercurial, Subversion) setzen?<\/p>\n<pre class=\"wp-block-preformatted\"><strong>Achtung: Dieser Artikel ist eher Low-Level und f\u00fcr Build-Engineers, Entwickler und Architekten geeignet.<\/strong><\/pre>\n<p><strong>TL;DR:<\/strong> Wenn der Kunde mit kryptischen Buildnummern oder Hashwerten und keine Aussage \u00fcber die Kompatibilit\u00e4t in der Versionsbezeichnung n\u00f6tig ist, kann der einfach mit jedem Commit bis auf die Produktion automatisiert werden.<\/p>\n<p>Meist ist dies jedoch nicht der Fall. Die Anwendung besteht wahrscheinlich aus einem Backend und einem Frontend, wenn es sich um einen einfachen Fall handelt. In vielen F\u00e4llen haben wir bereits Microservice Infrastruktur mit mehreren Servicen, die \u00fcber Schnittstellen miteinander kommunizieren und voneinander abh\u00e4ngen. Abw\u00e4rtskompatibilit\u00e4ten und Breaking-Changes wollen durch die Versionierung transparent gemacht werden.<\/p>\n<p>Doch Breaking Changes in einem Softwarestand zu identifizieren, ist aus meiner Sicht nicht automatisiert m\u00f6glich. Eventuell k\u00f6nnte man experimentell \u00fcber Schnittstellenkontrakte und automatisierte Tests Abw\u00e4rtskompatibilit\u00e4t automatisiert testen, das ist aber nur eine fixe Idee eines zu kreativen Entwicklers. Auch zwischen Patch und Minor-Release zu unterscheiden ist Ermessenssache. Der Punkt ist, um abh\u00e4ngige Anwendungen mittels der Versionsnummer \u00fcber Major-Updates und wahrscheinliche oder sogar sichere Kompatibilit\u00e4tsprobleme zu informieren, ben\u00f6tige ich einen Menschen.<\/p>\n<p>Zum Einsatz kommt nat\u00fcrlich Semantic Versioning &#8212; Sie wissen schon: <code>major.minor.patch-snapshot<\/code>.<\/p>\n<p>Das ist der manuelle Teil. Der automatisierte Teil ist relativ unproblematisch: Jeder Commit im VCS erzeugt \u00fcber die CI\/CD-Pipeline ein Artefact mit der Buildnummer (wahlweise dem Commit-Hash). So etwas wie <code>meine-anwendung:4711<\/code>, wobei <code>4711<\/code> die Buildnummer ist.<\/p>\n<p>Dieses Artefakt &#8211; sei es ein Docker-Image, eine EXE, ein Tar-Archiv, eine Jar-Datei, whatever &#8211; wird \u00fcblicherweise in einem Artefaktspeicher abgelegt (Artifactory, Nexus, Docker Registry, etc.) und von dort dann weiter auf die entsprechenden Umgebungen bis hin zur Produktion ausgerollt: &#8222;deployt&#8220;. Dort werden dann verschiedene Integrationstests, Ende-zu-Ende-Tests, Abnahmetests und so weiter ausgef\u00fchrt.<\/p>\n<p>Bei einer Codebasis, einer Anwendung, die gepflegt, weiterentwickelt und ausgeliefert wird, ist das easy. Die Buildnummer ist zentrale Wahrheit. Was aber wenn x Anwendungen entwickelt werden und in einem \u00d6kosystem zusammenspielen m\u00fcssen. Was bedeutet in diesem Kontext ein &#8222;neuer Build&#8220;? Anwendung-1 ist bei Build 6364 w\u00e4hrend Anwendung-12 erst bei Build 56 ist. Wie komme ich hier zu allgemeinen, automatisierten Testaussagen. Das behandeln wir mal in einem anderen Artikel.<\/p>\n<p>F\u00fcr unser einfaches Szenarion kommt jetzt wieder die manuelle Versionierung ins Spiel. Denn ich m\u00f6chte meine neue Version nicht als 4711 ver\u00f6ffentlichen. Eine oft genutzte Eigenschaft meiner Schnittstelle stand in der letzten Version 1.2.3 noch zur Verf\u00fcgung, ist aber jetzt nicht mehr dabei. Es ist Zeit f\u00fcr eine Version 2.0.0.<\/p>\n<p>Wie benennen wir jetzt also den Build 4711 mit 2.0.0? Manuelles \u00c4ndern des Dateinamens? Sicher nicht. Aus meiner Sicht ist das Folgende am einfachsten: Wir nutzen Tags, falls uns VCS das hergibt (Git kann das nat\u00fcrlich).<\/p>\n<p>Die Buildnummer ist nichts weiter als die fortlaufende Nummer der Pipelineausf\u00fchrung, durch die das Artefakt erzeugt wurde. Dieser Pipelinedurchlauf l\u00e4uft auf einem bestimmten Codestand, der wiederum in einem Commit im VCS eindeutig enthalten ist.<\/p>\n<p>Indem wir manuell einen Tag 2.0.0 auf diesen der Buildnummer 4711 eindeutig zugeordneten Commit setzen, l\u00f6sen wir ein Event aus. Dieses Event triggert eine Pipeline, die nun das Artefakt nicht mit der Buildnummer, sondern der Tag-Bezeichnung versieht.<\/p>\n<p>Jetzt ist es noch wichtig, die Artefakte vielleicht systematisch aufzur\u00e4umen, aber auch das ist ein Thema f\u00fcr einen weiteren Artikel.<\/p>","protected":false},"excerpt":{"rendered":"<p>Setzen wir die Version aus dem Quelltext heraus? Sollte die CI\/CD-Pipeline die Version setzen und wom\u00f6glich auch einen Tag automatisiert im Version Control System (VCS, z.B. Git, Mercurial, Subversion) setzen? Achtung: Dieser Artikel ist eher Low-Level und f\u00fcr Build-Engineers, Entwickler und Architekten geeignet. TL;DR: Wenn der Kunde mit kryptischen Buildnummern oder Hashwerten und keine Aussage [&hellip;]<\/p>","protected":false},"author":1,"featured_media":323,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[42],"tags":[79,77,45,78],"class_list":["post-319","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technologien","tag-build-management","tag-cicd","tag-devops","tag-low-level"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>DevOps: Versionierungsstrategie bei Continuous Delivery - Looped Learning<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DevOps: Versionierungsstrategie bei Continuous Delivery - Looped Learning\" \/>\n<meta property=\"og:description\" content=\"Setzen wir die Version aus dem Quelltext heraus? Sollte die CI\/CD-Pipeline die Version setzen und wom\u00f6glich auch einen Tag automatisiert im Version Control System (VCS, z.B. Git, Mercurial, Subversion) setzen? Achtung: Dieser Artikel ist eher Low-Level und f\u00fcr Build-Engineers, Entwickler und Architekten geeignet. TL;DR: Wenn der Kunde mit kryptischen Buildnummern oder Hashwerten und keine Aussage [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/\" \/>\n<meta property=\"og:site_name\" content=\"Looped Learning\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-29T23:53:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-06-18T13:13:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"2000\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kevin Heusinger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kevin Heusinger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/\",\"url\":\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/\",\"name\":\"DevOps: Versionierungsstrategie bei Continuous Delivery - Looped Learning\",\"isPartOf\":{\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1\",\"datePublished\":\"2021-05-29T23:53:21+00:00\",\"dateModified\":\"2021-06-18T13:13:02+00:00\",\"author\":{\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/#\/schema\/person\/d05f6ec3af9fdb4eb51b5aac1f9e91cf\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1\",\"width\":2000,\"height\":2000},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/www.kehrwasser.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps: Versionierungsstrategie bei Continuous Delivery\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/#website\",\"url\":\"https:\/\/www.kehrwasser.com\/blog\/\",\"name\":\"Looped Learning\",\"description\":\"#innovation, #ki, #newWork, #agile, #validatedLearning\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.kehrwasser.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/#\/schema\/person\/d05f6ec3af9fdb4eb51b5aac1f9e91cf\",\"name\":\"Kevin Heusinger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.kehrwasser.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/99ba53c67cb33396656b9736e215b87b954fd3c27c0e38ddc100f885da526bfb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/99ba53c67cb33396656b9736e215b87b954fd3c27c0e38ddc100f885da526bfb?s=96&d=mm&r=g\",\"caption\":\"Kevin Heusinger\"},\"sameAs\":[\"https:\/\/www.kehrwasser.com\"],\"url\":\"https:\/\/www.kehrwasser.com\/blog\/author\/kw-kevin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DevOps: Versionierungsstrategie bei Continuous Delivery - Looped Learning","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/","og_locale":"de_DE","og_type":"article","og_title":"DevOps: Versionierungsstrategie bei Continuous Delivery - Looped Learning","og_description":"Setzen wir die Version aus dem Quelltext heraus? Sollte die CI\/CD-Pipeline die Version setzen und wom\u00f6glich auch einen Tag automatisiert im Version Control System (VCS, z.B. Git, Mercurial, Subversion) setzen? Achtung: Dieser Artikel ist eher Low-Level und f\u00fcr Build-Engineers, Entwickler und Architekten geeignet. TL;DR: Wenn der Kunde mit kryptischen Buildnummern oder Hashwerten und keine Aussage [&hellip;]","og_url":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/","og_site_name":"Looped Learning","article_published_time":"2021-05-29T23:53:21+00:00","article_modified_time":"2021-06-18T13:13:02+00:00","og_image":[{"width":2000,"height":2000,"url":"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1","type":"image\/jpeg"}],"author":"Kevin Heusinger","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Kevin Heusinger","Gesch\u00e4tzte Lesezeit":"3\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/","url":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/","name":"DevOps: Versionierungsstrategie bei Continuous Delivery - Looped Learning","isPartOf":{"@id":"https:\/\/www.kehrwasser.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#primaryimage"},"image":{"@id":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1","datePublished":"2021-05-29T23:53:21+00:00","dateModified":"2021-06-18T13:13:02+00:00","author":{"@id":"https:\/\/www.kehrwasser.com\/blog\/#\/schema\/person\/d05f6ec3af9fdb4eb51b5aac1f9e91cf"},"breadcrumb":{"@id":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#primaryimage","url":"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1","width":2000,"height":2000},{"@type":"BreadcrumbList","@id":"https:\/\/www.kehrwasser.com\/blog\/2021\/05\/30\/devops-versionierungsstrategie-bei-continuous-delivery\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/www.kehrwasser.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DevOps: Versionierungsstrategie bei Continuous Delivery"}]},{"@type":"WebSite","@id":"https:\/\/www.kehrwasser.com\/blog\/#website","url":"https:\/\/www.kehrwasser.com\/blog\/","name":"Looped Learning","description":"#innovation, #ki, #newWork, #agile, #validatedLearning","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.kehrwasser.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/www.kehrwasser.com\/blog\/#\/schema\/person\/d05f6ec3af9fdb4eb51b5aac1f9e91cf","name":"Kevin Heusinger","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.kehrwasser.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/99ba53c67cb33396656b9736e215b87b954fd3c27c0e38ddc100f885da526bfb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/99ba53c67cb33396656b9736e215b87b954fd3c27c0e38ddc100f885da526bfb?s=96&d=mm&r=g","caption":"Kevin Heusinger"},"sameAs":["https:\/\/www.kehrwasser.com"],"url":"https:\/\/www.kehrwasser.com\/blog\/author\/kw-kevin\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.kehrwasser.com\/blog\/wp-content\/uploads\/2021\/05\/3793108.jpg?fit=2000%2C2000&ssl=1","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/posts\/319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/comments?post=319"}],"version-history":[{"count":4,"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/posts\/319\/revisions"}],"predecessor-version":[{"id":353,"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/posts\/319\/revisions\/353"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/media\/323"}],"wp:attachment":[{"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/media?parent=319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/categories?post=319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kehrwasser.com\/blog\/wp-json\/wp\/v2\/tags?post=319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}