{"id":2785,"date":"2020-03-14T13:21:21","date_gmt":"2020-03-14T12:21:21","guid":{"rendered":"https:\/\/www.aerian.fr\/?p=2785"},"modified":"2020-04-08T15:02:00","modified_gmt":"2020-04-08T13:02:00","slug":"english-gitlab-ci-automate-versions-releases","status":"publish","type":"post","link":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/","title":{"rendered":"Gitlab CI &#8211; Automate Versions &#038; Releases"},"content":{"rendered":"<div id=\"pl-2785\"  class=\"panel-layout\" ><div id=\"pg-2785-0\"  class=\"panel-grid panel-has-style\" ><div style=\"padding: 100px 0; \" data-overlay=\"true\" class=\"panel-row-style panel-row-style-for-2785-0\" ><div id=\"pgc-2785-0-0\"  class=\"panel-grid-cell\" ><div id=\"panel-2785-0-0-0\" class=\"so-panel widget widget_sow-editor panel-first-child\" data-index=\"0\" ><div style=\"text-align: left;\" data-title-color=\"#443f3f\" data-headings-color=\"#443f3f\" class=\"panel-widget-style panel-widget-style-for-2785-0-0-0\" ><div\n\t\t\t\n\t\t\tclass=\"so-widget-sow-editor so-widget-sow-editor-base\"\n\t\t\t\n\t\t>\n<div class=\"siteorigin-widget-tinymce textwidget\">\n\t<h1>Introduction<\/h1>\n<p>Still continuing the series of Gitlab CIs &amp; Automations,<br \/>\nThe current article will describe how to automate versions<br \/>\n&amp; Releases publishing with semantic-release.<\/p>\n<p>The workflow I decided for my workflow is adapted from a basic Git<br \/>\nworkflow like:<\/p>\n<figure id=\"attachment_2787\" aria-describedby=\"caption-attachment-2787\" style=\"width: 1150px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x.png\" alt=\"A git workflow model\" width=\"1150\" height=\"1524\" class=\"size-full wp-image-2787\" srcset=\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x.png 1150w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-113x150.png 113w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-226x300.png 226w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-768x1018.png 768w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-773x1024.png 773w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-830x1100.png 830w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-230x305.png 230w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-350x464.png 350w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/git-model@2x-480x636.png 480w\" sizes=\"auto, (max-width: 1150px) 100vw, 1150px\" \/><figcaption id=\"caption-attachment-2787\" class=\"wp-caption-text\">A git workflow model<\/figcaption><\/figure>\n<p><strong>Summary<\/strong><\/p>\n<p>I create my Issue on my Gitlab project, open to branch from the issue, correct inside the branch,<br \/>\npush to dev, the CI\/CD deploy onto the dev platform, It fail because \"LIFE\", I correct inside the branch,<br \/>\npush to dev, version correctly functionnal on dev, merge from dev to master, deploy onto prod, THE END.<\/p>\n<p>So I wanted to be able to automatically publish version &amp; release.<br \/>\nWhy ? Because I'm lazy. A computer guy is often lazy.<\/p>\n<p>I want to code and not have to trouble myself to search the last version<br \/>\nnumber, tag the commit on dev and \"et cetera\" on master.<\/p>\n<p>It's here that semantic-release software seemed like a good idea,<br \/>\nfor a description, here's their Github: <a href=\"https:\/\/github.com\/semantic-release\/semantic-release\">https:\/\/github.com\/semantic-release\/semantic-release<\/a><\/p>\n<h1>How it will works<\/h1>\n<p>I will use Angular syntax when publishing my commit,<br \/>\na CI\/CD to launch semantic release with will then detect the commit and create<br \/>\nthe tag &amp; release with all the previous commits.<\/p>\n<p>In details<\/p>\n<h2>.releaserc.json<\/h2>\n<pre><code class=\"language-json\">{\n  \"plugins\": [\n    [\"@semantic-release\/commit-analyzer\", {\n      \"preset\": \"angular\",\n      \"releaseRules\": [\n        {\"type\": \"docs\", \"scope\":\"README\", \"release\": \"patch\"},\n        {\"type\": \"feat\", \"scope\":\"progress\", \"release\": \"patch\"},\n        {\"type\": \"feat\", \"scope\":\"validated\", \"release\": \"minor\"}\n      ],\n      \"parserOpts\": {\n        \"noteKeywords\": [\"BREAKING CHANGE\", \"BREAKING CHANGES\"]\n      }\n    }],\n    \"@semantic-release\/release-notes-generator\",\n    [\"@semantic-release\/changelog\", {\n      \"changelogFile\": \"CHANGELOG.md\"\n    }],\n    [\"@semantic-release\/git\", {\n      \"assets\": [\"CHANGELOG.md\"],\n      \"message\": \"chore(release): ${nextRelease.version}nn${nextRelease.notes}\"\n     }],\n    \"@semantic-release\/gitlab\"\n  ],\n  \"branches\": [\n      \"master\",\n          \"+([0-9])?(.{+([0-9]),x}).x\",\n      { \"name\": \"dev\", \"prerelease\": \"dev\"}\n  ]\n}\n<\/code><\/pre>\n<p><strong>\/! Start Warning<\/strong><\/p>\n<p>The part with semantic-release\/changelog &amp; semantic-release\/git allows me to update automatically the<br \/>\nCHANGELOG.md and push it to my git repo.<\/p>\n<p>I also noted it generate conflict due to using pre-release branch, so I do not advise to use the CHANGELOG at the same times<br \/>\nthat the pre-release option.<\/p>\n<p>Please note that I had to redefine the  \"message\" because semantic-release\/git use by default \"[skip-ci]\" in the message,<br \/>\nWhich, alas, blocked my deploy CI\/CD. I'm currently asking if there is a better way to do this in https:\/\/github.com\/semantic-release\/git\/issues\/201<br \/>\nlet's see if I can improve it again \ud83d\ude42<\/p>\n<p><strong>\/! End Warning<\/strong><\/p>\n<p>I redefined the releaseRules because i'm still not fluent with Angular default rules.<br \/>\nI'll update it based on my daily needs, I advise you to start with standard (remove releaseRules)<br \/>\nand adapt to your needs.<\/p>\n<h2>.release-ci.yml<\/h2>\n<pre><code class=\"language-yaml\">release:\n  image: node:12\n  stage: release\n  only:\n    refs:\n    - master\n    - dev\n    # This matches maintenance branches\n    - \/^(([0-9]+).)?([0-9]+).x\/\n    # This matches pre-releases\n    - \/^([0-9]+).([0-9]+).([0-9]+)(?:-([0-9A-Za-z-]+(?:.[0-9A-Za-z-]+)*))?(?:+[0-9A-Za-z-]+)?$\/ \n  script:\n    - npm install @semantic-release\/gitlab\n    - npm install @semantic-release\/git\n    - npm install @semantic-release\/changelog\n    - npx semantic-release --debug\n<\/code><\/pre>\n<p>The CI\/CD will automatically install all the deps and work only on main branches.<br \/>\nI needed to fix the node version to node:12 due to it not working on node:12.<\/p>\n<h2>.gitlab-ci.yml<\/h2>\n<p>And then the Gitlab CI.<\/p>\n<pre><code class=\"language-yaml\">include:\n  - local: '.release-ci.yml'\n\nstages:\n  - release\n<\/code><\/pre>\n<h1>Commit linting<\/h1>\n<p>In order to use correct commit syntax I also defined a commit linting hook like the following.<\/p>\n<h2>.pre-commit-config.yaml<\/h2>\n<pre><code class=\"language-yaml\">-   repo: https:\/\/github.com\/jorisroovers\/gitlint\n    rev:  v0.13.1\n    hooks:\n    -   id: gitlint\n        stages: [commit-msg]\n<\/code><\/pre>\n<p>It's installed to interact on commit, following the official documentation, you will need to install it like:<br \/>\n<code>pre-commit install --hook-type commit-msg<\/code><\/p>\n<p>Please note that I used specifically gitlint because it's in Python, so you can search for the<br \/>\nequivalent in your project language, maybe it exist, example: Node => commitlint.<\/p>\n<p>Don't forget to add the dependence in your requirements-dev.txt<br \/>\nand here you go.<\/p>\n<figure id=\"attachment_2788\" aria-describedby=\"caption-attachment-2788\" style=\"width: 507px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/example_release.png\" alt=\"example_release\" width=\"507\" height=\"751\" class=\"size-full wp-image-2788\" srcset=\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/example_release.png 507w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/example_release-101x150.png 101w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/example_release-203x300.png 203w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/example_release-230x341.png 230w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/example_release-350x518.png 350w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/example_release-480x711.png 480w\" sizes=\"auto, (max-width: 507px) 100vw, 507px\" \/><figcaption id=\"caption-attachment-2788\" class=\"wp-caption-text\">Example of release tagging<\/figcaption><\/figure>\n<figure id=\"attachment_2789\" aria-describedby=\"caption-attachment-2789\" style=\"width: 791px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples.png\" alt=\"commit done with semantic release\" width=\"791\" height=\"563\" class=\"size-full wp-image-2789\" srcset=\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples.png 791w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples-150x107.png 150w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples-300x214.png 300w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples-768x547.png 768w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples-230x164.png 230w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples-350x249.png 350w, https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/commit_examples-480x342.png 480w\" sizes=\"auto, (max-width: 791px) 100vw, 791px\" \/><figcaption id=\"caption-attachment-2789\" class=\"wp-caption-text\">The example of commit done by semantic release<\/figcaption><\/figure>\n<\/div>\n<\/div><\/div><\/div><div id=\"panel-2785-0-0-1\" class=\"so-panel widget panel-last-child\" data-index=\"1\" ><div style=\"text-align: left;\" data-title-color=\"#443f3f\" data-headings-color=\"#443f3f\" class=\"panel-widget-style panel-widget-style-for-2785-0-0-1\" ><\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Introduction Still continuing the series of Gitlab CIs &amp; Automations, The current article will describe how to automate versions &amp; Releases publishing [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2791,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[245],"tags":[252,241,254,240,242,246,251,250,253],"class_list":["post-2785","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","tag-automation","tag-cd","tag-changelog","tag-ci","tag-gitlab","tag-python","tag-release","tag-semantic","tag-version"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Gitlab CI - Automate Versions &amp; Releases - Aerian.fr<\/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.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gitlab CI - Automate Versions &amp; Releases - Aerian.fr\" \/>\n<meta property=\"og:description\" content=\"Introduction Still continuing the series of Gitlab CIs &amp; Automations, The current article will describe how to automate versions &amp; Releases publishing [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/\" \/>\n<meta property=\"og:site_name\" content=\"Aerian.fr\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-14T12:21:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-04-08T13:02:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png\" \/>\n\t<meta property=\"og:image:width\" content=\"400\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"42\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@LinceAerian\" \/>\n<meta name=\"twitter:site\" content=\"@LinceAerian\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"42\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/\"},\"author\":{\"name\":\"42\",\"@id\":\"https:\/\/www.aerian.fr\/#\/schema\/person\/622c3cefbea11a0be741137608b4bf8b\"},\"headline\":\"Gitlab CI &#8211; Automate Versions &#038; Releases\",\"datePublished\":\"2020-03-14T12:21:21+00:00\",\"dateModified\":\"2020-04-08T13:02:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/\"},\"wordCount\":530,\"publisher\":{\"@id\":\"https:\/\/www.aerian.fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png\",\"keywords\":[\"automation\",\"cd\",\"changelog\",\"ci\",\"gitlab\",\"python\",\"release\",\"semantic\",\"version\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/\",\"url\":\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/\",\"name\":\"Gitlab CI - Automate Versions & Releases - Aerian.fr\",\"isPartOf\":{\"@id\":\"https:\/\/www.aerian.fr\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png\",\"datePublished\":\"2020-03-14T12:21:21+00:00\",\"dateModified\":\"2020-04-08T13:02:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[[\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/\"]]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#primaryimage\",\"url\":\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png\",\"contentUrl\":\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png\",\"width\":400,\"height\":400,\"caption\":\"Logo of semantic release\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.aerian.fr\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"(English) Gitlab CI &#8211; Automate Versions &#038; Releases\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.aerian.fr\/en\/#website\",\"url\":\"https:\/\/www.aerian.fr\/en\/\",\"name\":\"Aerian.fr\",\"description\":\"Welcome to Aerian.fr\",\"publisher\":{\"@id\":\"https:\/\/www.aerian.fr\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.aerian.fr\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.aerian.fr\/en\/#organization\",\"name\":\"Aerian.fr\",\"url\":\"https:\/\/www.aerian.fr\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aerian.fr\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2012\/01\/logo.png\",\"contentUrl\":\"https:\/\/www.aerian.fr\/wp-content\/uploads\/2012\/01\/logo.png\",\"width\":667,\"height\":522,\"caption\":\"Aerian.fr\"},\"image\":{\"@id\":\"https:\/\/www.aerian.fr\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/LinceAerian\",\"https:\/\/www.linkedin.com\/in\/marleixmathieu\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.aerian.fr\/#\/schema\/person\/622c3cefbea11a0be741137608b4bf8b\",\"name\":\"42\",\"sameAs\":[\"http:\/\/www.aerian.fr\"],\"url\":\"https:\/\/www.aerian.fr\/en\/author\/lince\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gitlab CI - Automate Versions & Releases - Aerian.fr","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.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/","og_locale":"en_US","og_type":"article","og_title":"Gitlab CI - Automate Versions & Releases - Aerian.fr","og_description":"Introduction Still continuing the series of Gitlab CIs &amp; Automations, The current article will describe how to automate versions &amp; Releases publishing [&hellip;]","og_url":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/","og_site_name":"Aerian.fr","article_published_time":"2020-03-14T12:21:21+00:00","article_modified_time":"2020-04-08T13:02:00+00:00","og_image":[{"width":400,"height":400,"url":"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png","type":"image\/png"}],"author":"42","twitter_card":"summary_large_image","twitter_creator":"@LinceAerian","twitter_site":"@LinceAerian","twitter_misc":{"Written by":"42","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/#article","isPartOf":{"@id":"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/"},"author":{"name":"42","@id":"https:\/\/www.aerian.fr\/#\/schema\/person\/622c3cefbea11a0be741137608b4bf8b"},"headline":"Gitlab CI &#8211; Automate Versions &#038; Releases","datePublished":"2020-03-14T12:21:21+00:00","dateModified":"2020-04-08T13:02:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/"},"wordCount":530,"publisher":{"@id":"https:\/\/www.aerian.fr\/#organization"},"image":{"@id":"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png","keywords":["automation","cd","changelog","ci","gitlab","python","release","semantic","version"],"articleSection":["Programming"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/","url":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/","name":"Gitlab CI - Automate Versions & Releases - Aerian.fr","isPartOf":{"@id":"https:\/\/www.aerian.fr\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#primaryimage"},"image":{"@id":"https:\/\/www.aerian.fr\/english-gitlab-ci-automate-versions-releases\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png","datePublished":"2020-03-14T12:21:21+00:00","dateModified":"2020-04-08T13:02:00+00:00","breadcrumb":{"@id":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":[["https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/"]]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#primaryimage","url":"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png","contentUrl":"https:\/\/www.aerian.fr\/wp-content\/uploads\/2020\/03\/12867925.png","width":400,"height":400,"caption":"Logo of semantic release"},{"@type":"BreadcrumbList","@id":"https:\/\/www.aerian.fr\/en\/english-gitlab-ci-automate-versions-releases\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.aerian.fr\/en\/"},{"@type":"ListItem","position":2,"name":"(English) Gitlab CI &#8211; Automate Versions &#038; Releases"}]},{"@type":"WebSite","@id":"https:\/\/www.aerian.fr\/en\/#website","url":"https:\/\/www.aerian.fr\/en\/","name":"Aerian.fr","description":"Welcome to Aerian.fr","publisher":{"@id":"https:\/\/www.aerian.fr\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.aerian.fr\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.aerian.fr\/en\/#organization","name":"Aerian.fr","url":"https:\/\/www.aerian.fr\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aerian.fr\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.aerian.fr\/wp-content\/uploads\/2012\/01\/logo.png","contentUrl":"https:\/\/www.aerian.fr\/wp-content\/uploads\/2012\/01\/logo.png","width":667,"height":522,"caption":"Aerian.fr"},"image":{"@id":"https:\/\/www.aerian.fr\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/LinceAerian","https:\/\/www.linkedin.com\/in\/marleixmathieu"]},{"@type":"Person","@id":"https:\/\/www.aerian.fr\/#\/schema\/person\/622c3cefbea11a0be741137608b4bf8b","name":"42","sameAs":["http:\/\/www.aerian.fr"],"url":"https:\/\/www.aerian.fr\/en\/author\/lince\/"}]}},"_links":{"self":[{"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/posts\/2785","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/comments?post=2785"}],"version-history":[{"count":21,"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/posts\/2785\/revisions"}],"predecessor-version":[{"id":2901,"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/posts\/2785\/revisions\/2901"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/media\/2791"}],"wp:attachment":[{"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/media?parent=2785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/categories?post=2785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aerian.fr\/en\/wp-json\/wp\/v2\/tags?post=2785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}