• Johannes Schindelin's avatar
    ci: parallelize testing on Windows · b819f1d2
    Johannes Schindelin authored
    The fact that Git's test suite is implemented in Unix shell script that
    is as portable as we can muster, combined with the fact that Unix shell
    scripting is foreign to Windows (and therefore has to be emulated),
    results in pretty abysmal speed of the test suite on that platform, for
    pretty much no other reason than that language choice.
    
    For comparison: while the Linux build & test is typically done within
    about 8 minutes, the Windows build & test typically lasts about 80
    minutes in Azure Pipelines.
    
    To help with that, let's use the Azure Pipeline feature where you can
    parallelize jobs, make jobs depend on each other, and pass artifacts
    between them.
    
    The tests are distributed using the following heuristic: listing all
    test scripts ordered by size in descending order (as a cheap way to
    estimate the overall run time), every Nth script is run (where N is the
    total number of parallel jobs), starting at the index corresponding to
    the parallel job. This slicing is performed by a new function that is
    added to the `test-tool`.
    
    To optimize the overall runtime of the entire Pipeline, we need to move
    the Windows jobs to the beginning (otherwise there would be a very
    decent chance for the Pipeline to be run only the Windows build, while
    all the parallel Windows test jobs wait for this single one).
    
    We use Azure Pipelines Artifacts for both the minimal Git for Windows
    SDK as well as the built executables, as deduplication and caching close
    to the agents makes that really fast. For comparison: while downloading
    and unpacking the minimal Git for Windows SDK via PowerShell takes only
    one minute (down from anywhere between 2.5 to 7 when using a shallow
    clone), uploading it as Pipeline Artifact takes less than 30s and
    downloading and unpacking less than 20s (sometimes even as little as
    only twelve seconds).
    Signed-off-by: Johannes Schindelin's avatarJohannes Schindelin <johannes.schindelin@gmx.de>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    b819f1d2
azure-pipelines.yml 13.7 KB