Since the linux-asan-ubsan job runs using clang under Linux, there is not much point in running a separate clang job. Any errors that a normal clang compile-and-test cycle would find are likely to be a subset of what the sanitizer job will find. Since this job takes ~14 minutes to run in CI, this shaves off some of our CPU load (though it does not affect end-to-end runtime, since it's typically run in parallel and is not the longest job). Technically this provides us with slightly less signal for a given run, since you won't immediately know if a failure in the sanitizer job is from using clang or from the sanitizers themselves. But it's generally obvious from the logs, and anyway your next step would be to fix the probvlem and re-run CI, since we expect all of these jobs to pass normally. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
389 lines
14 KiB
YAML
389 lines
14 KiB
YAML
name: CI
|
|
|
|
on: [push, pull_request]
|
|
|
|
env:
|
|
DEVELOPER: 1
|
|
|
|
jobs:
|
|
ci-config:
|
|
name: config
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
enabled: ${{ steps.check-ref.outputs.enabled }}${{ steps.skip-if-redundant.outputs.enabled }}
|
|
skip_concurrent: ${{ steps.check-ref.outputs.skip_concurrent }}
|
|
steps:
|
|
- name: try to clone ci-config branch
|
|
run: |
|
|
git -c protocol.version=2 clone \
|
|
--no-tags \
|
|
--single-branch \
|
|
-b ci-config \
|
|
--depth 1 \
|
|
--no-checkout \
|
|
--filter=blob:none \
|
|
https://github.com/${{ github.repository }} \
|
|
config-repo &&
|
|
cd config-repo &&
|
|
git checkout HEAD -- ci/config || : ignore
|
|
- id: check-ref
|
|
name: check whether CI is enabled for ref
|
|
run: |
|
|
enabled=yes
|
|
if test -x config-repo/ci/config/allow-ref &&
|
|
! config-repo/ci/config/allow-ref '${{ github.ref }}'
|
|
then
|
|
enabled=no
|
|
fi
|
|
|
|
skip_concurrent=yes
|
|
if test -x config-repo/ci/config/skip-concurrent &&
|
|
! config-repo/ci/config/skip-concurrent '${{ github.ref }}'
|
|
then
|
|
skip_concurrent=no
|
|
fi
|
|
echo "enabled=$enabled" >>$GITHUB_OUTPUT
|
|
echo "skip_concurrent=$skip_concurrent" >>$GITHUB_OUTPUT
|
|
- name: skip if the commit or tree was already tested
|
|
id: skip-if-redundant
|
|
uses: actions/github-script@v6
|
|
if: steps.check-ref.outputs.enabled == 'yes'
|
|
with:
|
|
github-token: ${{secrets.GITHUB_TOKEN}}
|
|
script: |
|
|
try {
|
|
// Figure out workflow ID, commit and tree
|
|
const { data: run } = await github.rest.actions.getWorkflowRun({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
run_id: context.runId,
|
|
});
|
|
const workflow_id = run.workflow_id;
|
|
const head_sha = run.head_sha;
|
|
const tree_id = run.head_commit.tree_id;
|
|
|
|
// See whether there is a successful run for that commit or tree
|
|
const { data: runs } = await github.rest.actions.listWorkflowRuns({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
per_page: 500,
|
|
status: 'success',
|
|
workflow_id,
|
|
});
|
|
for (const run of runs.workflow_runs) {
|
|
if (head_sha === run.head_sha) {
|
|
core.warning(`Successful run for the commit ${head_sha}: ${run.html_url}`);
|
|
core.setOutput('enabled', ' but skip');
|
|
break;
|
|
}
|
|
if (run.head_commit && tree_id === run.head_commit.tree_id) {
|
|
core.warning(`Successful run for the tree ${tree_id}: ${run.html_url}`);
|
|
core.setOutput('enabled', ' but skip');
|
|
break;
|
|
}
|
|
}
|
|
} catch (e) {
|
|
core.warning(e);
|
|
}
|
|
|
|
windows-build:
|
|
name: win build
|
|
needs: ci-config
|
|
if: needs.ci-config.outputs.enabled == 'yes'
|
|
runs-on: windows-latest
|
|
concurrency:
|
|
group: windows-build-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: git-for-windows/setup-git-for-windows-sdk@v1
|
|
- name: build
|
|
shell: bash
|
|
env:
|
|
HOME: ${{runner.workspace}}
|
|
NO_PERL: 1
|
|
run: . /etc/profile && ci/make-test-artifacts.sh artifacts
|
|
- name: zip up tracked files
|
|
run: git archive -o artifacts/tracked.tar.gz HEAD
|
|
- name: upload tracked files and build artifacts
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: windows-artifacts
|
|
path: artifacts
|
|
windows-test:
|
|
name: win test
|
|
runs-on: windows-latest
|
|
needs: [ci-config, windows-build]
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
concurrency:
|
|
group: windows-test-${{ matrix.nr }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
steps:
|
|
- name: download tracked files and build artifacts
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: windows-artifacts
|
|
path: ${{github.workspace}}
|
|
- name: extract tracked files and build artifacts
|
|
shell: bash
|
|
run: tar xf artifacts.tar.gz && tar xf tracked.tar.gz
|
|
- uses: git-for-windows/setup-git-for-windows-sdk@v1
|
|
- name: test
|
|
shell: bash
|
|
run: . /etc/profile && ci/run-test-slice.sh ${{matrix.nr}} 10
|
|
- name: print test failures
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
|
shell: bash
|
|
run: ci/print-test-failures.sh
|
|
- name: Upload failed tests' directories
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: failed-tests-windows
|
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
|
vs-build:
|
|
name: win+VS build
|
|
needs: ci-config
|
|
if: github.event.repository.owner.login == 'git-for-windows' && needs.ci-config.outputs.enabled == 'yes'
|
|
env:
|
|
NO_PERL: 1
|
|
GIT_CONFIG_PARAMETERS: "'user.name=CI' 'user.email=ci@git'"
|
|
runs-on: windows-latest
|
|
concurrency:
|
|
group: vs-build-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: git-for-windows/setup-git-for-windows-sdk@v1
|
|
- name: initialize vcpkg
|
|
uses: actions/checkout@v3
|
|
with:
|
|
repository: 'microsoft/vcpkg'
|
|
path: 'compat/vcbuild/vcpkg'
|
|
- name: download vcpkg artifacts
|
|
shell: powershell
|
|
run: |
|
|
$urlbase = "https://dev.azure.com/git/git/_apis/build/builds"
|
|
$id = ((Invoke-WebRequest -UseBasicParsing "${urlbase}?definitions=9&statusFilter=completed&resultFilter=succeeded&`$top=1").content | ConvertFrom-JSON).value[0].id
|
|
$downloadUrl = ((Invoke-WebRequest -UseBasicParsing "${urlbase}/$id/artifacts").content | ConvertFrom-JSON).value[0].resource.downloadUrl
|
|
(New-Object Net.WebClient).DownloadFile($downloadUrl, "compat.zip")
|
|
Expand-Archive compat.zip -DestinationPath . -Force
|
|
Remove-Item compat.zip
|
|
- name: add msbuild to PATH
|
|
uses: microsoft/setup-msbuild@v1
|
|
- name: copy dlls to root
|
|
shell: cmd
|
|
run: compat\vcbuild\vcpkg_copy_dlls.bat release
|
|
- name: generate Visual Studio solution
|
|
shell: bash
|
|
run: |
|
|
cmake `pwd`/contrib/buildsystems/ -DCMAKE_PREFIX_PATH=`pwd`/compat/vcbuild/vcpkg/installed/x64-windows \
|
|
-DNO_GETTEXT=YesPlease -DPERL_TESTS=OFF -DPYTHON_TESTS=OFF -DCURL_NO_CURL_CMAKE=ON
|
|
- name: MSBuild
|
|
run: msbuild git.sln -property:Configuration=Release -property:Platform=x64 -maxCpuCount:4 -property:PlatformToolset=v142
|
|
- name: bundle artifact tar
|
|
shell: bash
|
|
env:
|
|
MSVC: 1
|
|
VCPKG_ROOT: ${{github.workspace}}\compat\vcbuild\vcpkg
|
|
run: |
|
|
mkdir -p artifacts &&
|
|
eval "$(make -n artifacts-tar INCLUDE_DLLS_IN_ARTIFACTS=YesPlease ARTIFACTS_DIRECTORY=artifacts NO_GETTEXT=YesPlease 2>&1 | grep ^tar)"
|
|
- name: zip up tracked files
|
|
run: git archive -o artifacts/tracked.tar.gz HEAD
|
|
- name: upload tracked files and build artifacts
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: vs-artifacts
|
|
path: artifacts
|
|
vs-test:
|
|
name: win+VS test
|
|
runs-on: windows-latest
|
|
needs: [ci-config, vs-build]
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
concurrency:
|
|
group: vs-test-${{ matrix.nr }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
steps:
|
|
- uses: git-for-windows/setup-git-for-windows-sdk@v1
|
|
- name: download tracked files and build artifacts
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: vs-artifacts
|
|
path: ${{github.workspace}}
|
|
- name: extract tracked files and build artifacts
|
|
shell: bash
|
|
run: tar xf artifacts.tar.gz && tar xf tracked.tar.gz
|
|
- name: test
|
|
shell: bash
|
|
env:
|
|
NO_SVN_TESTS: 1
|
|
run: . /etc/profile && ci/run-test-slice.sh ${{matrix.nr}} 10
|
|
- name: print test failures
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
|
shell: bash
|
|
run: ci/print-test-failures.sh
|
|
- name: Upload failed tests' directories
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: failed-tests-windows
|
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
|
regular:
|
|
name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
|
|
needs: ci-config
|
|
if: needs.ci-config.outputs.enabled == 'yes'
|
|
concurrency:
|
|
group: ${{ matrix.vector.jobname }}-${{ matrix.vector.pool }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
vector:
|
|
- jobname: linux-sha256
|
|
cc: clang
|
|
pool: ubuntu-latest
|
|
- jobname: linux-gcc
|
|
cc: gcc
|
|
cc_package: gcc-8
|
|
pool: ubuntu-20.04
|
|
- jobname: linux-TEST-vars
|
|
cc: gcc
|
|
cc_package: gcc-8
|
|
pool: ubuntu-20.04
|
|
- jobname: osx-clang
|
|
cc: clang
|
|
pool: macos-12
|
|
- jobname: osx-gcc
|
|
cc: gcc
|
|
cc_package: gcc-9
|
|
pool: macos-12
|
|
- jobname: linux-gcc-default
|
|
cc: gcc
|
|
pool: ubuntu-latest
|
|
- jobname: linux-leaks
|
|
cc: gcc
|
|
pool: ubuntu-latest
|
|
- jobname: linux-asan-ubsan
|
|
cc: clang
|
|
pool: ubuntu-latest
|
|
env:
|
|
CC: ${{matrix.vector.cc}}
|
|
CC_PACKAGE: ${{matrix.vector.cc_package}}
|
|
jobname: ${{matrix.vector.jobname}}
|
|
runs_on_pool: ${{matrix.vector.pool}}
|
|
runs-on: ${{matrix.vector.pool}}
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- run: ci/install-dependencies.sh
|
|
- run: ci/run-build-and-tests.sh
|
|
- name: print test failures
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
|
run: ci/print-test-failures.sh
|
|
- name: Upload failed tests' directories
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: failed-tests-${{matrix.vector.jobname}}
|
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
|
dockerized:
|
|
name: ${{matrix.vector.jobname}} (${{matrix.vector.image}})
|
|
needs: ci-config
|
|
if: needs.ci-config.outputs.enabled == 'yes'
|
|
concurrency:
|
|
group: dockerized-${{ matrix.vector.jobname }}-${{ matrix.vector.image }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
vector:
|
|
- jobname: linux-musl
|
|
image: alpine
|
|
- jobname: linux32
|
|
image: daald/ubuntu32:xenial
|
|
- jobname: pedantic
|
|
image: fedora
|
|
env:
|
|
jobname: ${{matrix.vector.jobname}}
|
|
runs-on: ubuntu-latest
|
|
container: ${{matrix.vector.image}}
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
if: matrix.vector.jobname != 'linux32'
|
|
- uses: actions/checkout@v1
|
|
if: matrix.vector.jobname == 'linux32'
|
|
- run: ci/install-docker-dependencies.sh
|
|
- run: ci/run-build-and-tests.sh
|
|
- name: print test failures
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
|
run: ci/print-test-failures.sh
|
|
- name: Upload failed tests' directories
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != '' && matrix.vector.jobname != 'linux32'
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: failed-tests-${{matrix.vector.jobname}}
|
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
|
- name: Upload failed tests' directories
|
|
if: failure() && env.FAILED_TEST_ARTIFACTS != '' && matrix.vector.jobname == 'linux32'
|
|
uses: actions/upload-artifact@v1
|
|
with:
|
|
name: failed-tests-${{matrix.vector.jobname}}
|
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
|
static-analysis:
|
|
needs: ci-config
|
|
if: needs.ci-config.outputs.enabled == 'yes'
|
|
env:
|
|
jobname: StaticAnalysis
|
|
runs-on: ubuntu-22.04
|
|
concurrency:
|
|
group: static-analysis-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- run: ci/install-dependencies.sh
|
|
- run: ci/run-static-analysis.sh
|
|
- run: ci/check-directional-formatting.bash
|
|
sparse:
|
|
needs: ci-config
|
|
if: needs.ci-config.outputs.enabled == 'yes'
|
|
env:
|
|
jobname: sparse
|
|
runs-on: ubuntu-20.04
|
|
concurrency:
|
|
group: sparse-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
steps:
|
|
- name: Download a current `sparse` package
|
|
# Ubuntu's `sparse` version is too old for us
|
|
uses: git-for-windows/get-azure-pipelines-artifact@v0
|
|
with:
|
|
repository: git/git
|
|
definitionId: 10
|
|
artifact: sparse-20.04
|
|
- name: Install the current `sparse` package
|
|
run: sudo dpkg -i sparse-20.04/sparse_*.deb
|
|
- uses: actions/checkout@v3
|
|
- name: Install other dependencies
|
|
run: ci/install-dependencies.sh
|
|
- run: make sparse
|
|
documentation:
|
|
name: documentation
|
|
needs: ci-config
|
|
if: needs.ci-config.outputs.enabled == 'yes'
|
|
concurrency:
|
|
group: documentation-${{ github.ref }}
|
|
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
|
|
env:
|
|
jobname: Documentation
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- run: ci/install-dependencies.sh
|
|
- run: ci/test-documentation.sh
|