From 3e1f4238a155f946e7371226b9d31c3eb2b22301 Mon Sep 17 00:00:00 2001
From: Roman <roman@jointech.org>
Date: Tue, 22 Mar 2022 12:41:12 +0100
Subject: [PATCH] Feat(gitlab-ci,docker,release-management): Run pipeline for
 docker and releases

- Add release stage to existing Gitlab pipeline
- Add docker build and push job
- Add create release job
---
 .gitlab-ci.yml | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index adf15dd..88e0f67 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,11 +3,20 @@ image: python:3.8-buster
 stages:
   - bundle
   - deploy
+  - release
 
 variables:
   API_ROOT_FILE: ./src/rest/swagger/swagger.yaml
   BUNDLED_JSON_FILE: ./public/api.json
 
+.release-rules: &release-rules
+  # rule to run job on a tag-reference which has the form number.number.number (semantic versioning)
+  # or number.number.number-text (semantic versioning + release-name)
+  # and where a Dockerfile exists
+  - if: $CI_COMMIT_TAG =~ /^\d+[.]\d+[.]\d+$/ || $CI_COMMIT_TAG =~ /^\d+[.]\d+[.]\d+[-]\S+$/
+    exists:
+      - Dockerfile
+
 cache:
   paths:
     - ./node_modules
@@ -56,3 +65,46 @@ pages:
     expire_in: 2 days
   only:
     - master
+
+docker-push:
+  # Use the official docker image.
+  image: docker:latest
+  stage: release
+  variables:
+    # the name of the image without version
+    AURA_IMAGE_NAME: "autoradio/engine-api"
+  services:
+    - docker:dind
+  before_script:
+    # default repo is docker.io (aka docker hub)
+    - docker login -u "$DOCKER_ID" -p "$DOCKER_HUB_AUTH"
+  script:
+    # every commit on main branch should build image as unstable
+    # else it is from a tag (enforced by gitlab-ci rules)
+    # hint: tags are references independent of branches
+    - |
+      if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]
+        then docker build -t $AURA_IMAGE_NAME:unstable .
+        else docker build -t $AURA_IMAGE_NAME -t $AURA_IMAGE_NAME:$CI_COMMIT_TAG .
+      fi
+    - docker push "$AURA_IMAGE_NAME" --all-tags
+  rules: 
+    - *release-rules
+    # every commit on master/main branch should trigger a push to docker-hub as unstable without a release
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 
+      exists:
+        - Dockerfile
+
+release_job:
+  stage: release
+  needs: 
+    - docker-push
+  image: registry.gitlab.com/gitlab-org/release-cli:latest
+  rules: *release-rules
+  script:
+    - echo "this will be a release when there is a tag, but tags should be protected to be only createable by maintainers."
+  release:
+    name: 'Release $CI_COMMIT_TAG'
+    description: ./CHANGELOG
+    tag_name: '$CI_COMMIT_TAG'
+    ref: '$CI_COMMIT_TAG'
-- 
GitLab