---
# Based on https://gitlab.com/hassio-addons/addon-node-red/blob/master/.gitlab-ci.yml
variables:
  DOCKER_DRIVER: overlay2
  DOCKER_HOST: tcp://docker:2375/
  BASE_VERSION: '1.8.3'
  TZ: UTC

stages:
  - lint
  - test
  - deploy

.lint: &lint
  image: esphome/esphome-lint:latest
  stage: lint
  before_script:
    - script/setup
  tags:
    - docker

.test: &test
  image: esphome/esphome-lint:latest
  stage: test
  before_script:
    - script/setup
  tags:
    - docker

.docker-base: &docker-base
  image: esphome/esphome-base-builder
  before_script:
    - docker info
    - docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
  script:
    - docker run --rm --privileged hassioaddons/qemu-user-static:latest
    - TAG="${CI_COMMIT_TAG#v}"
    - TAG="${TAG:-${CI_COMMIT_SHA:0:7}}"
    - echo "Tag ${TAG}"

    - |
      if [[ "${IS_HASSIO}" == "YES" ]]; then
        BUILD_FROM=esphome/esphome-hassio-base-${BUILD_ARCH}:${BASE_VERSION}
        BUILD_TO=esphome/esphome-hassio-${BUILD_ARCH}
        DOCKERFILE=docker/Dockerfile.hassio
      else
        BUILD_FROM=esphome/esphome-base-${BUILD_ARCH}:${BASE_VERSION}
        if [[ "${BUILD_ARCH}" == "amd64" ]]; then
          BUILD_TO=esphome/esphome
        else
          BUILD_TO=esphome/esphome-${BUILD_ARCH}
        fi
        DOCKERFILE=docker/Dockerfile
      fi

    - |
      docker build \
        --build-arg "BUILD_FROM=${BUILD_FROM}" \
        --build-arg "BUILD_VERSION=${TAG}" \
        --tag "${BUILD_TO}:${TAG}" \
        --file "${DOCKERFILE}" \
        .
    - |
      if [[ "${RELEASE}" = "YES" ]]; then
        echo "Pushing to ${BUILD_TO}:${TAG}"
        docker push "${BUILD_TO}:${TAG}"
      fi
    - |
      if [[ "${LATEST}" = "YES" ]]; then
        echo "Pushing to :latest"
        docker tag ${BUILD_TO}:${TAG} ${BUILD_TO}:latest
        docker push ${BUILD_TO}:latest
      fi
    - |
      if [[ "${BETA}" = "YES" ]]; then
        echo "Pushing to :beta"
        docker tag \
          ${BUILD_TO}:${TAG} \
          ${BUILD_TO}:beta
        docker push ${BUILD_TO}:beta
      fi
    - |
      if [[ "${DEV}" = "YES" ]]; then
        echo "Pushing to :dev"
        docker tag \
          ${BUILD_TO}:${TAG} \
          ${BUILD_TO}:dev
        docker push ${BUILD_TO}:dev
      fi
  services:
    - docker:dind
  tags:
    - docker
  stage: deploy

lint-custom:
  <<: *lint
  script:
    - script/ci-custom.py

lint-python:
  <<: *lint
  script:
    - script/lint-python

lint-tidy:
  <<: *lint
  script:
    - pio init --ide atom
    - |
      if ! patch -R -p0 -s -f --dry-run <script/.neopixelbus.patch; then
        patch -p0 < script/.neopixelbus.patch
      fi
    - script/clang-tidy --all-headers --fix
    - script/ci-suggest-changes

lint-format:
  <<: *lint
  script:
    - script/clang-format -i
    - script/ci-suggest-changes

test1:
  <<: *test
  script:
    - esphome tests/test1.yaml compile

test2:
  <<: *test
  script:
    - esphome tests/test2.yaml compile

test3:
  <<: *test
  script:
    - esphome tests/test3.yaml compile

.deploy-pypi: &deploy-pypi
  <<: *lint
  stage: deploy
  script:
    - pip install twine wheel
    - python setup.py sdist bdist_wheel
    - twine upload dist/*

deploy-release:pypi:
  <<: *deploy-pypi
  only:
    - /^v\d+\.\d+\.\d+$/
  except:
    - /^(?!master).+@/

deploy-beta:pypi:
  <<: *deploy-pypi
  only:
    - /^v\d+\.\d+\.\d+b\d+$/
  except:
    - /^(?!rc).+@/

.latest: &latest
  <<: *docker-base
  only:
    - /^v([0-9\.]+)$/
  except:
    - branches

.beta: &beta
  <<: *docker-base
  only:
    - /^v([0-9\.]+b\d+)$/
  except:
    - branches

.dev: &dev
  <<: *docker-base
  only:
    - dev

aarch64-beta-docker:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: aarch64
    IS_HASSIO: "NO"
    RELEASE: "YES"
aarch64-beta-hassio:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: aarch64
    IS_HASSIO: "YES"
    RELEASE: "YES"
aarch64-dev-docker:
  <<: *dev
  variables:
    BUILD_ARCH: aarch64
    DEV: "YES"
    IS_HASSIO: "NO"
aarch64-dev-hassio:
  <<: *dev
  variables:
    BUILD_ARCH: aarch64
    DEV: "YES"
    IS_HASSIO: "YES"
aarch64-latest-docker:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: aarch64
    IS_HASSIO: "NO"
    LATEST: "YES"
    RELEASE: "YES"
aarch64-latest-hassio:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: aarch64
    IS_HASSIO: "YES"
    LATEST: "YES"
    RELEASE: "YES"
amd64-beta-docker:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: amd64
    IS_HASSIO: "NO"
    RELEASE: "YES"
amd64-beta-hassio:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: amd64
    IS_HASSIO: "YES"
    RELEASE: "YES"
amd64-dev-docker:
  <<: *dev
  variables:
    BUILD_ARCH: amd64
    DEV: "YES"
    IS_HASSIO: "NO"
amd64-dev-hassio:
  <<: *dev
  variables:
    BUILD_ARCH: amd64
    DEV: "YES"
    IS_HASSIO: "YES"
amd64-latest-docker:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: amd64
    IS_HASSIO: "NO"
    LATEST: "YES"
    RELEASE: "YES"
amd64-latest-hassio:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: amd64
    IS_HASSIO: "YES"
    LATEST: "YES"
    RELEASE: "YES"
armv7-beta-docker:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: armv7
    IS_HASSIO: "NO"
    RELEASE: "YES"
armv7-beta-hassio:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: armv7
    IS_HASSIO: "YES"
    RELEASE: "YES"
armv7-dev-docker:
  <<: *dev
  variables:
    BUILD_ARCH: armv7
    DEV: "YES"
    IS_HASSIO: "NO"
armv7-dev-hassio:
  <<: *dev
  variables:
    BUILD_ARCH: armv7
    DEV: "YES"
    IS_HASSIO: "YES"
armv7-latest-docker:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: armv7
    IS_HASSIO: "NO"
    LATEST: "YES"
    RELEASE: "YES"
armv7-latest-hassio:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: armv7
    IS_HASSIO: "YES"
    LATEST: "YES"
    RELEASE: "YES"
i386-beta-docker:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: i386
    IS_HASSIO: "NO"
    RELEASE: "YES"
i386-beta-hassio:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: i386
    IS_HASSIO: "YES"
    RELEASE: "YES"
i386-dev-docker:
  <<: *dev
  variables:
    BUILD_ARCH: i386
    DEV: "YES"
    IS_HASSIO: "NO"
i386-dev-hassio:
  <<: *dev
  variables:
    BUILD_ARCH: i386
    DEV: "YES"
    IS_HASSIO: "YES"
i386-latest-docker:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: i386
    IS_HASSIO: "NO"
    LATEST: "YES"
    RELEASE: "YES"
i386-latest-hassio:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: i386
    IS_HASSIO: "YES"
    LATEST: "YES"
    RELEASE: "YES"
