kind: pipeline
type: docker
name: server_build_and_test

trigger:
  branch:
    - main
  event:
    - push

steps:
  - name: build_server
    image: node
    commands:
      - npm ci
      - npm run build -w @calchat/shared
      - npm run build -w @calchat/server

  - name: jest_server
    image: node
    commands:
      - npm run test -w @calchat/server

---

kind: pipeline
type: docker
name: check_for_formatting

trigger:
  branch:
    - main
  event:
    - push

steps:
  - name: format_check
    image: node
    commands:
      - npm ci
      - npm run check_format

---

kind: pipeline
type: docker
name: deploy_latest

trigger:
  branch:
    - main
  event:
    - push

steps:
  - name: upload_latest
    image: plugins/docker
    settings:
      registry: gitea.gilmour109.de
      repo: gitea.gilmour109.de/gilmour109/calchat-server
      dockerfile: apps/server/docker/Dockerfile
      tags:
        - latest
        - ${DRONE_COMMIT_SHA:0:8}
      username:
        from_secret: gitea_username
      password:
        from_secret: gitea_password

  - name: deploy_to_vps
    image: appleboy/drone-ssh
    settings:
      host:
        - 10.0.0.1
      username: root
      password:
        from_secret: vps_ssh_password
      envs:
        - gitea_username
        - gitea_password
      port: 22
      command_timeout: 10m
      script:
        - docker login -u $GITEA_USERNAME -p $GITEA_PASSWORD gitea.gilmour109.de
        - docker pull gitea.gilmour109.de/gilmour109/calchat-server:latest
        - docker compose -f /root/calchat-mongo/docker-compose.yml up -d

  - name: deploy_test_backend
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      K3S_SSH_PASSWORD:
        from_secret: k3s_ssh_password
    commands:
      - export NAME=e2e$(echo $DRONE_COMMIT_SHA | head -c 8)
      - export TAG=$(echo $DRONE_COMMIT_SHA | head -c 8)
      - export COMMIT=$DRONE_COMMIT_SHA
      - envsubst < kubernetes/manifest.yml > /tmp/e2e-manifest.yml
      - sshpass -p "$K3S_SSH_PASSWORD" scp /tmp/e2e-manifest.yml debian@192.168.178.201:/tmp/e2e-manifest.yml
      - sshpass -p "$K3S_SSH_PASSWORD" ssh debian@192.168.178.201 "sudo kubectl apply -f /tmp/e2e-manifest.yml"
      - sshpass -p "$K3S_SSH_PASSWORD" ssh debian@192.168.178.201 "sudo kubectl wait --for=condition=available --timeout=120s deployment/calchat-server-$NAME"

  - name: create_e2e_vm
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
      TF_VAR_proxmox_password:
        from_secret: proxmox_password
      TF_VAR_clone_vm_password:
        from_secret: e2e_vm_password
      AWS_ACCESS_KEY_ID:
        from_secret: tofu_garage_access_key
      AWS_SECRET_ACCESS_KEY:
        from_secret: tofu_garage_secret_key
    commands:
      - cd tofu/e2e
      - tofu init
      - tofu apply -auto-approve

  - name: run_e2e_tests
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      E2E_VM_PASSWORD:
        from_secret: e2e_vm_password
    commands:
      - export VM_IP=192.168.178.$((211 + DRONE_BUILD_NUMBER % 44))
      - export RUN_ID=$(echo $DRONE_COMMIT_SHA | head -c 8)
      - export API_URL="http://e2e$${RUN_ID}.192.168.178.201.nip.io"
      - bash scripts/run-e2e.sh "$VM_IP" "$API_URL" "https://gitea.gilmour109.de/gilmour109/calchat.git" "$DRONE_COMMIT_SHA" "$E2E_VM_PASSWORD"

  - name: destroy_e2e_vm
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
      TF_VAR_proxmox_password:
        from_secret: proxmox_password
      TF_VAR_clone_vm_password:
        from_secret: e2e_vm_password
      AWS_ACCESS_KEY_ID:
        from_secret: tofu_garage_access_key
      AWS_SECRET_ACCESS_KEY:
        from_secret: tofu_garage_secret_key
    commands:
      - cd tofu/e2e
      - tofu init
      - tofu destroy -auto-approve
    when:
      status:
        - success
        - failure

  - name: cleanup_k3s
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      K3S_SSH_PASSWORD:
        from_secret: k3s_ssh_password
    commands:
      - export NAME=e2e$(echo $DRONE_COMMIT_SHA | head -c 8)
      - sshpass -p "$K3S_SSH_PASSWORD" ssh debian@192.168.178.201 "sudo kubectl delete all,ingress -l deploy-name=$NAME --ignore-not-found"
    when:
      status:
        - success
        - failure

  - name: build_apk
    image: gitea.gilmour109.de/gilmour109/eas-build:latest
    environment:
      EXPO_TOKEN:
        from_secret: expo_token
    commands:
      - npm ci
      - npm run build -w @calchat/shared
      - npm run -w @calchat/client build:apk
    when:
      status:
        - success

  - name: upload_apk
    image: plugins/s3
    settings:
      endpoint: https://garage.gilmour109.de
      bucket: calchat-releases
      access_key:
        from_secret: calchat_drone_garage_access_key
      secret_key:
        from_secret: calchat_drone_garage_secret_key
      source: apps/client/calchat.apk
      target: /
      region: garage
      path_style: true
    when:
      status:
        - success

depends_on:
  - server_build_and_test
  - check_for_formatting

---

kind: pipeline
type: docker
name: upload_tag

trigger:
  event:
    - tag

steps:
  - name: upload_tag
    image: plugins/docker
    settings:
      registry: gitea.gilmour109.de
      repo: gitea.gilmour109.de/gilmour109/calchat-server
      dockerfile: apps/server/docker/Dockerfile
      tags:
        - ${DRONE_TAG}
      username:
        from_secret: gitea_username
      password:
        from_secret: gitea_password

  - name: deploy_to_k3s
    image: appleboy/drone-ssh
    settings:
      host:
        - 192.168.178.201
      username: debian
      password:
        from_secret: k3s_ssh_password
      envs:
        - drone_tag
        - drone_commit_sha
      port: 22
      command_timeout: 10m
      script:
        - export TAG=$DRONE_TAG
        - export NAME=$(echo $DRONE_TAG | tr -d '.')
        - export COMMIT=$DRONE_COMMIT_SHA
        - envsubst < /home/debian/manifest.yml | sudo kubectl apply -f -

  - name: create_e2e_vm
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
      TF_VAR_proxmox_password:
        from_secret: proxmox_password
      TF_VAR_clone_vm_password:
        from_secret: e2e_vm_password
      AWS_ACCESS_KEY_ID:
        from_secret: tofu_garage_access_key
      AWS_SECRET_ACCESS_KEY:
        from_secret: tofu_garage_secret_key
    commands:
      - cd tofu/e2e
      - tofu init
      - tofu apply -auto-approve

  - name: run_e2e_tests
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      E2E_VM_PASSWORD:
        from_secret: e2e_vm_password
    commands:
      - export VM_IP=192.168.178.$((211 + DRONE_BUILD_NUMBER % 44))
      - export TAG_NAME=$(echo $DRONE_TAG | tr -d '.')
      - export API_URL="http://$${TAG_NAME}.192.168.178.201.nip.io"
      - bash scripts/run-e2e.sh "$VM_IP" "$API_URL" "https://gitea.gilmour109.de/gilmour109/calchat.git" "$DRONE_COMMIT_SHA" "$E2E_VM_PASSWORD"

  - name: notify_failure
    image: drillster/drone-email
    settings:
      host:
        from_secret: smtp_host
      username:
        from_secret: smtp_username
      password:
        from_secret: smtp_password
      from: drone@gilmour109.de
      recipients:
        - liwa7755@bht-berlin.de
      subject: "E2E Tests failed: ${DRONE_REPO} ${DRONE_TAG} #${DRONE_BUILD_NUMBER}"
      body: |
        E2E tests failed for tag ${DRONE_TAG} (commit ${DRONE_COMMIT_SHA:0:8}).
        Build: ${DRONE_BUILD_LINK}
    when:
      status:
        - failure

  - name: destroy_e2e_vm
    image: gitea.gilmour109.de/gilmour109/e2e-tools:latest
    environment:
      TF_VAR_run_id: ${DRONE_BUILD_NUMBER}
      TF_VAR_proxmox_password:
        from_secret: proxmox_password
      TF_VAR_clone_vm_password:
        from_secret: e2e_vm_password
      AWS_ACCESS_KEY_ID:
        from_secret: tofu_garage_access_key
      AWS_SECRET_ACCESS_KEY:
        from_secret: tofu_garage_secret_key
    commands:
      - cd tofu/e2e
      - tofu init
      - tofu destroy -auto-approve
    when:
      status:
        - success
        - failure

  - name: build_apk
    image: gitea.gilmour109.de/gilmour109/eas-build:latest
    environment:
      EXPO_TOKEN:
        from_secret: expo_token
    commands:
      - npm ci
      - npm run build -w @calchat/shared
      - npm run -w @calchat/client build:apk
    when:
      status:
        - success

  - name: release_apk
    image: plugins/gitea-release
    settings:
      api_key:
        from_secret: gitea_token
      base_url: https://gitea.gilmour109.de
      files:
        - calchat.apk
      title: ${DRONE_TAG}
    when:
      status:
        - success
