variables:
  PHP_MAJOR_VERSION: 7
  PHP_MINOR_VERSION: 4

stages:
  - validation
  - buildprod
  - build
  - prepare
  - test
  - deploy

.wait:
  script:
    - while [ ! -f /tmp/foo.txt ]; do echo "waiting..."; sleep 1; done

.cache_paths: &cache_paths
  paths:
    - .docker-init/
    - assets/
    - config/
    - drush/
    - files/
    - settings/
    - vendor/
    - web/core/
    - web/libraries/
    - web/modules/contrib/
    - web/profiles/contrib/
    - web/sites/
    - web/themes/contrib/
    - .ahoy.yml
    - .env
    - docker-compose.yml

.artifact_paths_prod: &artifact_paths_prod
  paths:
    - config/
    - drush/
    - vendor/
    - web/
    - composer.json
    - composer.lock

.artifact_paths: &artifact_paths
  paths:
    - .docker-init/
    - assets/
    - config/
    - drush/
    - files/
    - settings/
    - tests/
    - vendor/
    - web/
    - .ahoy.yml
    - .env
    - composer.*
    - docker-compose.yml

.cache_default: &cache_default
  key: build-${COMPOSE_PROJECT_NAME}
  <<: *cache_paths

.cache_prod: &cache_prod
  key: build-prod-${COMPOSE_PROJECT_NAME}
  <<: *cache_paths

.prerequisites:
  stage: validation
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script: |
    DBREQUIRED="no"
    if [[ "$CI_COMMIT_REF_NAME" == "master" ]]; then
      DBREQUIRED="yes"
    elif [[ "$CI_COMMIT_MESSAGE" == *"[PULL_DB]"* ]]; then
      DBREQUIRED="yes"
    elif [[ "$PULL_DB" == "yes" ]]; then
      DBREQUIRED="yes"
    else
      ID=$(docker container ls --all -q -f name=^${COMPOSE_PROJECT_NAME}_mariadb_1$)
      if [[ ! -n ${ID} ]]; then
        DBREQUIRED="yes"
      else
        TABLES=$(docker exec -i ${COMPOSE_PROJECT_NAME}_mariadb_1 mysql -u drupal --password=drupal -e "show tables;" drupal)
        if [[ "${TABLES}" != *"users_data"* ]]; then
          DBREQUIRED="yes"
        fi
      fi
    fi
    echo "DBREQUIRED=${DBREQUIRED}" >> validation.env
    if [[ "$DBREQUIRED" == "yes" ]]; then
      echo "DB needs to be pulled."
    else
      echo "No pulling required."
    fi

    INITIALINSTALL="no"
    if [[ "$CI_COMMIT_MESSAGE" == *"[INITIAL_INSTALL]"* ]]; then
      INITIALINSTALL="yes"
    elif [[ "$INITIAL_INSTALL" == "yes" ]]; then
      INITIALINSTALL="yes"
    fi
    echo "INITIALINSTALL=${INITIALINSTALL}" >> validation.env

    RESETLOCALE="no"
    if [[ "$CI_COMMIT_MESSAGE" == *"[RESET_LOCALE]"* ]]; then
      RESETLOCALE="yes"
    elif [[ "$RESET_LOCALE" == "yes" ]]; then
      RESETLOCALE="yes"
    fi
    echo "RESETLOCALE=${RESETLOCALE}" >> validation.env
  except:
    variables:
      - $CAE
      - $DISABLE_CI_TESTS
  artifacts:
    reports:
      dotenv: validation.env

.build-prod:
  stage: buildprod
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  cache:
    <<: *cache_prod
    policy: pull-push
  script: |
    if [[ -n $SSH_PRIVATE_KEY ]]; then
      eval $(ssh-agent -s)
      echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
      mkdir -p ~/.ssh
      chmod 700 ~/.ssh
      ssh-keyscan gitlab.lakedrops.com >> ~/.ssh/known_hosts
      chmod 644 ~/.ssh/known_hosts
      ssh git@gitlab.lakedrops.com
    fi
    if [[ -n $DOWNGRADE_COMPOSER ]]; then
      composer self-update --$DOWNGRADE_COMPOSER;
    fi
    if [[ -n $GITLAB_ACCESS_TOKEN ]]; then
      composer config -g gitlab-token.gitlab.lakedrops.com $GITLAB_ACCESS_TOKEN;
    fi
    composer install --no-interaction --no-progress --no-dev
  artifacts:
    name: build-prod
    when: always
    <<: *artifact_paths_prod
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE

.build:
  stage: build
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  cache:
    <<: *cache_default
    policy: pull-push
  script: |
    if [[ -n $SSH_PRIVATE_KEY ]]; then
      eval $(ssh-agent -s)
      echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
      mkdir -p ~/.ssh
      chmod 700 ~/.ssh
      ssh-keyscan gitlab.lakedrops.com >> ~/.ssh/known_hosts
      chmod 644 ~/.ssh/known_hosts
      ssh git@gitlab.lakedrops.com
    fi
    if [[ -n $DOWNGRADE_COMPOSER ]]; then
      composer self-update --$DOWNGRADE_COMPOSER;
    fi
    if [[ -n $GITLAB_ACCESS_TOKEN ]]; then
      composer config -g gitlab-token.gitlab.lakedrops.com $GITLAB_ACCESS_TOKEN;
    fi
    composer install --no-interaction --no-progress
    composer lakedrops:scaffold --no-interaction
    composer lakedrops:docker4drupal --no-interaction
    docker-compose up -d
    composer lakedrops:behat --no-interaction
    mkdir -p files/default/files/css
    mkdir -p files/default/files/js
    mkdir -p files/default/files/languages
    mkdir -p files/default/files/translations
    chmod -R ugo+w files/default/files/
  artifacts:
    name: build
    when: always
    <<: *artifact_paths
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE

.dumpdb:
  stage: build
  tags:
    - ansible
  variables:
    GIT_STRATEGY: none
  script: |
    if [[ "$DBREQUIRED" == "yes" ]]; then
      if [[ "$INITIALINSTALL" == "no" ]]; then
        ascr drupal-dump-db ${CI_PROJECT_PATH} ${PWD}/${CI_PROJECT_NAME}.sql master
      fi
    fi
  cache: {}
  dependencies:
    - 'Validate Environment'
  artifacts:
    name: dbdump
    when: always
    paths:
      - ${CI_PROJECT_NAME}.sql
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE
      - $DISABLE_CI_TESTS

.importdb:
  stage: prepare
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script: |
    if [[ "$DBREQUIRED" == "yes" ]]; then
      if [[ "$INITIALINSTALL" == "no" ]]; then
        docker cp ${CI_PROJECT_NAME}.sql ${COMPOSE_PROJECT_NAME}_php_1:/var/www/html
        drush sql:drop --yes
        drush sql:query --file=../${CI_PROJECT_NAME}.sql
        drush cr
        drush updatedb
        drush config-import sync
        drush cr
      fi
    fi
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE
      - $DISABLE_CI_TESTS
  dependencies:
    - 'Validate Environment'
    - 'Build Site'
    - 'Download DB'

.updatedb:
  stage: prepare
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script: |
    if [[ "$DBREQUIRED" == "no" ]]; then
      if [[ "$INITIALINSTALL" == "no" ]]; then
        drush cr
        drush updatedb
        drush config-import sync
        drush cr
      fi
    fi
  except:
    refs:
      - master
      - tags
    variables:
      - $CAE
      - $DISABLE_CI_TESTS
  dependencies:
    - 'Validate Environment'
    - 'Build Site'

.theme:
  stage: prepare
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script:
    - docker run --name=${COMPOSE_PROJECT_NAME}_node -id -v $(php /usr/local/bin/volume.php) -w ${PWD} registry.lakedrops.com/docker/node:12-stretch-slim
    - docker exec ${COMPOSE_PROJECT_NAME}_node npm install --no-save
    - docker exec -e NODE_ENV=production ${COMPOSE_PROJECT_NAME}_node ./node_modules/gulp/bin/gulp.js sass
  after_script:
    - docker rm -f ${COMPOSE_PROJECT_NAME}_node
  artifacts:
    name: css
    when: always
    paths:
      - $THEME_CSS_PATH
  dependencies:
    - 'Build Site'
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE

.codestyle:
  stage: test
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script: |
    if [[ "$INITIALINSTALL" == "no" ]]; then
      # ahoy test phpcs -- -n --report=xml --report-file=phpcs.xml
      # docker cp ${COMPOSE_PROJECT_NAME}_php_1:/var/www/html/phpcs.xml ./phpcs.xml
      echo "Disabled because of Drupal Coder issues" > ./phpcs.xml
    fi
  artifacts:
    name: phpcs
    when: always
    paths:
      - phpcs.xml
  dependencies:
    - 'Validate Environment'
    - 'Build Site'
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE
      - $DISABLE_CI_TESTS
      - $DISABLE_CI_TEST_CODESTYLE

.phpunit:
  stage: test
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script: |
    if [[ "$INITIALINSTALL" == "no" ]]; then
      ahoy test phpunit -- --log-junit junit.xml --testdox-html testdox.html
    fi
  after_script:
    - docker cp ${COMPOSE_PROJECT_NAME}_php_1:/var/www/html/junit.xml ./junit.xml
    - docker cp ${COMPOSE_PROJECT_NAME}_php_1:/var/www/html/testdox.html ./testdox.html
  artifacts:
    name: phpunit
    when: always
    paths:
      - junit.xml
      - testdox.html
    reports:
      junit: junit.xml
  dependencies:
    - 'Validate Environment'
    - 'Build Site'
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE
      - $DISABLE_CI_TESTS
      - $DISABLE_CI_TEST_PHPUNIT

.behat:
  stage: test
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script: |
    if [[ "$INITIALINSTALL" == "no" ]]; then
      ahoy behat update
      ahoy behat test2xml
    fi
  after_script:
    - docker cp ${COMPOSE_PROJECT_NAME}_php_1:/var/www/html/tests/output/default.xml ./behat.xml
  retry: 1
  artifacts:
    name: behat
    when: always
    paths:
      - behat.xml
  dependencies:
    - 'Validate Environment'
    - 'Build Site'
    - 'Build Theme'
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE
      - $DISABLE_CI_TESTS
      - $DISABLE_CI_TEST_BEHAT

.backstop:
  stage: test
  tags:
    - default
  image: registry.lakedrops.com/docker/gitlab-drupal-ci:php-${PHP_MAJOR_VERSION}.${PHP_MINOR_VERSION}
  variables:
    GIT_STRATEGY: none
  script: |
    if [[ "$INITIALINSTALL" == "no" ]]; then
      backstop test
    fi
  artifacts:
    name: backstop
    when: always
    paths:
      - config/backstop_reference
      - tests/backstop/backstop_data
  dependencies:
    - 'Validate Environment'
    - 'Build Site'
    - 'Build Theme'
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE
      - $DISABLE_CI_TESTS
      - $DISABLE_CI_TEST_BACKSTOP

.deploy:
  stage: deploy
  tags:
    - ansible
  variables:
    GIT_STRATEGY: none
  environment:
    name: ${ENVIRONMENT_NAME}
    url: ${ENVIRONMENT_URL}
  script: |
    if [[ "$INITIALINSTALL" == "no" ]]; then
      ascr drupal-deploy $HOST_NAME $SITE_NAME --extra-vars="DRUPAL_ARTEFACT_SRC=${PWD}" ${CAE}
    else
      ascr drupal-config $HOST_NAME $SITE_NAME --extra-vars="DRUPAL_ARTEFACT_SRC=${PWD}" ${CAE}
    fi
  cache: {}
  dependencies:
    - 'Validate Environment'
    - 'Build Theme'
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE

.deployartefact:
  stage: deploy
  tags:
    - ansible
  variables:
    GIT_STRATEGY: none
  environment:
    name: ${ENVIRONMENT_NAME}
    url: ${ENVIRONMENT_URL}
  script: |
    if [[ "$INITIALINSTALL" == "no" ]]; then
      ascr drupal-deploy $HOST_NAME $SITE_NAME --extra-vars="DRUPAL_ARTEFACT_SRC=${PWD}" ${CAE}
    else
      ascr drupal-config $HOST_NAME $SITE_NAME --extra-vars="DRUPAL_ARTEFACT_SRC=${PWD}" ${CAE}
    fi
    if [[ "$RESETLOCALE" == "yes" ]]; then
      ascr drupal-reset-locale $HOST_NAME $SITE_NAME
    fi
  cache: {}
  dependencies:
    - 'Validate Environment'
    - 'Build Prod Site'
    - 'Build Theme'
  except:
    refs:
      - tags
    variables:
      - $CI_COMMIT_MESSAGE =~ /^Merge tag /i
      - $CAE