variables:
  DOCKER_TLS_CERTDIR: "" # HACK: see https://gitlab.com/gitlab-org/gitlab-runner/issues/4501

stages:
  - build
  - deploy
  - setup

.be-build-job:
  variables:
    IMAGE_NAME: $CI_REGISTRY_IMAGE/backend
  stage: build
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN https://$CI_REGISTRY
  script:
    - >
      docker build
      --rm --no-cache
      --target production
      --tag=$IMAGE_NAME:${CI_COMMIT_SHA}
      --tag=$IMAGE_NAME:${CI_COMMIT_REF_NAME}
      backend
    - docker image push --all-tags $IMAGE_NAME
  only:
    - main

.be-deploy-job:
  variables:
    KUBECTL_VERSION: v1.8.10
    IMAGE_NAME: $CI_REGISTRY_IMAGE/backend

  stage: deploy
  tags:
    - commul
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - wget https://storage.googleapis.com/kubernetes-release/release/$KUBECTL_VERSION/bin/linux/amd64/kubectl
    # NOTE: version is too ald and don't have sha256 available
    #- wget https://dl.k8s.io/release/$KUBECTL_VERSION/bin/linux/amd64/kubectl.sha256
    # - echo "$(<kubectl.sha256)  kubectl" | sha256sum --check
    - mv kubectl /usr/bin/ && chmod +x /usr/bin/kubectl
    - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN https://$CI_REGISTRY
  script:
    - kubectl version --client
    - echo YAY!
    - docker pull ${IMAGE_NAME}:main
    #- kubectl --namespace kommul-dev set image deployment/merlin browser=${CONTAINER_IMAGE}:${CI_COMMIT_SHA}
  only:
    - main

.be-setup-job:
  image: node:16-alpine
  stage: setup
  cache:
    - key:
        files:
          - backend/package-lock.json
      paths:
        - backend/node_modules
  script:
    # TODO: drop python once we stop using sqlite3 in CI (soon, please)
    - apk add --update python2 build-base
    - cd backend
    - npm install
    - echo Success!

.fe-setup-job:
  image: node:16-alpine
  stage: setup
  cache:
    - key:
        files:
          - frontend/package-lock.json
      paths:
        - frontend/node_modules
  script:
    - cd frontend
    - npm install
    - echo Success!

.fe-deploy-job:
  variables:
    GLIBC_URL: https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk
    BUTLER_URL: https://broth.itch.ovh/butler/linux-amd64/LATEST/archive/default
    # NOTE: this key is a throwaway, we'll store one in secrets
    BUTLER_API_KEY: 0UsKHAvtO2aXBJMPeR6bZHxSv9BRQ0zIvFPdFdRW
  image: node:16-alpine
  stage: deploy
  cache:
    - key:
        files:
          - frontend/package-lock.json
      paths:
        - frontend/node_modules
  before_script:
    - "#=[ install tools ]====================="
    # NOTE: Alpine Linux stuff if linked with muslc. Butler is linked with glibc, and this causes an error -- see https://stackoverflow.com/a/66974607/6438061 for details. We need to install a compatibility layer: https://github.com/sgerrand/alpine-pkg-glibc#installing
    - "#-[ install glibc ]---------------------"
    - wget -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
    - wget -O glibc.apk $GLIBC_URL
    - apk add glibc.apk
    - rm glibc.apk
    - "#-[ install unzip ]---------------------"
    - apk add --no-cache unzip
    - "#-[ install butler ]--------------------"
    - wget -O butler.zip $BUTLER_URL
    - unzip butler.zip *.so -d /usr/local/lib
    - unzip butler.zip butler -d /usr/local/bin
    - chmod +x /usr/local/bin/butler
    - rm butler.zip
    - butler -V
    # NOTE: sometimes this fails with error `runtime/cgo: pthread_create failed: Operation not permitted` and I'm not sure why. A strict Docker's seccomp policy would explain this, but then why is it flaky?!
  script:
    - cd frontend
    - npm install
    - npm run build
    - butler push dist paolobrasolin/oetzi:html5
