image: alpine:latest

# Only run pipelines for pushes on branches
workflow:
  rules:
    - if: $CI_COMMIT_BRANCH

# We can't do variable substitution in a job and then also use that computed
# variable in the Environment URL of the same job, so we have to do the
# substitution in an earlier stage. All of this variable substitution is only
# required for projects in sub-groups because GitLab doesn't have a predefined
# variable that contains the project namespace relative to the root namespace.
#
# For example, if the project path is "/group/subgroup-1" then we need just the
# "/subgroup-1" portion because that is used in the Environment URL path, while
# the "/group" root namespace is used as the subdomain.
setup:
  stage: .pre
  tags:
    - docker
  script:
    - echo "ROOT_RELATIVE_NAMESPACE=${CI_PROJECT_NAMESPACE#$CI_PROJECT_ROOT_NAMESPACE}" >> build.env
  artifacts:
    reports:
      dotenv: build.env

# We can't deploy multiple different variants of GitLab Pages sites (e.g. one
# per branch), so we use this workaround instead. GitLab has a special browsable
# URL for job artifacts on public projects, and we can create an Environment
# that points to that URL so it's easy for devs to know what the current
# Environment URL for their branch is.
.deploy:
  stage: deploy
  tags:
    - docker
  before_script:
    - echo $CI_ENVIRONMENT_URL
    - echo $ROOT_RELATIVE_NAMESPACE
    - test "$ROOT_RELATIVE_NAMESPACE" == "${CI_PROJECT_NAMESPACE#$CI_PROJECT_ROOT_NAMESPACE}" || { echo "ROOT_RELATIVE_NAMESPACE is not set correctly" ; exit 1 ; }
  script:
    - sed -i
      -e "s|%%BRANCH%%|${CI_COMMIT_BRANCH}|g"
      -e "s|%%COMMIT_SHA%%|${CI_COMMIT_SHORT_SHA}|g"
      -e "s|%%COMMIT_TIMESTAMP%%|${CI_COMMIT_TIMESTAMP}|g"
      -e "s|%%JOB_ID%%|${CI_JOB_ID}|g"
      -e "s|%%JOB_TIMESTAMP%%|${CI_JOB_STARTED_AT}|g"
      -e "s|%%JOB_URL%%|${CI_JOB_URL}|g"
      -e "s|%%PROJECT_PATH%%|${CI_PROJECT_PATH}|g"
      -e "s|%%PROJECT_TITLE%%|${CI_PROJECT_TITLE}|g"
      -e "s|%%PROJECT_URL%%|${CI_PROJECT_URL}|g"
      src/*.html
    - mv src public
  artifacts:
    paths:
      - public/

# Deploy a review environment for any push to a branch that is not the default
# branch
review:
  extends: .deploy
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
  environment:
    name: "review $CI_COMMIT_BRANCH"
    url: "https://${CI_PROJECT_ROOT_NAMESPACE}.${CI_PAGES_DOMAIN}/-${ROOT_RELATIVE_NAMESPACE}/${CI_PROJECT_NAME}/-/jobs/$CI_JOB_ID/artifacts/public/index.html"

# Deploy to GitLab Pages for pushes on the default branch
pages:
  extends: .deploy
  rules:
    - if: $CI_COMMIT_BRANCH == 'custom-domain'

# Purge all of this site's URLs from the Cloudflare cache
create-purge-json:
  stage: deploy
  needs: ['pages']
  tags:
    - docker
  script:
    - >-
      echo -en "{\n  \"files\": [\n    \"$CI_PAGES_URL/\"" > purge.json;
      for d in $(find public/* -type d); do echo -en ",\n    \"$CI_PAGES_URL/${d#public/}/\"" >> purge.json; done;
      for f in $(find public -type f); do echo -en ",\n    \"$CI_PAGES_URL/${f#public/}\"" >> purge.json; done;
      echo -e "\n  ]\n}" >> purge.json
    - cat purge.json
  artifacts:
    paths:
      - purge.json

trigger-cache-purge:
  stage: .post
  trigger:
    include: purge-cache.gitlab-ci.yml
  variables:
    PARENT_PIPELINE_ID: $CI_PIPELINE_ID


# vi: set ts=2 sw=2 et ft=yaml: