351 lines
12 KiB
YAML
351 lines
12 KiB
YAML
|
name: CI/PR
|
||
|
|
||
|
on: [push, pull_request]
|
||
|
|
||
|
env:
|
||
|
DEVELOPER: 1
|
||
|
|
||
|
jobs:
|
||
|
ci-config:
|
||
|
runs-on: ubuntu-latest
|
||
|
outputs:
|
||
|
enabled: ${{ steps.check-ref.outputs.enabled }}${{ steps.skip-if-redundant.outputs.enabled }}
|
||
|
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
|
||
|
echo "::set-output name=enabled::$enabled"
|
||
|
- name: skip if the commit or tree was already tested
|
||
|
id: skip-if-redundant
|
||
|
uses: actions/github-script@v3
|
||
|
if: steps.check-ref.outputs.enabled == 'yes'
|
||
|
with:
|
||
|
github-token: ${{secrets.GITHUB_TOKEN}}
|
||
|
script: |
|
||
|
// Figure out workflow ID, commit and tree
|
||
|
const { data: run } = await github.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.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 (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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
windows-build:
|
||
|
needs: ci-config
|
||
|
if: needs.ci-config.outputs.enabled == 'yes'
|
||
|
runs-on: windows-latest
|
||
|
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: build
|
||
|
shell: powershell
|
||
|
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
|
||
|
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:
|
||
|
runs-on: windows-latest
|
||
|
needs: [windows-build]
|
||
|
strategy:
|
||
|
matrix:
|
||
|
nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||
|
steps:
|
||
|
- uses: actions/checkout@v1
|
||
|
- name: download build artifacts
|
||
|
uses: actions/download-artifact@v1
|
||
|
with:
|
||
|
name: windows-artifacts
|
||
|
path: ${{github.workspace}}
|
||
|
- name: extract 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/
|
||
|
- 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
|
||
|
- name: Upload failed tests' directories
|
||
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
||
|
uses: actions/upload-artifact@v1
|
||
|
with:
|
||
|
name: failed-tests-windows
|
||
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
||
|
vs-build:
|
||
|
needs: ci-config
|
||
|
if: 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
|
||
|
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: 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: powershell
|
||
|
run: |
|
||
|
& compat\vcbuild\vcpkg_copy_dlls.bat release
|
||
|
if (!$?) { exit(1) }
|
||
|
- name: generate Visual Studio solution
|
||
|
shell: bash
|
||
|
run: |
|
||
|
cmake `pwd`/contrib/buildsystems/ -DCMAKE_PREFIX_PATH=`pwd`/compat/vcbuild/vcpkg/installed/x64-windows \
|
||
|
-DIconv_LIBRARY=`pwd`/compat/vcbuild/vcpkg/installed/x64-windows/lib/libiconv.lib -DIconv_INCLUDE_DIR=`pwd`/compat/vcbuild/vcpkg/installed/x64-windows/include \
|
||
|
-DMSGFMT_EXE=`pwd`/git-sdk-64-minimal/mingw64/bin/msgfmt.exe -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
|
||
|
env:
|
||
|
MSVC: 1
|
||
|
VCPKG_ROOT: ${{github.workspace}}\compat\vcbuild\vcpkg
|
||
|
run: |
|
||
|
& 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
|
||
|
with:
|
||
|
name: vs-artifacts
|
||
|
path: artifacts
|
||
|
vs-test:
|
||
|
runs-on: windows-latest
|
||
|
needs: [vs-build, windows-build]
|
||
|
strategy:
|
||
|
matrix:
|
||
|
nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||
|
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
|
||
|
with:
|
||
|
name: vs-artifacts
|
||
|
path: ${{github.workspace}}
|
||
|
- name: extract build artifacts
|
||
|
shell: bash
|
||
|
run: tar xf artifacts.tar.gz
|
||
|
- name: test
|
||
|
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
|
||
|
|
||
|
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
|
||
|
- name: Upload failed tests' directories
|
||
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
||
|
uses: actions/upload-artifact@v1
|
||
|
with:
|
||
|
name: failed-tests-windows
|
||
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
||
|
regular:
|
||
|
needs: ci-config
|
||
|
if: needs.ci-config.outputs.enabled == 'yes'
|
||
|
strategy:
|
||
|
matrix:
|
||
|
vector:
|
||
|
- jobname: linux-clang
|
||
|
cc: clang
|
||
|
pool: ubuntu-latest
|
||
|
- jobname: linux-gcc
|
||
|
cc: gcc
|
||
|
pool: ubuntu-latest
|
||
|
- jobname: osx-clang
|
||
|
cc: clang
|
||
|
pool: macos-latest
|
||
|
- jobname: osx-gcc
|
||
|
cc: gcc
|
||
|
pool: macos-latest
|
||
|
- jobname: GETTEXT_POISON
|
||
|
cc: gcc
|
||
|
pool: ubuntu-latest
|
||
|
env:
|
||
|
CC: ${{matrix.vector.cc}}
|
||
|
jobname: ${{matrix.vector.jobname}}
|
||
|
runs-on: ${{matrix.vector.pool}}
|
||
|
steps:
|
||
|
- uses: actions/checkout@v1
|
||
|
- run: ci/install-dependencies.sh
|
||
|
- run: ci/run-build-and-tests.sh
|
||
|
- run: ci/print-test-failures.sh
|
||
|
if: failure()
|
||
|
- name: Upload failed tests' directories
|
||
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
||
|
uses: actions/upload-artifact@v1
|
||
|
with:
|
||
|
name: failed-tests-${{matrix.vector.jobname}}
|
||
|
path: ${{env.FAILED_TEST_ARTIFACTS}}
|
||
|
dockerized:
|
||
|
needs: ci-config
|
||
|
if: needs.ci-config.outputs.enabled == 'yes'
|
||
|
strategy:
|
||
|
matrix:
|
||
|
vector:
|
||
|
- jobname: linux-musl
|
||
|
image: alpine
|
||
|
- jobname: Linux32
|
||
|
image: daald/ubuntu32:xenial
|
||
|
env:
|
||
|
jobname: ${{matrix.vector.jobname}}
|
||
|
runs-on: ubuntu-latest
|
||
|
container: ${{matrix.vector.image}}
|
||
|
steps:
|
||
|
- uses: actions/checkout@v1
|
||
|
- 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
|
||
|
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
|
||
|
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-latest
|
||
|
steps:
|
||
|
- uses: actions/checkout@v1
|
||
|
- run: ci/install-dependencies.sh
|
||
|
- run: ci/run-static-analysis.sh
|
||
|
documentation:
|
||
|
needs: ci-config
|
||
|
if: needs.ci-config.outputs.enabled == 'yes'
|
||
|
env:
|
||
|
jobname: Documentation
|
||
|
runs-on: ubuntu-latest
|
||
|
steps:
|
||
|
- uses: actions/checkout@v1
|
||
|
- run: ci/install-dependencies.sh
|
||
|
- run: ci/test-documentation.sh
|