Skip to content

Commit 4668931

Browse files
dschogitster
authored andcommitted
ci: also build and test with MS Visual Studio on Azure Pipelines
... because we can, now. Technically, we actually build using `MSBuild`, which is however pretty close to building interactively in Visual Studio. As there is no convenient way to run Git's test suite in Visual Studio, we unpack a Portable Git to run it, using the just-added test helper to allow running test scripts in parallel. Signed-off-by: Johannes Schindelin <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b35304b commit 4668931

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3025,6 +3025,10 @@ rpm::
30253025
@false
30263026
.PHONY: rpm
30273027

3028+
ifneq ($(INCLUDE_DLLS_IN_ARTIFACTS),)
3029+
OTHER_PROGRAMS += $(shell echo *.dll t/helper/*.dll)
3030+
endif
3031+
30283032
artifacts-tar:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) \
30293033
GIT-BUILD-OPTIONS $(TEST_PROGRAMS) $(test_bindir_programs) \
30303034
$(MOFILES)

azure-pipelines.yml

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,165 @@ jobs:
130130
PathtoPublish: t/failed-test-artifacts
131131
ArtifactName: failed-test-artifacts
132132

133+
- job: vs_build
134+
displayName: Visual Studio Build
135+
condition: succeeded()
136+
pool: Hosted VS2017
137+
timeoutInMinutes: 240
138+
steps:
139+
- powershell: |
140+
if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
141+
net use s: \\gitfileshare.file.core.windows.net\test-cache "$GITFILESHAREPWD" /user:AZURE\gitfileshare /persistent:no
142+
cmd /c mklink /d "$(Build.SourcesDirectory)\test-cache" S:\
143+
}
144+
displayName: 'Mount test-cache'
145+
env:
146+
GITFILESHAREPWD: $(gitfileshare.pwd)
147+
- powershell: |
148+
$urlbase = "https://dev.azure.com/git-for-windows/git/_apis/build/builds"
149+
$id = ((Invoke-WebRequest -UseBasicParsing "${urlbase}?definitions=22&statusFilter=completed&resultFilter=succeeded&`$top=1").content | ConvertFrom-JSON).value[0].id
150+
$downloadUrl = ((Invoke-WebRequest -UseBasicParsing "${urlbase}/$id/artifacts").content | ConvertFrom-JSON).value[1].resource.downloadUrl
151+
(New-Object Net.WebClient).DownloadFile($downloadUrl,"git-sdk-64-minimal.zip")
152+
Expand-Archive git-sdk-64-minimal.zip -DestinationPath . -Force
153+
Remove-Item git-sdk-64-minimal.zip
154+
155+
# Let Git ignore the SDK and the test-cache
156+
"/git-sdk-64-minimal/`n/test-cache/`n" | Out-File -NoNewLine -Encoding ascii -Append "$(Build.SourcesDirectory)\.git\info\exclude"
157+
displayName: 'Download git-sdk-64-minimal'
158+
- powershell: |
159+
& git-sdk-64-minimal\usr\bin\bash.exe -lc @"
160+
make vcxproj
161+
"@
162+
if (!$?) { exit(1) }
163+
displayName: Generate Visual Studio Solution
164+
env:
165+
HOME: $(Build.SourcesDirectory)
166+
MSYSTEM: MINGW64
167+
DEVELOPER: 1
168+
NO_PERL: 1
169+
GIT_CONFIG_PARAMETERS: "'user.name=CI' 'user.email=ci@git'"
170+
- powershell: |
171+
$urlbase = "https://dev.azure.com/git/git/_apis/build/builds"
172+
$id = ((Invoke-WebRequest -UseBasicParsing "${urlbase}?definitions=9&statusFilter=completed&resultFilter=succeeded&`$top=1").content | ConvertFrom-JSON).value[0].id
173+
$downloadUrl = ((Invoke-WebRequest -UseBasicParsing "${urlbase}/$id/artifacts").content | ConvertFrom-JSON).value[0].resource.downloadUrl
174+
(New-Object Net.WebClient).DownloadFile($downloadUrl, "compat.zip")
175+
Expand-Archive compat.zip -DestinationPath . -Force
176+
Remove-Item compat.zip
177+
displayName: 'Download vcpkg artifacts'
178+
- task: MSBuild@1
179+
inputs:
180+
solution: git.sln
181+
platform: x64
182+
configuration: Release
183+
maximumCpuCount: 4
184+
- powershell: |
185+
& compat\vcbuild\vcpkg_copy_dlls.bat release
186+
if (!$?) { exit(1) }
187+
& git-sdk-64-minimal\usr\bin\bash.exe -lc @"
188+
mkdir -p artifacts &&
189+
eval \"`$(make -n artifacts-tar INCLUDE_DLLS_IN_ARTIFACTS=YesPlease ARTIFACTS_DIRECTORY=artifacts | grep ^tar)\"
190+
"@
191+
if (!$?) { exit(1) }
192+
displayName: Bundle artifact tar
193+
env:
194+
HOME: $(Build.SourcesDirectory)
195+
MSYSTEM: MINGW64
196+
DEVELOPER: 1
197+
NO_PERL: 1
198+
MSVC: 1
199+
VCPKG_ROOT: $(Build.SourcesDirectory)\compat\vcbuild\vcpkg
200+
- powershell: |
201+
$tag = (Invoke-WebRequest -UseBasicParsing "https://gitforwindows.org/latest-tag.txt").content
202+
$version = (Invoke-WebRequest -UseBasicParsing "https://gitforwindows.org/latest-version.txt").content
203+
$url = "https://github.com/git-for-windows/git/releases/download/${tag}/PortableGit-${version}-64-bit.7z.exe"
204+
(New-Object Net.WebClient).DownloadFile($url,"PortableGit.exe")
205+
& .\PortableGit.exe -y -oartifacts\PortableGit
206+
# Wait until it is unpacked
207+
while (-not @(Remove-Item -ErrorAction SilentlyContinue PortableGit.exe; $?)) { sleep 1 }
208+
displayName: Download & extract portable Git
209+
- task: PublishPipelineArtifact@0
210+
displayName: 'Publish Pipeline Artifact: MSVC test artifacts'
211+
inputs:
212+
artifactName: 'vs-artifacts'
213+
targetPath: '$(Build.SourcesDirectory)\artifacts'
214+
- powershell: |
215+
if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
216+
cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
217+
}
218+
displayName: 'Unmount test-cache'
219+
condition: true
220+
env:
221+
GITFILESHAREPWD: $(gitfileshare.pwd)
222+
223+
- job: vs_test
224+
displayName: Visual Studio Test
225+
dependsOn: vs_build
226+
condition: succeeded()
227+
pool: Hosted
228+
timeoutInMinutes: 240
229+
strategy:
230+
parallel: 10
231+
steps:
232+
- powershell: |
233+
if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
234+
net use s: \\gitfileshare.file.core.windows.net\test-cache "$GITFILESHAREPWD" /user:AZURE\gitfileshare /persistent:no
235+
cmd /c mklink /d "$(Build.SourcesDirectory)\test-cache" S:\
236+
}
237+
displayName: 'Mount test-cache'
238+
env:
239+
GITFILESHAREPWD: $(gitfileshare.pwd)
240+
- task: DownloadPipelineArtifact@0
241+
displayName: 'Download Pipeline Artifact: VS test artifacts'
242+
inputs:
243+
artifactName: 'vs-artifacts'
244+
targetPath: '$(Build.SourcesDirectory)'
245+
- powershell: |
246+
& PortableGit\git-cmd.exe --command=usr\bin\bash.exe -lc @"
247+
test -f artifacts.tar.gz || {
248+
echo No test artifacts found\; skipping >&2
249+
exit 0
250+
}
251+
tar xf artifacts.tar.gz || exit 1
252+
253+
# Let Git ignore the SDK and the test-cache
254+
printf '%s\n' /PortableGit/ /test-cache/ >>.git/info/exclude
255+
256+
cd t &&
257+
PATH=\"`$PWD/helper:`$PATH\" &&
258+
test-tool.exe run-command testsuite -V -x --write-junit-xml \
259+
`$(test-tool.exe path-utils slice-tests \
260+
`$SYSTEM_JOBPOSITIONINPHASE `$SYSTEM_TOTALJOBSINPHASE t[0-9]*.sh)
261+
"@
262+
if (!$?) { exit(1) }
263+
displayName: 'Test (parallel)'
264+
env:
265+
HOME: $(Build.SourcesDirectory)
266+
MSYSTEM: MINGW64
267+
NO_SVN_TESTS: 1
268+
GIT_TEST_SKIP_REBASE_P: 1
269+
- powershell: |
270+
if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
271+
cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
272+
}
273+
displayName: 'Unmount test-cache'
274+
condition: true
275+
env:
276+
GITFILESHAREPWD: $(gitfileshare.pwd)
277+
- task: PublishTestResults@2
278+
displayName: 'Publish Test Results **/TEST-*.xml'
279+
inputs:
280+
mergeTestResults: true
281+
testRunTitle: 'vs'
282+
platform: Windows
283+
publishRunAttachments: false
284+
condition: succeededOrFailed()
285+
- task: PublishBuildArtifacts@1
286+
displayName: 'Publish trash directories of failed tests'
287+
condition: failed()
288+
inputs:
289+
PathtoPublish: t/failed-test-artifacts
290+
ArtifactName: failed-vs-test-artifacts
291+
133292
- job: linux_clang
134293
displayName: linux-clang
135294
condition: succeeded()

0 commit comments

Comments
 (0)