workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: always
    - if: >-
        $CI_PIPELINE_SOURCE == "push"
        && ($CI_COMMIT_BRANCH == "staging" || $CI_COMMIT_BRANCH == "master")
      when: always
    - when: never

variables:
  DOCKER_VERSION: '20.10.12'
  K8S_NAMESPACE: 'devops-s22-deployable'
  CONTAINER_TAG: '${CI_REGISTRY_IMAGE}:${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}'

stages:
  - test
  - build
  - deploy

job_test-image:
  stage: test
  tags:
    - docker-priviliged
  image: docker:$DOCKER_VERSION
  services:
    - name: docker:$DOCKER_VERSION-dind
  script:
    - docker build
      --tag "${CONTAINER_TAG}-test"
      --target=test
      "./"
  after_script:
    - docker image rm --force "${CI_REGISTRY_IMAGE}:${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}"

job_build-image:
  stage: build
  needs:
    - 'job_test-image'
  rules:
    - if: $CI_COMMIT_BRANCH != "staging" && $CI_COMMIT_BRANCH != "master"
      when: 'never'
  tags:
    - docker-priviliged
  image: docker:$DOCKER_VERSION
  services:
    - name: docker:$DOCKER_VERSION-dind
  script:
    - SERVER_PUBLIC_URL=""
    - DB_HOST=""
    - docker build
      --tag "${CONTAINER_TAG}"
      --build-arg JWT_SECRET=${JWT_SECRET}
      --build-arg SERVER_PUBLIC_URL=${SERVER_PUBLIC_URL}
      --build-arg DB_HOST=${DB_HOST}
      "./"
    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
    - docker push "${CI_REGISTRY_IMAGE}:${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}"
  after_script:
    - docker image rm --force "${CI_REGISTRY_IMAGE}:${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}"

job_deploy-image:
  stage: deploy
  needs:
    - 'job_build-image'
  rules:
    - if: $CI_COMMIT_REF_NAME =~ /staging/
      when: 'always'
      variables:
        ENVIRONMENT_NAME: 'staging'
    - if: $CI_COMMIT_REF_NAME !~ /staging/
      when: 'always'
      variables:
        ENVIRONMENT_NAME: 'prod'
  tags:
    - docker
  image:
    name: k8s-image
    entrypoint: ['']
  script:
    # - IMAGE="${CI_REGISTRY_IMAGE}:${VERSION}"
    - kubectl apply
        --kubeconfig ${SECRET_KUBECONFIG_PATH}
        --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}"
        --kustomize -