trigger:
- master

stages:
- stage: fuzzit
  displayName: "Run Fuzzit"
  dependsOn: []
  condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master'))
  jobs:
  - job: submit
    displayName: "Submit"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: GoTool@0
      displayName: "Install Go 1.13"
      inputs:
        version: "1.13"
    - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/"
    - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml
    - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml
    - task: Bash@3
      inputs:
        filePath: './fuzzit.sh'
      env:
        TYPE: fuzzing
        FUZZIT_API_KEY: $(FUZZIT_API_KEY)

- stage: run_checks
  displayName: "Check"
  dependsOn: []
  jobs:
  - job: fmt
    displayName: "fmt"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: GoTool@0
      displayName: "Install Go 1.13"
      inputs:
        version: "1.13"
    - task: Go@0
      displayName: "go fmt ./..."
      inputs:
        command: 'custom'
        customCommand: 'fmt'
        arguments: './...'
  - job: coverage
    displayName: "coverage"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: GoTool@0
      displayName: "Install Go 1.13"
      inputs:
        version: "1.13"
    - task: Go@0
      displayName: "Generate coverage"
      inputs:
        command: 'test'
        arguments: "-race -coverprofile=coverage.txt -covermode=atomic"
    - task: Bash@3
      inputs:
        targetType: 'inline'
        script: 'bash <(curl -s https://codecov.io/bash) -t $(CODECOV_TOKEN)'
  - job: benchmark
    displayName: "benchmark"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: GoTool@0
      displayName: "Install Go 1.13"
      inputs:
        version: "1.13"
    - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/"
    - task: Bash@3
      inputs:
        filePath: './benchmark.sh'
        arguments: "master $(Build.Repository.Uri)"

  - job: fuzzing
    displayName: "fuzzing"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: GoTool@0
      displayName: "Install Go 1.13"
      inputs:
        version: "1.13"
    - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/"
    - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml
    - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml
    - task: Bash@3
      inputs:
        filePath: './fuzzit.sh'
      env:
        TYPE: local-regression

  - job: go_unit_tests
    displayName: "unit tests"
    strategy:
      matrix:
        linux 1.13:
          goVersion: '1.13'
          imageName: 'ubuntu-latest'
        mac 1.13:
          goVersion: '1.13'
          imageName: 'macos-10.13'
        windows 1.13:
          goVersion: '1.13'
          imageName: 'vs2017-win2016'
        linux 1.12:
          goVersion: '1.12'
          imageName: 'ubuntu-latest'
        mac 1.12:
          goVersion: '1.12'
          imageName: 'macos-10.13'
        windows 1.12:
          goVersion: '1.12'
          imageName: 'vs2017-win2016'
    pool:
      vmImage: $(imageName)
    steps:
    - task: GoTool@0
      displayName: "Install Go $(goVersion)"
      inputs:
        version: $(goVersion)
    - task: Go@0
      displayName: "go test ./..."
      inputs:
        command: 'test'
        arguments: './...'

- stage: build_docker_image
  displayName: "Build Docker image"
  dependsOn: run_checks
  jobs:
  - job: build
    displayName: "Build"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: Docker@2
      inputs:
        command: 'build'
        Dockerfile: 'Dockerfile'
        buildContext: '.'
        addPipelineData: false

- stage: publish_docker_image
  displayName: "Publish Docker image"
  dependsOn: build_docker_image
  condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master'))
  jobs:
  - job: publish
    displayName: "Publish"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: Docker@2
      inputs:
        containerRegistry: 'DockerHub'
        repository: 'pelletier/go-toml'
        command: 'buildAndPush'
        Dockerfile: 'Dockerfile'
        buildContext: '.'
        tags: 'latest'