summaryrefslogtreecommitdiff
path: root/.github/workflows/main.yml
diff options
context:
space:
mode:
Diffstat (limited to '.github/workflows/main.yml')
-rw-r--r--.github/workflows/main.yml444
1 files changed, 282 insertions, 162 deletions
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 84a5dcf..3428773 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,157 +1,185 @@
-name: CI/PR
+name: CI
on: [push, pull_request]
env:
DEVELOPER: 1
+# If more than one workflow run is triggered for the very same commit hash
+# (which happens when multiple branches pointing to the same commit), only
+# the first one is allowed to run, the second will be kept in the "queued"
+# state. This allows a successful completion of the first run to be reused
+# in the second run via the `skip-if-redundant` logic in the `config` job.
+#
+# The only caveat is that if a workflow run is triggered for the same commit
+# hash that another run is already being held, that latter run will be
+# canceled. For more details about the `concurrency` attribute, see:
+# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#concurrency
+concurrency:
+ group: ${{ github.sha }}
+
jobs:
ci-config:
- runs-on: ubuntu-latest
- outputs:
- enabled: ${{ steps.check-ref.outputs.enabled }}
- steps:
- - name: try to clone ci-config branch
- continue-on-error: true
- 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
- - 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 }}'
+ name: config
+ if: vars.CI_BRANCHES == '' || contains(vars.CI_BRANCHES, github.ref_name)
+ 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
+ then
+ echo "::warning::ci/config/allow-ref is deprecated; use CI_BRANCHES instead"
+ if ! config-repo/ci/config/allow-ref '${{ github.ref }}'
then
enabled=no
fi
- echo "::set-output name=enabled::$enabled"
+ 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@v7
+ 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@v1
- - name: download git-sdk-64-minimal
- shell: bash
- run: |
- ## Get artifact
- urlbase=https://dev.azure.com/git-for-windows/git/_apis/build/builds
- id=$(curl "$urlbase?definitions=22&statusFilter=completed&resultFilter=succeeded&\$top=1" |
- jq -r ".value[] | .id")
- download_url="$(curl "$urlbase/$id/artifacts" |
- jq -r '.value[] | select(.name == "git-sdk-64-minimal").resource.downloadUrl')"
- curl --connect-timeout 10 --retry 5 --retry-delay 0 --retry-max-time 240 \
- -o artifacts.zip "$download_url"
-
- ## Unzip and remove the artifact
- unzip artifacts.zip
- rm artifacts.zip
+ - uses: actions/checkout@v4
+ - uses: git-for-windows/setup-git-for-windows-sdk@v1
- name: build
- shell: powershell
+ shell: bash
env:
HOME: ${{runner.workspace}}
- MSYSTEM: MINGW64
NO_PERL: 1
- run: |
- & .\git-sdk-64-minimal\usr\bin\bash.exe -lc @"
- printf '%s\n' /git-sdk-64-minimal/ >>.git/info/exclude
-
- ci/make-test-artifacts.sh artifacts
- "@
- - name: upload build artifacts
- uses: actions/upload-artifact@v1
+ 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@v4
with:
name: windows-artifacts
path: artifacts
- - name: upload git-sdk-64-minimal
- uses: actions/upload-artifact@v1
- with:
- name: git-sdk-64-minimal
- path: git-sdk-64-minimal
windows-test:
+ name: win test
runs-on: windows-latest
- needs: [windows-build]
+ 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:
- - uses: actions/checkout@v1
- - name: download build artifacts
- uses: actions/download-artifact@v1
+ - name: download tracked files and build artifacts
+ uses: actions/download-artifact@v4
with:
name: windows-artifacts
path: ${{github.workspace}}
- - name: extract build artifacts
+ - name: extract tracked files and build artifacts
shell: bash
- run: tar xf artifacts.tar.gz
- - name: download git-sdk-64-minimal
- uses: actions/download-artifact@v1
- with:
- name: git-sdk-64-minimal
- path: ${{github.workspace}}/git-sdk-64-minimal/
+ run: tar xf artifacts.tar.gz && tar xf tracked.tar.gz
+ - uses: git-for-windows/setup-git-for-windows-sdk@v1
- name: test
- shell: powershell
- run: |
- & .\git-sdk-64-minimal\usr\bin\bash.exe -lc @"
- # Let Git ignore the SDK
- printf '%s\n' /git-sdk-64-minimal/ >>.git/info/exclude
-
- ci/run-test-slice.sh ${{matrix.nr}} 10
- "@
- - name: ci/print-test-failures.sh
- if: failure()
- shell: powershell
- run: |
- & .\git-sdk-64-minimal\usr\bin\bash.exe -lc ci/print-test-failures.sh
+ 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@v1
+ uses: actions/upload-artifact@v4
with:
- name: failed-tests-windows
+ name: failed-tests-windows-${{ matrix.nr }}
path: ${{env.FAILED_TEST_ARTIFACTS}}
vs-build:
+ name: win+VS build
needs: ci-config
- if: needs.ci-config.outputs.enabled == 'yes'
+ if: github.event.repository.owner.login == 'git-for-windows' && needs.ci-config.outputs.enabled == 'yes'
env:
- MSYSTEM: MINGW64
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@v1
- - name: download git-sdk-64-minimal
- shell: bash
- run: |
- ## Get artifact
- urlbase=https://dev.azure.com/git-for-windows/git/_apis/build/builds
- id=$(curl "$urlbase?definitions=22&statusFilter=completed&resultFilter=succeeded&\$top=1" |
- jq -r ".value[] | .id")
- download_url="$(curl "$urlbase/$id/artifacts" |
- jq -r '.value[] | select(.name == "git-sdk-64-minimal").resource.downloadUrl')"
- curl --connect-timeout 10 --retry 5 --retry-delay 0 --retry-max-time 240 \
- -o artifacts.zip "$download_url"
-
- ## Unzip and remove the artifact
- unzip artifacts.zip
- rm artifacts.zip
- - name: generate Visual Studio solution
- shell: powershell
- run: |
- & .\git-sdk-64-minimal\usr\bin\bash.exe -lc @"
- make NDEBUG=1 DEVELOPER=1 vcxproj
- "@
- if (!$?) { exit(1) }
+ - uses: actions/checkout@v4
+ - uses: git-for-windows/setup-git-for-windows-sdk@v1
+ - name: initialize vcpkg
+ uses: actions/checkout@v4
+ with:
+ repository: 'microsoft/vcpkg'
+ path: 'compat/vcbuild/vcpkg'
- name: download vcpkg artifacts
shell: powershell
run: |
@@ -162,124 +190,185 @@ jobs:
Expand-Archive compat.zip -DestinationPath . -Force
Remove-Item compat.zip
- name: add msbuild to PATH
- uses: microsoft/setup-msbuild@v1.0.0
+ 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: powershell
+ shell: bash
env:
MSVC: 1
VCPKG_ROOT: ${{github.workspace}}\compat\vcbuild\vcpkg
run: |
- & compat\vcbuild\vcpkg_copy_dlls.bat release
- if (!$?) { exit(1) }
- & git-sdk-64-minimal\usr\bin\bash.exe -lc @"
- mkdir -p artifacts &&
- eval \"`$(make -n artifacts-tar INCLUDE_DLLS_IN_ARTIFACTS=YesPlease ARTIFACTS_DIRECTORY=artifacts 2>&1 | grep ^tar)\"
- "@
- - name: upload build artifacts
- uses: actions/upload-artifact@v1
+ 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@v4
with:
name: vs-artifacts
path: artifacts
vs-test:
+ name: win+VS test
runs-on: windows-latest
- needs: [vs-build, windows-build]
+ 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: actions/checkout@v1
- - name: download git-sdk-64-minimal
- uses: actions/download-artifact@v1
- with:
- name: git-sdk-64-minimal
- path: ${{github.workspace}}/git-sdk-64-minimal/
- - name: download build artifacts
- uses: actions/download-artifact@v1
+ - uses: git-for-windows/setup-git-for-windows-sdk@v1
+ - name: download tracked files and build artifacts
+ uses: actions/download-artifact@v4
with:
name: vs-artifacts
path: ${{github.workspace}}
- - name: extract build artifacts
+ - name: extract tracked files and build artifacts
+ shell: bash
+ run: tar xf artifacts.tar.gz && tar xf tracked.tar.gz
+ - name: test
shell: bash
- run: tar xf artifacts.tar.gz
- - name: test (parallel)
- shell: powershell
env:
- MSYSTEM: MINGW64
NO_SVN_TESTS: 1
- GIT_TEST_SKIP_REBASE_P: 1
- run: |
- & .\git-sdk-64-minimal\usr\bin\bash.exe -lc @"
- # Let Git ignore the SDK and the test-cache
- printf '%s\n' /git-sdk-64-minimal/ /test-cache/ >>.git/info/exclude
-
- cd t &&
- PATH=\"`$PWD/helper:`$PATH\" &&
- test-tool.exe run-command testsuite --jobs=10 -V -x --write-junit-xml \
- `$(test-tool.exe path-utils slice-tests \
- ${{matrix.nr}} 10 t[0-9]*.sh)
- "@
+ 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@v4
+ with:
+ name: failed-tests-windows-vs-${{ matrix.nr }}
+ 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-clang
+ - jobname: linux-sha256
+ cc: clang
+ pool: ubuntu-latest
+ - jobname: linux-reftable
cc: clang
pool: ubuntu-latest
- jobname: linux-gcc
cc: gcc
- pool: ubuntu-latest
+ 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-latest
+ pool: macos-13
+ - jobname: osx-reftable
+ cc: clang
+ pool: macos-13
- jobname: osx-gcc
cc: gcc
- pool: macos-latest
- - jobname: GETTEXT_POISON
+ cc_package: gcc-13
+ pool: macos-13
+ - jobname: linux-gcc-default
+ cc: gcc
+ pool: ubuntu-latest
+ - jobname: linux-leaks
cc: gcc
pool: ubuntu-latest
+ - jobname: linux-reftable-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@v1
+ - uses: actions/checkout@v4
- run: ci/install-dependencies.sh
- run: ci/run-build-and-tests.sh
- - run: ci/print-test-failures.sh
- if: failure()
+ - 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@v1
+ uses: actions/upload-artifact@v4
with:
name: failed-tests-${{matrix.vector.jobname}}
path: ${{env.FAILED_TEST_ARTIFACTS}}
+ fuzz-smoke-test:
+ name: fuzz smoke test
+ needs: ci-config
+ if: needs.ci-config.outputs.enabled == 'yes'
+ env:
+ CC: clang
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - run: ci/install-dependencies.sh
+ - run: ci/run-build-and-minimal-fuzzers.sh
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
+ - 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@v1
+ - uses: actions/checkout@v4
+ if: matrix.vector.jobname != 'linux32'
+ - uses: actions/checkout@v1 # cannot be upgraded because Node.js Actions aren't supported in this container
+ if: matrix.vector.jobname == 'linux32'
- run: ci/install-docker-dependencies.sh
- run: ci/run-build-and-tests.sh
- - run: ci/print-test-failures.sh
- if: failure()
- - name: Upload failed tests' directories
+ - name: print test failures
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
- uses: actions/upload-artifact@v1
+ 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@v4
+ 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 # cannot be upgraded because Node.js Actions aren't supported in this container
with:
name: failed-tests-${{matrix.vector.jobname}}
path: ${{env.FAILED_TEST_ARTIFACTS}}
@@ -288,18 +377,49 @@ jobs:
if: needs.ci-config.outputs.enabled == 'yes'
env:
jobname: StaticAnalysis
- runs-on: ubuntu-latest
+ 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@v1
+ - uses: actions/checkout@v4
- 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@v4
+ - 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@v1
+ - uses: actions/checkout@v4
- run: ci/install-dependencies.sh
- run: ci/test-documentation.sh