################
# Drupal GitLabCI template
#
# Based off GitlabCI templates project: https://git.drupalcode.org/project/gitlab_templates
# Guide: https://www.drupal.org/docs/develop/git/using-gitlab-to-contribute-to-drupal/gitlab-ci
#
# With thanks to:
# - The GitLab Acceleration Initiative participants
# - DrupalSpoons
################

################
# Workflow
#
# Define conditions for when the pipeline will run.
#   For example:
#     * On commit
#     * On merge request
#     * On manual trigger
#     * etc.
# https://docs.gitlab.com/ee/ci/jobs/job_control.html#specify-when-jobs-run-with-rules
#
# Pipelines can also be configured to run on a schedule,though they still must meet the conditions defined in Workflow and Rules. This can be used, for example, to do nightly regression testing:
# https://gitlab.com/help/ci/pipelines/schedules
################

workflow:
  rules:
  # These 3 rules from https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml
    # Run on merge requests
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    # Run when called from an upstream pipeline https://docs.gitlab.com/ee/ci/pipelines/downstream_pipelines.html?tab=Multi-project+pipeline#use-rules-to-control-downstream-pipeline-jobs
    - if: $CI_PIPELINE_SOURCE == 'pipeline'
    # Run on commits.
    - if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_ROOT_NAMESPACE == "project"
    # The last rule above blocks manual and scheduled pipelines on non-default branch. The rule below allows them:
    - if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_ROOT_NAMESPACE == "project"
    # Run if triggered from Web using 'Run Pipelines'
    - if: $CI_PIPELINE_SOURCE == "web"
     # Run if triggered from WebIDE
    - if: $CI_PIPELINE_SOURCE == "webide"

################
# Variables
#
# Overriding variables
# - To override one or more of these variables, simply declare your own
#   variables keyword.
# - Keywords declared directly in .gitlab-ci.yml take precedence over include
#   files.
# - Documentation:  https://docs.gitlab.com/ee/ci/variables/
# - Predefined variables: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
#
################

variables:
  _CONFIG_DOCKERHUB_ROOT: "drupalci"
  _TARGET_PHP: "8.1"
  CONCURRENCY: 15
  GIT_DEPTH: "3"
  COMPOSER_ALLOW_SUPERUSER: 1

################
# Stages
#
# Each job is assigned to a stage, defining the order in which the jobs are executed.
# Jobs in the same stage run in parallel.
#
# If all jobs in a stage succeed, the pipeline will proceed to the next stage.
# If any job in the stage fails, the pipeline will exit early.
################

stages:
  ################
  # Code quality checks
  #
  # This stage includes any codebase validation that we want to perform
  # before running functional tests.
  ################
  - 🪄 Lint

  ################
  # Test
  #
  # The test phase actually executes the tests, as well as gathering results
  # and artifacts.
  ################
  - 🗜️ Test

#############
# Templates #
#############

.run-on-mr: &run-on-mr
  if: $CI_PIPELINE_SOURCE == "merge_request_event"

.run-on-mr-manual: &run-on-mr-manual
  if: $CI_PIPELINE_SOURCE == "merge_request_event"
  when: manual
  allow_failure: true

.run-on-commit: &run-on-commit
  if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_ROOT_NAMESPACE == "project"

.run-daily: &run-daily
  if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_ROOT_NAMESPACE == "project"

.default-stage: &default-stage
  stage: 🗜️ Test
  trigger:
    # Rely on the status of the child pipeline.
    strategy: depend
    include:
      - local: .gitlab-ci/pipeline.yml
  rules:
    - <<: *run-on-commit
    - <<: *run-on-mr-manual

################
# Jobs
#
# Jobs define what scripts are actually executed in each stage.
################

'🧹 PHP Compatibility checks (PHPCS)':
  stage: 🪄 Lint
  variables:
    PHPCS_PHP_VERSION: "5.6"
    KUBERNETES_CPU_REQUEST: "16"
  interruptible: true
  allow_failure: true
  retry:
    max: 2
    when:
      - unknown_failure
      - api_failure
      - stuck_or_timeout_failure
      - runner_system_failure
      - scheduler_failure
  image:
    name: $_CONFIG_DOCKERHUB_ROOT/php-$_TARGET_PHP-apache:production
  artifacts:
    expire_in: 6 mos
    paths:
      - phpcs-quality-report.json
    reports:
      codequality: phpcs-quality-report.json
  rules:
    - <<: *run-on-mr
  before_script:
    - echo "{}" > composer.json
    - composer config allow-plugins true -n
    - composer require --dev drupal/coder:^8.2@stable micheh/phpcs-gitlab phpcompatibility/php-compatibility dealerdirect/phpcodesniffer-composer-installer
    - export TARGET_BRANCH=${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}${CI_COMMIT_BRANCH}
  script:
    - git fetch -vn --depth=$GIT_DEPTH origin "+refs/heads/$TARGET_BRANCH:refs/heads/$TARGET_BRANCH"
    - export MODIFIED=`git diff --name-only refs/heads/$TARGET_BRANCH|while read r;do echo "$CI_PROJECT_DIR/$r";done|tr "\n" " "`
    - echo -e "$MODIFIED" | tr " " "\n"
    - echo "If this list contains more files than what you changed, then you need to rebase your branch."
    - vendor/bin/phpcs --basepath=$CI_PROJECT_DIR --report-\\Micheh\\PhpCodeSniffer\\Report\\Gitlab=phpcs-quality-report.json --report-full --report-summary --standard=PHPCompatibility --runtime-set testVersion $PHPCS_PHP_VERSION --extensions=php,module,inc,install,test,profile,theme $MODIFIED

# Default job.
'PHP 8.1 MySQL 5.7':
  <<: *default-stage
  variables:
    _TARGET_PHP: "8.1"
    _TARGET_DB: "mysql-5.7"
  rules:
    - <<: *run-on-commit
    - <<: *run-on-mr

'PHP 5.6 MySQL 5.5':
  <<: *default-stage
  variables:
    _TARGET_PHP: "5.6"
    _TARGET_DB: "mysql-5.5"

'PHP 7.2 MySQL 5.7':
  <<: *default-stage
  variables:
    _TARGET_PHP: "7.2"
    _TARGET_DB: "mysql-5.7"

'PHP 7.4 MySQL 5.7':
  <<: *default-stage
  variables:
    _TARGET_PHP: "7.4"
    _TARGET_DB: "mysql-5.7"

'PHP 8.0 MySQL 5.7':
  <<: *default-stage
  variables:
    _TARGET_PHP: "8.0"
    _TARGET_DB: "mysql-5.7"

'PHP 8.2 MySQL 8':
  <<: *default-stage
  variables:
    _TARGET_PHP: "8.2"
    _TARGET_DB: "mysql-8"

'PHP 7.4 PostgreSQL 9.5':
  <<: *default-stage
  variables:
    _TARGET_PHP: "7.4"
    _TARGET_DB: "pgsql-9.5"

'PHP 8.1 PostgreSQL 14.1':
  <<: *default-stage
  variables:
    _TARGET_PHP: "8.1"
    _TARGET_DB: "pgsql-14.1"

'PHP 7.4 SQLite 3.27.0':
  <<: *default-stage
  variables:
    _TARGET_PHP: "7.4"
    _TARGET_DB: "sqlite-3"

'PHP 8.1 MariaDB 10.3.22':
  <<: *default-stage
  variables:
   _TARGET_PHP: "8.1"
   _TARGET_DB: "mariadb-10.3.22"
