stages:
  - get chart
  - deploy rabbit
  - deploy storage
  - deploy GRB
  - deploy G2G
  - deploy WMS
  - deploy WMTS

variables:
  DOCKER_TLS_CERTDIR: ""
  DOCKER_HOST: "tcp://localhost:2375"
  DOCKER_DRIVER: overlay2
  HELM_EXPERIMENTAL_OCI: "1"
  CICHART_IMAGE: "$CI_REGISTRY_IMAGE/cichart:latest"


.docker_based_job:
  image: docker:19.03.1
  tags:
    - docker
    - kubernetes
  services:
    - docker:19.03.1-dind
  before_script:
    - docker info
    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}


.helm_based_job:
  extends: .docker_based_job
  image: $CICHART_IMAGE
  before_script:
    - docker info
    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
    - shopt -s expand_aliases
    - alias helm='docker run -t --rm -e HELM_EXPERIMENTAL_OCI="$HELM_EXPERIMENTAL_OCI" -v $(pwd):/apps -w /apps -v ~/.kube:/root/.kube -v ~/.helm:/root/.helm -v ~/.config/helm:/root/.config/helm -v ~/.cache/helm:/root/.cache/helm alpine/helm:3.2.3'
    - helm registry login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY}


build ci:
  stage: .pre
  extends: .docker_based_job
  script:
    - cd cichart
    - docker build --tag $CICHART_IMAGE .
    - docker push $CICHART_IMAGE
  rules:
    - changes:
        - cichart/Dockerfile
      when: always
    - if: $BUILD_CI_IMAGE
      when: always


.get_chart_tmpl:
  extends: .helm_based_job
  stage: get chart
  variables:
    SUBCOMP_REPOS_BASE: "https://gitlab.ssec.wisc.edu/cspp_geo/geosphere"
    # required:
    SUBCOMP_REPOS: ""
    SUBCOMP_CHART_DIR: ""
  script:
    - repos_url="${SUBCOMP_REPOS_BASE}/${SUBCOMP_REPOS}"
    - git clone --depth 1 $repos_url
    - cd ${SUBCOMP_REPOS}
    # most recent docker image should be tagged with most recent SHA
    - docker_tag=$(git rev-parse --short HEAD)
    - echo $docker_tag
    - cd chart
    # make the docker tag available in later stages
    - echo export docker_tag=$docker_tag >${SUBCOMP_CHART_DIR}/cibuild.env
    - |-
      sed -i "s/^appVersion: .*\$/appVersion: ${docker_tag}/g" ${SUBCOMP_CHART_DIR}/Chart.yaml
    # debug:
    - helm template ${SUBCOMP_CHART_DIR} ${SUBCOMP_CHART_DIR}
  artifacts:
    paths:
      - ${SUBCOMP_REPOS}/chart/${SUBCOMP_CHART_DIR}
    expire_in: 6 hours
# XXX: Do we always want to clone the subcomponent
#  rules:
#    - if: '$GEOSPHERE_SUBCOMP == ""'
#      when: always
#    - if: '$GEOSPHERE_SUBCOMP == $SUBCOMP_NAME'
#      when: always
#    - when: never

get_chart_grb:
  extends: .get_chart_tmpl
  variables:
    SUBCOMP_REPOS: "geosphere-grb"
    SUBCOMP_CHART_DIR: "cspp-geo-grb"

# TODO: Use "environment: " to define a job for production and one for development
#       https://docs.gitlab.com/ee/ci/yaml/#environment
deploy_g16_grb:
  extends: .helm_based_job
  stage: deploy GRB
  script:
    - if [ -n "$CI_COMMIT_TAG" ]; then
        ns="geosphere";
      else
        ns="geosphere-test";
      fi
    - cd geosphere-grb/chart
    - source cibuild.env
    # copy secret kubeconfig to the mounted (pwd) directory
    - cp $kubekorner_k3s_config .
    - kubeconfig=$(basename $kubekorner_k3s_config)
    - echo "Deploying version $docker_tag to cluster namespace $ns"
    # copy extra values files to the local directory (where helm has access via docker mount)
    - cp ../../production/values-g16-grb.yaml .
    # namespace names are the same as domain names
    - helm upgrade -v 2 --install --kubeconfig $kubeconfig --namespace $ns --set grbNotifier.image.dockerTag=$docker_tag -f ../../production/values-g16-grb.yaml cspp-geo-grb cspp-geo-grb/
  needs:
    - job: get_chart_grb
      artifacts: true
  rules:
    - if: '$kubekorner_k3s_config == ""'
      when: never
    - when: on_success
