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

stages:
  - lint
  - test
  - deploy

.lint: &lint
  image: esphome/esphome-base-amd64
  stage: lint
  before_script:
    - pip install -e .
    - pip install flake8==3.6.0 pylint==1.9.4 pillow
  tags:
    - docker

.test: &test
  image: esphome/esphome-base-amd64
  stage: test
  before_script:
    - pip install -e .
  tags:
    - docker
  variables:
    TZ: UTC

.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}:1.4.3
        BUILD_TO=esphome/esphome-hassio-${BUILD_ARCH}
        DOCKERFILE=docker/Dockerfile.hassio
      else
        BUILD_FROM=esphome/esphome-base-${BUILD_ARCH}:1.4.3
        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

flake8:
  <<: *lint
  script:
    - flake8 esphome

pylint:
  <<: *lint
  script:
    - pylint esphome

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
  stage: deploy
  image: python:2.7
  before_script:
  - pip install -e .
  - pip install twine
  script:
  - python setup.py sdist bdist_wheel
  - twine upload dist/*
  tags:
  - docker

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

.latest-vars: &latest-vars
  RELEASE: YES
  LATEST: YES
  # Also push to beta tag
  BETA: YES

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

.beta-vars: &beta-vars
  RELEASE: YES
  BETA: YES

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

.dev-vars: &dev-vars
  DEV: YES

#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"
armhf-beta-docker:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: armhf
    IS_HASSIO: "NO"
    RELEASE: "YES"
armhf-beta-hassio:
  <<: *beta
  variables:
    BETA: "YES"
    BUILD_ARCH: armhf
    IS_HASSIO: "YES"
    RELEASE: "YES"
armhf-dev-docker:
  <<: *dev
  variables:
    BUILD_ARCH: armhf
    DEV: "YES"
    IS_HASSIO: "NO"
armhf-dev-hassio:
  <<: *dev
  variables:
    BUILD_ARCH: armhf
    DEV: "YES"
    IS_HASSIO: "YES"
armhf-latest-docker:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: armhf
    IS_HASSIO: "NO"
    LATEST: "YES"
    RELEASE: "YES"
armhf-latest-hassio:
  <<: *latest
  variables:
    BETA: "YES"
    BUILD_ARCH: armhf
    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"