jobs:
  - job: docker_build
    pool:
      vmImage: ubuntu-22.04
    strategy:
      matrix:
        amd64:
          DOCKER_ARCH: amd64
        arm32v6:
          DOCKER_ARCH: arm32v6
        arm64v8:
          DOCKER_ARCH: arm64v8
    # The default timeout of 60 minutes is a little low for compiling
    # cryptography on ARM architectures.
    timeoutInMinutes: 180
    steps:
      - bash: set -e && tools/docker/build.sh $(dockerTag) $DOCKER_ARCH
        displayName: Build the Docker images
      # We don't filter for the Docker Hub organization to continue to allow
      # easy testing of these scripts on forks.
      - bash: |
          set -e
          DOCKER_IMAGES=$(docker images --filter reference='*/certbot' --filter reference='*/dns-*' --format '{{.Repository}}')
          docker save --output images.tar $DOCKER_IMAGES
        displayName: Save the Docker images
      # If the name of the tar file or artifact changes, the deploy stage will
      # also need to be updated.
      - bash: set -e && mv images.tar $(Build.ArtifactStagingDirectory)
        displayName: Prepare Docker artifact
      - task: PublishPipelineArtifact@1
        inputs:
          path: $(Build.ArtifactStagingDirectory)
          artifact: docker_$(DOCKER_ARCH)
        displayName: Store Docker artifact
  - job: docker_run
    dependsOn: docker_build
    pool:
      vmImage: ubuntu-22.04
    steps:
      - task: DownloadPipelineArtifact@2
        inputs:
          artifact: docker_amd64
          path: $(Build.SourcesDirectory)
        displayName: Retrieve Docker images
      - bash: set -e && docker load --input $(Build.SourcesDirectory)/images.tar
        displayName: Load Docker images
      - bash: |
          set -ex
          DOCKER_IMAGES=$(docker images --filter reference='*/certbot' --filter reference='*/dns-*' --format '{{.Repository}}:{{.Tag}}')
          for DOCKER_IMAGE in ${DOCKER_IMAGES}
            do docker run --rm "${DOCKER_IMAGE}" plugins --prepare
          done
        displayName: Run integration tests for Docker images
  - job: installer_build
    pool:
      vmImage: windows-2019
    steps:
      - task: UsePythonVersion@0
        inputs:
          versionSpec: 3.9
          architecture: x64
          addToPath: true
      - script: |
          python -m venv venv
          venv\Scripts\python tools\pipstrap.py
          venv\Scripts\python tools\pip_install.py -e windows-installer
        displayName: Prepare Windows installer build environment
      - script: |
          venv\Scripts\construct-windows-installer
        displayName: Build Certbot installer
      - task: CopyFiles@2
        inputs:
          sourceFolder: $(System.DefaultWorkingDirectory)/windows-installer/build/nsis
          contents: '*.exe'
          targetFolder: $(Build.ArtifactStagingDirectory)
      - task: PublishPipelineArtifact@1
        inputs:
          path: $(Build.ArtifactStagingDirectory)
          # If we change the artifact's name, it should also be changed in tools/create_github_release.py
          artifact: windows-installer
        displayName: Publish Windows installer
  - job: installer_run
    dependsOn: installer_build
    strategy:
      matrix:
        win2019:
          imageName: windows-2019
    pool:
      vmImage: $(imageName)
    steps:
      - task: UsePythonVersion@0
        inputs:
          versionSpec: 3.9
          addToPath: true
      - task: DownloadPipelineArtifact@2
        inputs:
          artifact: windows-installer
          path: $(Build.SourcesDirectory)/bin
        displayName: Retrieve Windows installer
      - script: |
          python -m venv venv
          venv\Scripts\python tools\pipstrap.py
          venv\Scripts\python tools\pip_install.py -e certbot-ci
        env:
          PIP_NO_BUILD_ISOLATION: no
        displayName: Prepare Certbot-CI
      - script: |
          set PATH=%ProgramFiles%\Certbot\bin;%PATH%
          venv\Scripts\python -m pytest certbot-ci\windows_installer_integration_tests --allow-persistent-changes --installer-path $(Build.SourcesDirectory)\bin\certbot-beta-installer-win_amd64.exe
        displayName: Run windows installer integration tests
      - script: |
          set PATH=%ProgramFiles%\Certbot\bin;%PATH%
          venv\Scripts\python -m pytest certbot-ci\certbot_integration_tests\certbot_tests -n 4
        displayName: Run certbot integration tests
  - job: snaps_build
    pool:
      vmImage: ubuntu-22.04
    strategy:
      matrix:
        amd64:
          SNAP_ARCH: amd64
        armhf:
          SNAP_ARCH: armhf
        arm64:
          SNAP_ARCH: arm64
    timeoutInMinutes: 0
    steps:
      - script: |
          set -e
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends snapd
          sudo snap install --classic snapcraft
        displayName: Install dependencies
      - task: UsePythonVersion@0
        inputs:
          versionSpec: 3.8
          addToPath: true
      - task: DownloadSecureFile@1
        name: credentials
        inputs:
          secureFile: launchpad-credentials
      - script: |
          set -e
          git config --global user.email "$(Build.RequestedForEmail)"
          git config --global user.name "$(Build.RequestedFor)"
          mkdir -p ~/.local/share/snapcraft/provider/launchpad
          cp $(credentials.secureFilePath) ~/.local/share/snapcraft/provider/launchpad/credentials
          python3 tools/snap/build_remote.py ALL --archs ${SNAP_ARCH} --timeout $(snapBuildTimeout)
        displayName: Build snaps
      - script: |
          set -e
          mv *.snap $(Build.ArtifactStagingDirectory)
          mv certbot-dns-*/*.snap $(Build.ArtifactStagingDirectory)
        displayName: Prepare artifacts
      - task: PublishPipelineArtifact@1
        inputs:
          path: $(Build.ArtifactStagingDirectory)
          artifact: snaps_$(SNAP_ARCH)
        displayName: Store snaps artifacts
  - job: snap_run
    dependsOn: snaps_build
    pool:
      vmImage: ubuntu-22.04
    steps:
      - task: UsePythonVersion@0
        inputs:
          versionSpec: 3.8
          addToPath: true
      - script: |
          set -e
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends nginx-light snapd
          python3 -m venv venv
          venv/bin/python tools/pipstrap.py
          venv/bin/python tools/pip_install.py -U tox
        displayName: Install dependencies
      - task: DownloadPipelineArtifact@2
        inputs:
          artifact: snaps_amd64
          path: $(Build.SourcesDirectory)/snap
        displayName: Retrieve Certbot snaps
      - script: |
          set -e
          sudo snap install --dangerous --classic snap/certbot_*.snap
        displayName: Install Certbot snap
      - script: |
          set -e
          venv/bin/python -m tox -e integration-external,apacheconftest-external-with-pebble
        displayName: Run tox
  - job: snap_dns_run
    dependsOn: snaps_build
    pool:
      vmImage: ubuntu-22.04
    steps:
      - script: |
          set -e
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends snapd
        displayName: Install dependencies
      - task: UsePythonVersion@0
        inputs:
          versionSpec: 3.8
          addToPath: true
      - task: DownloadPipelineArtifact@2
        inputs:
          artifact: snaps_amd64
          path: $(Build.SourcesDirectory)/snap
        displayName: Retrieve Certbot snaps
      - script: |
          set -e
          python3 -m venv venv
          venv/bin/python tools/pipstrap.py
          venv/bin/python tools/pip_install.py -e certbot-ci
        displayName: Prepare Certbot-CI
      - script: |
          set -e
          sudo -E venv/bin/pytest certbot-ci/snap_integration_tests/dns_tests --allow-persistent-changes --snap-folder $(Build.SourcesDirectory)/snap --snap-arch amd64
        displayName: Test DNS plugins snaps
