# Copyright (c) Microsoft Corporation
# All rights reserved.
#
# MIT License
#
# Permission is hereby granted, free of charge,
# to any person obtaining a copy of this software and associated
# documentation files (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and
# to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

jobs:
- job: 'version_number_validation'
  pool:
    vmImage: 'Ubuntu 16.04'
  strategy:
    matrix:
      Python36:
        PYTHON_VERSION: '3.6'
  steps:
  - script: |
      echo $(build_version)
      if [[ $(build_version) =~ ^v[0-9](.[0-9]){1,3}$ ]]; then
        echo 'valid build version $(build_version)'
        echo `git describe --tags --abbrev=0`
      else
        echo 'invalid build version $(build_version)'
        exit 1
      fi
    condition: eq( variables['build_type'], 'prerelease' )
    displayName: 'Validate prerelease version number'

  - script: |
      export BRANCH_TAG=`git describe --tags --abbrev=0`
      echo $BRANCH_TAG
      if [[ $BRANCH_TAG = $(build_version) && $BRANCH_TAG =~ ^v[0-9](.[0-9]){1,3}$ ]]; then
        echo 'Build version match branch tag'
      else
        echo 'Build version does not match branch tag'
        exit 1
      fi
    condition: eq( variables['build_type'], 'release' )
    displayName: 'Validate release version number and branch tag'


- job: 'Build_upload_nni_ubuntu'
  dependsOn: version_number_validation
  condition: succeeded()
  pool:
    vmImage: 'Ubuntu 16.04'
  strategy:
    matrix:
      Python36:
        PYTHON_VERSION: '3.6'

  steps:
  - script: |
      python3 -m pip install --upgrade pip setuptools --user
      python3 -m pip install twine --user
    displayName: 'Install twine'

  - script: |
      cd deployment/pypi
      if [ $(build_type) = 'prerelease' ]
      then
        # NNI build scripts (Makefile) uses branch tag as package version number
        git tag $(build_version)
        echo 'building prerelease package...'
        make version_ts=true build
      else
        echo 'building release package...'
        make build
      fi
    condition: eq( variables['upload_package'], 'true')
    displayName: 'build nni bdsit_wheel'

  - script: |
      cd deployment/pypi
      if [ $(build_type) = 'prerelease' ]
      then
        echo 'uploading prerelease package to testpypi...'
        python3 -m twine upload -u $(testpypi_user) -p $(testpypi_pwd) --repository-url https://test.pypi.org/legacy/ dist/*
      else
        echo 'uploading release package to pypi...'
        python3 -m twine upload -u $(pypi_user) -p $(pypi_pwd) dist/*
      fi
    condition: eq( variables['upload_package'], 'true')
    displayName: 'upload nni package to pypi/testpypi'

  - script: |
      cd deployment/docker

      if [ $(build_type) = 'prerelease' ]
      then
        docker login -u $(docker_hub_dev_user) -p $(docker_hub_dev_pwd)
        export IMG_NAME=$(dev_docker_img)
        export IMG_TAG=`git describe --tags --abbrev=0`.`date -u +%y%m%d%H%M`
        echo 'updating docker file for testpyi...'
        sed -ie 's/RUN python3 -m pip --no-cache-dir install nni/RUN python3 -m pip install --user --no-cache-dir --index-url https:\/\/test.pypi.org\/simple --extra-index-url https:\/\/pypi.org\/simple nni/' Dockerfile
      else
        docker login -u $(docker_hub_user) -p $(docker_hub_pwd)
        export IMG_NAME=msranni/nni
        export IMG_TAG=`git describe --tags --abbrev=0`
      fi
      echo $IMG_NAME:$IMG_TAG
      cat Dockerfile
      docker build -f Dockerfile -t $IMG_NAME:$IMG_TAG .
      docker push $IMG_NAME:$IMG_TAG

      if [ $(update_latest_tag) = 'true' ]
      then
        docker tag $IMG_NAME:$IMG_TAG $IMG_NAME:latest
        docker push $IMG_NAME:latest
      fi

    condition: eq( variables['build_docker_img'], 'true')
    displayName: 'build and upload nni docker image'

- job: 'Build_upload_nni_macos'
  dependsOn: version_number_validation
  condition: succeeded()
  pool:
    vmImage: 'macOS 10.13'
  strategy:
    matrix:
      Python36:
        PYTHON_VERSION: '3.6'
  steps:
  - script: |
      python3 -m pip install --upgrade pip setuptools --user
      python3 -m pip install twine --user
    displayName: 'Install twine'

  - script: |
      make install-dependencies
    displayName: 'Install nni dependencies'

  - script: |
      cd deployment/pypi
      if [ $(build_type) = 'prerelease' ]
      then
        # NNI build scripts (Makefile) uses branch tag as package version number
        git tag $(build_version)
        echo 'building prerelease package...'
        PATH=$HOME/Library/Python/3.7/bin:$PATH make version_ts=true build
      else
        echo 'building release package...'
        PATH=$HOME/Library/Python/3.7/bin:$PATH make build
      fi
    condition: eq( variables['upload_package'], 'true')
    displayName: 'build nni bdsit_wheel'

  - script: |
      cd deployment/pypi
      if [ $(build_type) = 'prerelease' ]
      then
        echo 'uploading prerelease package to testpypi...'
        python3 -m twine upload -u $(testpypi_user) -p $(testpypi_pwd) --repository-url https://test.pypi.org/legacy/ dist/*
      else
        echo 'uploading release package to pypi...'
        python3 -m twine upload -u $(pypi_user) -p $(pypi_pwd) dist/*
      fi
    condition: eq( variables['upload_package'], 'true')
    displayName: 'upload nni package to pypi/testpypi'

- job: 'Build_upload_nni_win32'
  dependsOn: version_number_validation
  condition: succeeded()
  pool:
    vmImage: 'vs2017-win2016'
  strategy:
    matrix:
      Python36:
        PYTHON_VERSION: '3.6'
  steps:
  - powershell: |
      python -m pip install --upgrade pip setuptools
      python -m pip install twine
    displayName: 'Install twine'

  - powershell: |
      cd deployment\pypi
      if($env:BUILD_TYPE -eq 'prerelease'){
        # NNI build scripts (powershell) uses branch tag as package version number
        git tag $env:BUILD_VERSION
        Write-Host 'building prerelease package...'
        .\install.ps1 -version_os 32 -version_ts $True
      }
      else{
        Write-Host 'building release package...'
        .\install.ps1 -version_os 32 -version_ts $False
      }
    condition: eq( variables['upload_package'], 'true')
    displayName: 'build nni bdsit_wheel'

  - powershell: |
      cd deployment\pypi
      if($env:BUILD_TYPE -eq 'prerelease'){
        Write-Host 'uploading prerelease package to testpypi...'
        python -m twine upload -u $(testpypi_user) -p $(testpypi_pwd) --repository-url https://test.pypi.org/legacy/ dist/*
      }
      else{
        Write-Host 'uploading release package to pypi...'
        python -m twine upload -u $(pypi_user) -p $(pypi_pwd) dist/*
      }
    condition: eq( variables['upload_package'], 'true')
    displayName: 'upload nni package to pypi/testpypi'

- job: 'Build_upload_nni_win_amd64'
  dependsOn: version_number_validation
  condition: succeeded()
  pool:
    vmImage: 'vs2017-win2016'
  strategy:
    matrix:
      Python36:
        PYTHON_VERSION: '3.6'
  steps:
  - powershell: |
      python -m pip install --upgrade pip setuptools
      python -m pip install twine
    displayName: 'Install twine'

  - powershell: |
      cd deployment\pypi
      if($env:BUILD_TYPE -eq 'prerelease'){
        # NNI build scripts (powershell) uses branch tag as package version number
        git tag $env:BUILD_VERSION
        Write-Host 'building prerelease package...'
        .\install.ps1 -version_os 64 -version_ts $True
      }
      else{
        Write-Host 'building release package...'
        .\install.ps1 -version_os 64 -version_ts $False
      }
    condition: eq( variables['upload_package'], 'true')
    displayName: 'build nni bdsit_wheel'

  - powershell: |
      cd deployment\pypi
      if($env:BUILD_TYPE -eq 'prerelease'){
        Write-Host 'uploading prerelease package to testpypi...'
        python -m twine upload -u $(testpypi_user) -p $(testpypi_pwd) --repository-url https://test.pypi.org/legacy/ dist/*
      }
      else{
        Write-Host 'uploading release package to pypi...'
        python -m twine upload -u $(pypi_user) -p $(pypi_pwd) dist/*
      }
    condition: eq( variables['upload_package'], 'true')
    displayName: 'upload nni package to pypi/testpypi'
