image:
- Visual Studio 2019
- Ubuntu1804

services:
- docker

stack: node 10

init:
- ps: |
    if($isWindows -and $env:DEBUG_RDP -eq "true") {
      iex ((new-object net.webclient).DownloadString(`
        'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
    }
- ps: |
    if($isWindows) {
      Install-Product node 10
    }

install:
- ps: |
    $env:PUSH_DOCKER = "false"
    $env:PROD_DEPLOY = "false"
    $env:TAG_NAME = ""
    if($env:APPVEYOR_REPO_TAG -eq "true" -and $env:APPVEYOR_RE_BUILD -eq "True") {
      $env:PROD_DEPLOY = "true"
      $env:TAG_NAME = $env:APPVEYOR_REPO_TAG_NAME.TrimStart("v")
      echo "This is a production deployment for ${env:TAG_NAME}."
    }
    if("${env:DOCKER_USERNAME}" -ne "" -and "${env:DOCKER_PASSWORD}" -ne "") {
      $env:PUSH_DOCKER = "true"
    }
    if($isLinux) {
      npm i -g gulp
    } else {
      choco install cloc --no-progress
      cloc --include-lang C#,SQL,Razor,"Bourne Shell",PowerShell,HTML,CSS,Sass,JavaScript,TypeScript --vcs git
    }
    if($env:APPVEYOR_REPO_TAG -eq "true") {
      $tagName = $env:APPVEYOR_REPO_TAG_NAME.TrimStart("v")
      $env:RELEASE_NAME = "Version ${tagName}"
    }

before_build:
- sh: |
    if [ "${PUSH_DOCKER}" == "true" ]
    then
      echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
    fi
- ps: |
    if($isLinux) {
      #dotnet restore
    } else {
      msbuild /t:restore
      dotnet tool restore
    }

build_script:
- sh: chmod +x ./build.sh
- ps: |
    if($isLinux) {
      #dotnet build --configuration Debug
      ./build.sh
      ./build.sh tag dev

      if($env:PROD_DEPLOY -eq "true") {
        ./build.sh tag beta
        ./build.sh tag $env:TAG_NAME
      }

      docker images

      if($env:PUSH_DOCKER -eq "true") {
        ./build.sh push dev
        if($env:PROD_DEPLOY -eq "true") {
            ./build.sh push beta
            ./build.sh push latest
            ./build.sh push $env:TAG_NAME
        }
      }
    } else {
      msbuild bitwarden-server.sln /p:Configuration=Debug /verbosity:minimal `
        /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"

      $env:swaggerGen = "true"
      $env:ASPNETCORE_ENVIRONMENT = "Production"
      cd .\src\Api
      dotnet swagger tofile --output ..\..\swagger.json --host https://api.bitwarden.com `
        .\bin\Debug\netcoreapp3.1\Api.dll public
      cd ..\..
      $env:ASPNETCORE_ENVIRONMENT = ""
      $env:swaggerGen = ""
      Push-AppveyorArtifact .\swagger.json
    }
- sh: |
    echo "Make docker stubs"
    STUB_OUTPUT=$(pwd)/docker-stub
    docker run -i --rm --name setup -v $STUB_OUTPUT:/bitwarden bitwarden/setup:dev \
      dotnet Setup.dll -stub 1 -install 1 -domain bitwarden.example.com -os lin
    sudo chown -R appveyor:appveyor $STUB_OUTPUT
    rm -rf $STUB_OUTPUT/letsencrypt
    rm $STUB_OUTPUT/env/uid.env $STUB_OUTPUT/config.yml
    touch $STUB_OUTPUT/env/uid.env
    cd docker-stub; zip -r ../docker-stub.zip *; cd ..
- ps: |
    if($isLinux) {
      Push-AppveyorArtifact ./docker-stub.zip
    }


after_build:
- sh: |
    if [ "${PUSH_DOCKER}" == "true" ]
    then
      docker logout
    fi

test_script:
- ps: |
    if($isWindows) {
      dotnet test .\test\Core.Test\Core.Test.csproj --configuration Debug --no-build
    }

on_finish:
  - ps: |
      if($isWindows -and $env:DEBUG_RDP -eq "true") {
        $blockRdp = $true
        iex ((new-object net.webclient).DownloadString(`
          'https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
      }

deploy:
  tag: $(APPVEYOR_REPO_TAG_NAME)
  release: $(RELEASE_NAME)
  provider: GitHub
  auth_token: $(GH_TOKEN)
  artifact: /.*/
  force_update: true
  on:
    branch: master
    APPVEYOR_REPO_TAG: true