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.14"
      inputs:
        version: "1.14"
    - 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.14"
      inputs:
        version: "1.14"
    - 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.14"
      inputs:
        version: "1.14"
    - 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}'
      env:
        CODECOV_TOKEN: $(CODECOV_TOKEN)
  - job: benchmark
    displayName: "benchmark"
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: GoTool@0
      displayName: "Install Go 1.14"
      inputs:
        version: "1.14"
    - 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.14"
      inputs:
        version: "1.14"
    - 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.14:
          goVersion: '1.14'
          imageName: 'ubuntu-latest'
        mac 1.14:
          goVersion: '1.14'
          imageName: 'macOS-latest'
        windows 1.14:
          goVersion: '1.14'
          imageName: 'windows-latest'
        linux 1.13:
          goVersion: '1.13'
          imageName: 'ubuntu-latest'
        mac 1.13:
          goVersion: '1.13'
          imageName: 'macOS-latest'
        windows 1.13:
          goVersion: '1.13'
          imageName: 'windows-latest'
    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_binaries
  displayName: "Build binaries"
  dependsOn: run_checks
  jobs:
  - job: build_binary
    displayName: "Build binary"
    strategy:
      matrix:
        linux_amd64:
          GOOS: linux
          GOARCH: amd64
        darwin_amd64:
          GOOS: darwin
          GOARCH: amd64
        windows_amd64:
          GOOS: windows
          GOARCH: amd64
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: GoTool@0
      displayName: "Install Go"
      inputs:
        version: 1.14
    - task: Bash@3
      inputs:
        targetType: inline
        script: "make dist"
      env:
        go.goos: $(GOOS)
        go.goarch: $(GOARCH)
    - task: CopyFiles@2
      inputs:
        sourceFolder: '$(Build.SourcesDirectory)'
        contents: '*.tar.xz'
        TargetFolder: '$(Build.ArtifactStagingDirectory)'
    - task: PublishBuildArtifacts@1
      inputs:
        pathtoPublish: '$(Build.ArtifactStagingDirectory)'
        artifactName: binaries
- stage: build_binaries_manifest
  displayName: "Build binaries manifest"
  dependsOn: build_binaries
  jobs:
  - job: build_manifest
    displayName: "Build binaries manifest"
    steps:
      - task: DownloadBuildArtifacts@0
        inputs:
          buildType: 'current'
          downloadType: 'single'
          artifactName: 'binaries'
          downloadPath: '$(Build.SourcesDirectory)'
      - task: Bash@3
        inputs:
          targetType: inline
          script: "cd binaries && sha256sum --binary *.tar.xz | tee $(Build.ArtifactStagingDirectory)/sha256sums.txt"
      - task: PublishBuildArtifacts@1
        inputs:
          pathtoPublish: '$(Build.ArtifactStagingDirectory)'
          artifactName: manifest

- 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'
