From 7b91e054d2c3fa854992cd4c394a64df6633da73 Mon Sep 17 00:00:00 2001
From: lukken <lukken@astron.nl>
Date: Tue, 10 May 2022 05:51:29 +0000
Subject: [PATCH] L2SS-752: Revert changes rule without detachached pipeline

Since the changes rule does not work without detached pipelines,
and all the image jobs are significantly slowing down builds,
we revert this change.

A needs dependency is added to further hint to Gitlab CI/CD what
the dependencies look like. Trial will show if this resolves
silent errors.
---
 .gitlab-ci.yml | 476 +++++++++++++++++++++----------------------------
 1 file changed, 202 insertions(+), 274 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index affcc9d32..9bef26bb1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -42,6 +42,12 @@ stages:
     - . bootstrap/etc/lofar20rc.sh || true
 ##    Allow docker image script to execute
 #    - chmod u+x $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh
+.base_docker_images_except:
+  extends: .base_docker_images
+  except:
+    refs:
+      - tags
+      - master
 .base_docker_store_images:
   extends: .base_docker_images
   script:
@@ -55,17 +61,15 @@ docker_store_images_master_tag:
       - master
 docker_store_images_changes:
   extends: .base_docker_store_images
-  rules:
-#   https://stackoverflow.com/questions/68955071/how-to-disable-detached-pipelines-in-gitlab
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  # This will spawn as detached pipeline but atleast ensures the changes rule
+  # works. See the following references
+  #  https://stackoverflow.com/questions/68955071/how-to-disable-detached-pipelines-in-gitlab
+  #  https://docs.gitlab.com/ee/ci/jobs/job_control.html#jobs-or-pipelines-run-unexpectedly-when-using-changes
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/.env
-      when: always
 docker_build_image_all:
   extends: .base_docker_images
   only:
@@ -106,56 +110,51 @@ docker_build_image_all:
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh hdbppts-cm latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh hdbppts-es latest
 docker_build_image_elk:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/elk.yml
       - docker-compose/elk/*
       - docker-compose/elk-configure-host/*
-      when: always
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh elk $tag
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh elk-configure-host $tag
 docker_build_image_lofar_device_base:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/lofar-device-base.yml
       - docker-compose/lofar-device-base/*
-      when: always
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh lofar-device-base $tag
+
+# This job template ensures the base image jobs have all run to completion
+# prior to executing the job that uses this template.
+.base_image_needs:
+  needs: [
+    'docker_build_image_lofar_device_base', 'docker_build_image_all',
+    'docker_store_images_changes', 'docker_store_images_master_tag'
+  ]
+
 docker_build_image_prometheus:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/prometheus.yml
       - docker-compose/prometheus/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh prometheus $tag
 docker_build_image_itango:
-  extends: .base_docker_images
+  extends: .base_docker_images_except
   only:
     refs:
       - merge_requests
@@ -166,396 +165,292 @@ docker_build_image_itango:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh itango $tag
 docker_build_image_grafana:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/grafana.yml
       - docker-compose/grafana/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh grafana $tag
 docker_build_image_jupyter:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/jupyter.yml
       - docker-compose/jupyter/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh jupyter $tag
 docker_build_image_apsct_sim:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/aspct-sim.yml
       - docker-compose/pypcc-sim-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh apsct-sim $tag
 docker_build_image_apspu_sim:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/apspu-sim.yml
       - docker-compose/pypcc-sim-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh apspu-sim $tag
 docker_build_image_recv_sim:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/recv-sim.yml
       - docker-compose/pypcc-sim-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh recv-sim $tag
 docker_build_image_sdptr_sim:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/sdptr-sim.yml
       - docker-compose/sdptr-sim/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh sdptr-sim $tag
 docker_build_image_unb2_sim:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/unb2-sim.yml
       - docker-compose/pypcc-sim-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh unb2-sim $tag
 docker_build_image_device_apsct:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-aspct.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-aspct $tag
 docker_build_image_device_apspu:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-apspu.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-apspu $tag
 docker_build_image_device_pdu:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-pdu.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-pdu $tag
 docker_build_image_device_tilebeam:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-tilebeam.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-tilebeam $tag
 docker_build_image_device_beamlet:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-beamlet.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-beamlet $tag
 docker_build_image_device_digitalbeam:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-digitalbeam.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-digitalbeam $tag
 docker_build_image_device_boot:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-boot.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-boot $tag
 docker_build_image_device_docker:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-docker.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-docker $tag
 docker_build_image_device_observation_control:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-observation_control.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-observation_control $tag
 docker_build_image_device_antennafield:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-antennafield.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-antennafield $tag
 docker_build_image_device_recv:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-recv.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-recv $tag
 docker_build_image_device_sdp:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-sdp.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-sdp $tag
 docker_build_image_device_sst:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-sst.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-sst $tag
 docker_build_image_device_unb2:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-unb2.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-unb2 $tag
 docker_build_image_device_xst:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/device-xst.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-xst $tag
 docker_build_image_device_temperature_manager:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
       - docker-compose/device-temperature-manager.yml
       - docker-compose/lofar-device-base/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-temperature-manager $tag
 docker_build_image_archiver_timescale:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/archiver-timescale.yml
       - docker-compose/timescaledb/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh archiver-timescale $tag
 docker_build_image_hdbppts_cm:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/archiver-timescale.yml
       - docker-compose/tango-archiver-ts/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh hdbppts-cm $tag
 docker_build_image_hdbppts_es:
-  extends: .base_docker_images
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_COMMIT_TAG != null'
-      when: never
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-      when: never
-    - changes:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
       - docker-compose/archiver-timescale.yml
       - docker-compose/tango-archiver-ts/*
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh hdbppts-es $tag
 newline_at_eof:
+  extends: .base_image_needs
   stage: linting
   before_script:
     - pip3 install -r tangostationcontrol/test-requirements.txt
@@ -563,6 +458,7 @@ newline_at_eof:
 #     TODO(Corne): Ignore shell files in submodules more cleanly
     - flake8 --filename *.sh,*.conf,*.md,*.yml --select=W292 --exclude docker-compose/tango-prometheus-exporter,.tox,.egg-info,docker
 python_linting:
+  extends: .base_image_needs
   stage: linting
   before_script:
     - sudo apt-get update
@@ -571,6 +467,7 @@ python_linting:
     - cd tangostationcontrol
     - tox -e pep8
 bandit:
+  extends: .base_image_needs
   stage: static-analysis
   before_script:
     - sudo apt-get update
@@ -579,6 +476,7 @@ bandit:
     - cd tangostationcontrol
     - tox -e bandit
 xenon:
+  extends: .base_image_needs
   stage: static-analysis
   allow_failure: true
   before_script:
@@ -588,6 +486,7 @@ xenon:
    - cd tangostationcontrol
    - tox -e xenon
 shellcheck:
+  extends: .base_image_needs
   stage: static-analysis
   before_script:
     - sudo apt-get update
@@ -596,6 +495,7 @@ shellcheck:
 #     TODO(Corne): Ignore shell files in submodules
     - shellcheck **/*.sh
 sphinx-documentation:
+  extends: .base_image_needs
   stage: documentation
   before_script:
     - sudo apt-get update
@@ -607,6 +507,7 @@ sphinx-documentation:
     paths:
       - tangostationcontrol/docs/build/
 unit_test:
+  extends: .base_image_needs
   stage: unit-tests
   before_script:
     - sudo apt-get update
@@ -624,6 +525,32 @@ integration_test_docker:
   image: docker:latest
   tags:
     - privileged
+  needs: [
+    'docker_build_image_lofar_device_base', 'docker_build_image_all',
+    'docker_store_images_changes', 'docker_store_images_master_tag',
+
+    'docker_build_image_elk', 'docker_build_image_prometheus',
+    'docker_build_image_itango', 'docker_build_image_grafana',
+    'docker_build_image_jupyter',
+
+    'docker_build_image_apsct_sim', 'docker_build_image_apspu_sim',
+    'docker_build_image_recv_sim', 'docker_build_image_sdptr_sim',
+    'docker_build_image_unb2_sim',
+
+    'docker_build_image_device_apsct', 'docker_build_image_device_apspu',
+    'docker_build_image_device_pdu', 'docker_build_image_device_tilebeam',
+    'docker_build_image_device_beamlet',
+    'docker_build_image_device_digitalbeam', 'docker_build_image_device_boot',
+    'docker_build_image_device_docker',
+    'docker_build_image_device_observation_control',
+    'docker_build_image_device_antennafield', 'docker_build_image_device_recv',
+    'docker_build_image_device_sdp', 'docker_build_image_device_sst',
+    'docker_build_image_device_unb2', 'docker_build_image_device_xst',
+    'docker_build_image_device_temperature_manager',
+
+    'docker_build_image_archiver_timescale', 'docker_build_image_hdbppts_cm',
+    'docker_build_image_hdbppts_es'
+  ]
   services:
     - name: docker:dind
   variables:
@@ -670,6 +597,7 @@ integration_test_docker:
       done
       PGPASSWORD=password pg_dump --host=docker --username=postgres hdb 2>log/archiver-timescale-dump.log | gzip > log/archiver-timescale-dump.txt.gz
 wheel_packaging:
+  extends: .base_image_needs
   stage: packaging
   artifacts:
     paths:
-- 
GitLab