From 4ded189586c8250c4cc093d1404640a126e4becd Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Fri, 27 Mar 2020 09:54:59 +0000
Subject: [PATCH] Run Surge builds on branches to automatically remove
 deployments

---
 .gitlab-ci.yml | 76 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 46 insertions(+), 30 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 06eab896e..f3c7a7ab4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,29 +4,31 @@ stages:
   - build
   - deploy
 
+# Prevent detached merge request pipelines
+# https://docs.gitlab.com/ee/ci/merge_request_pipelines/
+# Those do not run the environment on_stop jobs when MRs are closed/merged
+# or when branches get deleted, unlike branch pipelines.
+workflow:
+  rules:
+    - if: '$CI_MERGE_REQUEST_ID'
+      when: never
+    - when: always
+
 before_script:
   - npm ci
 
-.test:
-  stage: test
-  only:
-    # Default "only" + merge_requests
-    - branches
-    - tags
-    - merge_requests
-
 frontend-test:
-  extends: .test
+  stage: test
   script:
     - npm run test
 
 frontend-lint:
-  extends: .test
+  stage: test
   script:
     - npm run lint
 
 frontend-audit:
-  extends: .test
+  stage: test
   script:
     - npm audit --parseable
   allow_failure: true
@@ -45,11 +47,14 @@ frontend-audit:
   script:
     - npm run production
 
-frontend-build-mr:
+frontend-build-surge:
   extends: .build
 
-  only:
-    - merge_requests
+  # Only deploy branches on surge
+  rules:
+    - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "master"'
+      when: on_success
+    - when: never
 
   variables:
     # On merge requests we build using preprod to be able
@@ -60,46 +65,57 @@ frontend-build-mr:
 frontend-build:
   extends: .build
 
-  except:
-    - merge_requests
+  # Build only for master and tags
+  rules:
+    - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "master"'
+      when: never
+    - when: on_success
 
   variables:
     # On default branches we build using a relative API Url
     API_BASE_URL: /api/v1
 
-deploy-surge:
+.surge:
   stage: deploy
 
-  # Only deploy merge requests on surge
-  only:
-    - merge_requests
-
   environment:
     name: ${CI_COMMIT_REF_SLUG}
-    url: https://${CI_COMMIT_REF_SLUG}-teklia.surge.sh
-    on_stop: stop-surge
 
   before_script:
     - npm install -g surge
 
+deploy-surge:
+  extends: .surge
+
+  # Only deploy branches on surge
+  rules:
+    - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "master"'
+      when: on_success
+    - when: never
+
+  environment:
+    url: https://${CI_COMMIT_REF_SLUG}-teklia.surge.sh
+    on_stop: stop-surge
+
   script:
     - surge dist ${CI_ENVIRONMENT_URL}
 
 stop-surge:
-  stage: deploy
-  when: manual
+  extends: .surge
+
+  # Only deploy branches on surge
+  rules:
+    - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "master"'
+      when: manual
+      allow_failure: true
+    - when: never
 
   # Do not try to checkout the branch if it was deleted
   variables:
     GIT_STRATEGY: none
 
   environment:
-    name: ${CI_COMMIT_REF_SLUG}
-    url: https://${CI_COMMIT_REF_SLUG}-teklia.surge.sh
     action: stop
 
-  before_script:
-    - npm install -g surge
-
   script:
     - surge teardown ${CI_ENVIRONMENT_URL}
-- 
GitLab