Commit 6b2d8f09bc9e5bdf74f98b7470ebc39436be600f

Edward Thomson 2018-08-26T18:05:31

ci: use templates for VSTS builds Our build YAML is becoming unweildly and full of copy-pasta. Simplify with templates.

diff --git a/.vsts-ci.yml b/.vsts-ci.yml
index 63db627..7506e3f 100644
--- a/.vsts-ci.yml
+++ b/.vsts-ci.yml
@@ -11,156 +11,50 @@ jobs:
   pool:
     vmImage: 'Ubuntu 16.04'
   steps:
-  - task: Docker@0
-    displayName: Build
-    inputs:
-      action: 'Run an image'
+  - template: ci/vsts-docker.yml
+    parameters:
       imageName: 'libgit2/trusty-openssl:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      workDir: '/build'
-      containerCommand: '/src/ci/build.sh'
-      detached: false
-  - task: Docker@0
-    displayName: Test
-    inputs:
-      action: 'Run an image'
-      imageName: 'libgit2/trusty-openssl:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      envVars: |
+      environmentVariables: |
        CC=gcc
        LEAK_CHECK=valgrind
-      workDir: '/build'
-      containerCommand: '/src/ci/test.sh'
-      detached: false
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
 
 - job: linux_trusty_gcc_mbedtls
   displayName: 'Linux (Trusty; GCC; mbedTLS)'
   pool:
     vmImage: 'Ubuntu 16.04'
   steps:
-  - task: Docker@0
-    displayName: Build
-    inputs:
-      action: 'Run an image'
+  - template: ci/vsts-docker.yml
+    parameters:
       imageName: 'libgit2/trusty-mbedtls:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      envVars: |
+      environmentVariables: |
        CC=gcc
        CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DSHA1_BACKEND=mbedTLS
        LEAK_CHECK=valgrind
-      workDir: '/build'
-      containerCommand: '/src/ci/build.sh'
-      detached: false
-  - task: Docker@0
-    displayName: Test
-    inputs:
-      action: 'Run an image'
-      imageName: 'libgit2/trusty-mbedtls:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      envVars: 'LEAK_CHECK=valgrind'
-      workDir: '/build'
-      containerCommand: '/src/ci/test.sh'
-      detached: false
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
 
 - job: linux_trusty_clang_openssl
   displayName: 'Linux (Trusty; Clang; OpenSSL)'
   pool:
     vmImage: 'Ubuntu 16.04'
   steps:
-  - task: Docker@0
-    displayName: Build
-    inputs:
-      action: 'Run an image'
-      imageName: 'libgit2/trusty-openssl:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      workDir: '/build'
-      containerCommand: '/src/ci/build.sh'
-      detached: false
-  - task: Docker@0
-    displayName: Test
-    inputs:
-      action: 'Run an image'
+  - template: ci/vsts-docker.yml
+    parameters:
       imageName: 'libgit2/trusty-openssl:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      envVars: |
+      environmentVariables: |
        CC=clang
        LEAK_CHECK=valgrind
-      workDir: '/build'
-      containerCommand: '/src/ci/test.sh'
-      detached: false
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
 
 - job: linux_trusty_clang_mbedtls
   displayName: 'Linux (Trusty; Clang; mbedTLS)'
   pool:
     vmImage: 'Ubuntu 16.04'
   steps:
-  - task: Docker@0
-    displayName: Build
-    inputs:
-      action: 'Run an image'
+  - template: ci/vsts-docker.yml
+    parameters:
       imageName: 'libgit2/trusty-mbedtls:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      envVars: |
+      environmentVariables: |
        CC=clang
        CMAKE_OPTIONS=-DUSE_HTTPS=mbedTLS -DSHA1_BACKEND=mbedTLS
        LEAK_CHECK=valgrind
-      workDir: '/build'
-      containerCommand: '/src/ci/build.sh'
-      detached: false
-  - task: Docker@0
-    displayName: Test
-    inputs:
-      action: 'Run an image'
-      imageName: 'libgit2/trusty-mbedtls:latest'
-      volumes: |
-       $(Build.SourcesDirectory):/src
-       $(Build.BinariesDirectory):/build
-      envVars: 'LEAK_CHECK=valgrind'
-      workDir: '/build'
-      containerCommand: '/src/ci/test.sh'
-      detached: false
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
 
 - job: macos
   displayName: 'macOS'
@@ -169,65 +63,30 @@ jobs:
   steps:
   - bash: . '$(Build.SourcesDirectory)/ci/setup-osx.sh'
     displayName: Setup
-    workingDirectory: '$(Build.BinariesDirectory)'
-  - bash: . '$(Build.SourcesDirectory)/ci/build.sh'
-    displayName: Build
-    workingDirectory: '$(Build.BinariesDirectory)'
-    env:
-      PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
-  - bash: . '$(Build.SourcesDirectory)/ci/test.sh'
-    displayName: Test
-    workingDirectory: '$(Build.BinariesDirectory)'
-    env:
-      TMPDIR: $(Agent.TempDirectory)
-      LEAK_CHECK: leaks
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
+  - template: ci/vsts-bash.yml
+    parameters:
+      environmentVariables:
+        TMPDIR: $(Agent.TempDirectory)
+        PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
+        LEAK_CHECK: leaks
 
 - job: windows_vs_amd64
   displayName: 'Windows (Visual Studio; amd64)'
   pool: Hosted
   steps:
-  - powershell: . '$(Build.SourcesDirectory)\ci\build.ps1'
-    displayName: Build
-    workingDirectory: '$(Build.BinariesDirectory)'
-    env:
-      CMAKE_OPTIONS: -DMSVC_CRTDBG=ON -G"Visual Studio 12 2013 Win64"
-  - powershell: . '$(Build.SourcesDirectory)\ci\test.ps1'
-    displayName: Test
-    workingDirectory: '$(Build.BinariesDirectory)'
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
+  - template: ci/vsts-powershell.yml
+    parameters:
+      environmentVariables:
+        CMAKE_OPTIONS: -DMSVC_CRTDBG=ON -G"Visual Studio 12 2013 Win64"
 
 - job: windows_vs_x86
   displayName: 'Windows (Visual Studio; x86)'
   pool: Hosted
   steps:
-  - powershell: . '$(Build.SourcesDirectory)\ci\build.ps1'
-    displayName: Build
-    workingDirectory: '$(Build.BinariesDirectory)'
-    env:
-      CMAKE_OPTIONS: -DMSVC_CRTDBG=ON -G"Visual Studio 12 2013"
-  - powershell: . '$(Build.SourcesDirectory)\ci\test.ps1'
-    displayName: Test
-    workingDirectory: '$(Build.BinariesDirectory)'
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
+  - template: ci/vsts-powershell.yml
+    parameters:
+      environmentVariables:
+        CMAKE_OPTIONS: -DMSVC_CRTDBG=ON -G"Visual Studio 12 2013"
 
 - job: windows_mingw_amd64
   displayName: 'Windows (MinGW; amd64)'
@@ -235,26 +94,14 @@ jobs:
   steps:
   - powershell: . '$(Build.SourcesDirectory)\ci\setup-mingw.ps1'
     displayName: Setup
-    workingDirectory: '$(Build.BinariesDirectory)'
     env:
       TEMP: $(Agent.TempDirectory)
       ARCH: amd64
-  - powershell: . '$(Build.SourcesDirectory)\ci\build.ps1'
-    displayName: Build
-    workingDirectory: '$(Build.BinariesDirectory)'
-    env:
-      CMAKE_OPTIONS: -G"MinGW Makefiles"
-      PATH: $(Agent.TempDirectory)\mingw64\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\CMake\bin
-  - powershell: . '$(Build.SourcesDirectory)\ci\test.ps1'
-    displayName: Test
-    workingDirectory: '$(Build.BinariesDirectory)'
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
+  - template: ci/vsts-powershell.yml
+    parameters:
+      environmentVariables:
+        CMAKE_OPTIONS: -G"MinGW Makefiles"
+        PATH: $(Agent.TempDirectory)\mingw64\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\CMake\bin
 
 - job: windows_mingw_x86
   displayName: 'Windows (MinGW; x86)'
@@ -266,19 +113,8 @@ jobs:
     env:
       TEMP: $(Agent.TempDirectory)
       ARCH: x86
-  - powershell: . '$(Build.SourcesDirectory)\ci\build.ps1'
-    displayName: Build
-    workingDirectory: '$(Build.BinariesDirectory)'
-    env:
-      CMAKE_OPTIONS: -G"MinGW Makefiles"
-      PATH: $(Agent.TempDirectory)\mingw32\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\CMake\bin
-  - powershell: . '$(Build.SourcesDirectory)\ci\test.ps1'
-    displayName: Test
-    workingDirectory: '$(Build.BinariesDirectory)'
-  - task: PublishTestResults@2
-    displayName: Publish Test Results
-    condition: succeededOrFailed()
-    inputs:
-      testResultsFiles: 'results_*.xml'
-      searchFolder: '$(Build.BinariesDirectory)'
-      mergeTestResults: true
+  - template: ci/vsts-powershell.yml
+    parameters:
+      environmentVariables:
+        CMAKE_OPTIONS: -G"MinGW Makefiles"
+        PATH: $(Agent.TempDirectory)\mingw32\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\CMake\bin
diff --git a/ci/vsts-bash.yml b/ci/vsts-bash.yml
new file mode 100644
index 0000000..d776a36
--- /dev/null
+++ b/ci/vsts-bash.yml
@@ -0,0 +1,17 @@
+# These are the steps used for building on machines with bash.
+steps:
+- bash: . '$(Build.SourcesDirectory)/ci/build.sh'
+  displayName: Build
+  workingDirectory: '$(Build.BinariesDirectory)'
+  env: ${{ parameters.environmentVariables }}
+- bash: . '$(Build.SourcesDirectory)/ci/test.sh'
+  displayName: Test
+  workingDirectory: '$(Build.BinariesDirectory)'
+  env: ${{ parameters.environmentVariables }}
+- task: PublishTestResults@2
+  displayName: Publish Test Results
+  condition: succeededOrFailed()
+  inputs:
+    testResultsFiles: 'results_*.xml'
+    searchFolder: '$(Build.BinariesDirectory)'
+    mergeTestResults: true
diff --git a/ci/vsts-docker.yml b/ci/vsts-docker.yml
new file mode 100644
index 0000000..e925104
--- /dev/null
+++ b/ci/vsts-docker.yml
@@ -0,0 +1,33 @@
+# These are the steps used in a container-based build in VSTS.
+steps:
+- task: docker@0
+  displayName: Build
+  inputs:
+    action: 'Run an image'
+    imageName: ${{ parameters.imageName }}
+    volumes: |
+     $(Build.SourcesDirectory):/src
+     $(Build.BinariesDirectory):/build
+    envVars: ${{ parameters.environmentVariables }}
+    workDir: '/build'
+    containerCommand: '/src/ci/build.sh'
+    detached: false
+- task: docker@0
+  displayName: Test
+  inputs:
+    action: 'Run an image'
+    imageName: ${{ parameters.imageName }}
+    volumes: |
+     $(Build.SourcesDirectory):/src
+     $(Build.BinariesDirectory):/build
+    envVars: ${{ parameters.environmentVariables }}
+    workDir: '/build'
+    containerCommand: '/src/ci/test.sh'
+    detached: false
+- task: publishtestresults@2
+  displayName: Publish Test Results
+  condition: succeededOrFailed()
+  inputs:
+    testResultsFiles: 'results_*.xml'
+    searchFolder: '$(Build.BinariesDirectory)'
+    mergeTestResults: true
diff --git a/ci/vsts-powershell.yml b/ci/vsts-powershell.yml
new file mode 100644
index 0000000..a2eb175
--- /dev/null
+++ b/ci/vsts-powershell.yml
@@ -0,0 +1,17 @@
+# These are the steps used for building on machines with PowerShell.
+steps:
+- powershell: . '$(Build.SourcesDirectory)\ci\build.ps1'
+  displayName: Build
+  workingDirectory: '$(Build.BinariesDirectory)'
+  env: ${{ parameters.environmentVariables }}
+- powershell: . '$(Build.SourcesDirectory)\ci\test.ps1'
+  displayName: Test
+  workingDirectory: '$(Build.BinariesDirectory)'
+  env: ${{ parameters.environmentVariables }}
+- task: PublishTestResults@2
+  displayName: Publish Test Results
+  condition: succeededOrFailed()
+  inputs:
+    testResultsFiles: 'results_*.xml'
+    searchFolder: '$(Build.BinariesDirectory)'
+    mergeTestResults: true