From fe8bed7bbe8c90f12324a458d019267434128980 Mon Sep 17 00:00:00 2001
From: Dave Long <dave@longwaveconsulting.com>
Date: Wed, 29 Nov 2023 23:33:02 +0000
Subject: [PATCH] Issue #3404487 by fjgarlin, catch: Run child jobs in
 sequence?

---
 .gitlab-ci.yml | 94 +++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 78 insertions(+), 16 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 718e0966c29b..c3fb2c3e749d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -113,13 +113,13 @@ default:
 .run-on-commit: &run-on-commit
   rules:
     - if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_ROOT_NAMESPACE == "project"
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
-      when: manual
-      allow_failure: true
 
 .run-daily: &run-daily
   rules:
     - if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_ROOT_NAMESPACE == "project" && $DAILY_TEST == "1"
+
+.run-on-mr: &run-on-mr
+  rules:
     - if: $CI_PIPELINE_SOURCE == "merge_request_event"
       when: manual
       allow_failure: true
@@ -132,11 +132,14 @@ default:
     _TARGET_DB: "mysql-8"
     PERFORMANCE_TEST: $PERFORMANCE_TEST
     OTEL_COLLECTOR: $OTEL_COLLECTOR
+  # Run on MR, schedule, push and performance test.
   rules:
     - if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_ROOT_NAMESPACE == "project"
+    - if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_ROOT_NAMESPACE == "project" && $DAILY_TEST == "1"
     - if: $CI_PIPELINE_SOURCE == "merge_request_event"
     - if: $PERFORMANCE_TEST == "1"
 
+# Special job for MRs for test-only checks.
 'DEFAULT: Test-only (PHP 8.2 MySQL 8)':
   <<: [ *default-stage, *with-composer ]
   when: manual
@@ -145,7 +148,6 @@ default:
     _TARGET_PHP: "8.2"
     _TARGET_DB: "mysql-8"
   rules:
-    - if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_ROOT_NAMESPACE == "project"
     - if: $CI_PIPELINE_SOURCE == "merge_request_event"
   trigger:
     # Rely on the status of the child pipeline.
@@ -153,73 +155,133 @@ default:
     include:
       - local: .gitlab-ci/pipeline-test-only.yml
 
-# Run on commit, or manually.
+# Main listing of jobs.
+# All of these are available on Merge Requests and also work as base jobs for
+# on-commit and daily jobs to extend from.
 'PHP 8.1 MySQL 5.7':
-  <<: [ *default-stage, *run-on-commit ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.1"
     _TARGET_DB: "mysql-5.7"
 
 'PHP 8.2 PostgreSQL 14.1':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.2"
     _TARGET_DB: "pgsql-14.1"
 
 'PHP 8.2 PostgreSQL 15':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.2"
     _TARGET_DB: "pgsql-15"
 
 'PHP 8.2 PostgreSQL 16':
-  <<: [ *default-stage, *run-on-commit ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.2"
     _TARGET_DB: "pgsql-16"
 
 'PHP 8.2 SQLite 3':
-  <<: [ *default-stage, *run-on-commit ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.2"
     _TARGET_DB: "sqlite-3"
 
 'PHP 8.3 MySQL 8':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.3"
     _TARGET_DB: "mysql-8"
 
 'PHP 8.3 PostgreSQL 16':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.3"
     _TARGET_DB: "pgsql-16"
 
 'PHP 8.3 SQLite 3':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.3"
     _TARGET_DB: "sqlite-3"
 
 'PHP 8.1 MariaDB 10.3.22':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.1"
     _TARGET_DB: "mariadb-10.3.22"
 
 'PHP 8.1 PostgreSQL 14.1':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.1"
     _TARGET_DB: "pgsql-14.1"
 
 'PHP 8.1 SQLite 3':
-  <<: [ *default-stage, *run-daily ]
+  <<: [ *default-stage, *run-on-mr ]
   variables:
     _TARGET_PHP: "8.1"
     _TARGET_DB: "sqlite-3"
 
+# Jobs running on commits.
+# The value set in the "needs" property will determine the order in the sequence.
+'[Commit] PHP 8.1 MySQL 5.7':
+  extends: 'PHP 8.1 MySQL 5.7'
+  needs: [ 'DEFAULT: PHP 8.2 MySQL 8' ]
+  <<: [ *run-on-commit ]
+
+'[Commit] PHP 8.2 PostgreSQL 16':
+  extends: 'PHP 8.2 PostgreSQL 16'
+  needs: [ '[Commit] PHP 8.1 MySQL 5.7' ]
+  <<: [ *run-on-commit ]
+
+'[Commit] PHP 8.2 SQLite 3':
+  extends: 'PHP 8.2 SQLite 3'
+  needs: [ '[Commit] PHP 8.2 PostgreSQL 16' ]
+  <<: [ *run-on-commit ]
+
+# Jobs running daily.
+# The value set in the "needs" property will determine the order in the sequence.
+'[Daily] PHP 8.2 PostgreSQL 14.1':
+  extends: 'PHP 8.2 PostgreSQL 14.1'
+  needs: [ 'DEFAULT: PHP 8.2 MySQL 8' ]
+  <<: [ *run-daily ]
+
+'[Daily] PHP 8.2 PostgreSQL 15':
+  extends: 'PHP 8.2 PostgreSQL 15'
+  needs: [ '[Daily] PHP 8.2 PostgreSQL 14.1' ]
+  <<: [ *run-daily ]
+
+'[Daily] PHP 8.3 MySQL 8':
+  extends: 'PHP 8.3 MySQL 8'
+  needs: [ '[Daily] PHP 8.2 PostgreSQL 15' ]
+  <<: [ *run-daily ]
+
+'[Daily] PHP 8.3 PostgreSQL 16':
+  extends: 'PHP 8.3 PostgreSQL 16'
+  needs: [ '[Daily] PHP 8.3 MySQL 8' ]
+  <<: [ *run-daily ]
+
+'[Daily] PHP 8.3 SQLite 3':
+  extends: 'PHP 8.3 SQLite 3'
+  needs: [ '[Daily] PHP 8.3 PostgreSQL 16' ]
+  <<: [ *run-daily ]
+
+'[Daily] PHP 8.1 MariaDB 10.3.22':
+  extends: 'PHP 8.1 MariaDB 10.3.22'
+  needs: [ '[Daily] PHP 8.3 SQLite 3' ]
+  <<: [ *run-daily ]
+
+'[Daily] PHP 8.1 PostgreSQL 14.1':
+  extends: 'PHP 8.1 PostgreSQL 14.1'
+  needs: [ '[Daily] PHP 8.1 MariaDB 10.3.22' ]
+  <<: [ *run-daily ]
+
+'[Daily] PHP 8.1 SQLite 3':
+  extends: 'PHP 8.1 SQLite 3'
+  needs: [ '[Daily] PHP 8.1 PostgreSQL 14.1' ]
+  <<: [ *run-daily ]
 
 ################
 # Build Jobs for linting
-- 
GitLab