-
Notifications
You must be signed in to change notification settings - Fork 5
194 lines (194 loc) · 9.13 KB
/
run-standard-tests.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
---
name: Run Standard Tests
# Run minimal end-to-end tests for Khiops, Khiops Coclustering and KNITransfer
# Tests are lauched on Linux, Windows and macOS ; in serial and in parallel (3 procs)
# On release, it runs Standard test for binary. Plus MultiTables/SpliceJunction for KNITransfer
# On debug, it runs only Standard/Iris for Coclustering and KNITransfer and Standard/IrisLight for Khiops
# In case of errors, test results are available as artifacts for 7 days
# It is automatically triggered on PR when sources files are modified (files in src directory)
on:
workflow_dispatch:
pull_request:
paths: [src/**]
env:
KhiopsBatchMode: true
jobs:
# Build the project on each platform for all targets to ensure that all sources and cmake files are correct
# The useful binaries are cached for the current run_id. It will be restored only in the same run of the
# build. The cached binaries are delete in the last job (cleanup-cache)
build-full-project:
strategy:
matrix:
build-setup:
- {os: windows-2022, cmake-preset: windows-msvc}
- {os: ubuntu-latest, cmake-preset: linux-gcc}
- {os: macos-latest, cmake-preset: macos-clang}
config: [debug, release]
runs-on: ${{ matrix.build-setup.os }}
env:
PRESET_NAME: ${{ matrix.build-setup.cmake-preset }}-${{ matrix.config }}
steps:
- name: Checkout sources
uses: actions/checkout@v3
- name: Build all binaries
uses: ./.github/actions/build-khiops
with:
preset-name: ${{ env.PRESET_NAME }}
- name: Cache binaries
id: cache-binaries-unix
uses: actions/cache@v3
with:
# We add binaries path one by one to avoid *.pdb and other msvc stuffs that generate a cache of 200Mo for windows
path: |
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL_Coclustering
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/KNITransfer
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL.exe
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL_Coclustering.exe
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/KNITransfer.exe
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/KhiopsNativeInterface.dll
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/lib/libKhiopsNativeInterface.*
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/lib/KhiopsNativeInterface.lib
key: ${{ github.run_id }}-${{ matrix.build-setup.os }}-${{ env.PRESET_NAME
}}
fail-on-cache-miss: false
run-standard-tests:
needs: build-full-project
strategy:
fail-fast: false
matrix:
build-setup:
- {os: windows-2022, cmake-preset: windows-msvc}
- {os: ubuntu-latest, cmake-preset: linux-gcc}
- {os: macos-latest, cmake-preset: macos-clang}
running-mode: [parallel, serial]
config: [debug, release]
runs-on: ${{ matrix.build-setup.os }}
env:
PRESET_NAME: ${{ matrix.build-setup.cmake-preset }}-${{ matrix.config }}
steps:
- name: Checkout sources
uses: actions/checkout@v3
- name: Restore cached binaries
id: restore-binaries
uses: actions/cache/restore@v3
with:
path: |
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL_Coclustering
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/KNITransfer
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL.exe
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/MODL_Coclustering.exe
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/KNITransfer.exe
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin/KhiopsNativeInterface.dll
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/lib/libKhiopsNativeInterface.*
${{ github.workspace }}/build/${{ env.PRESET_NAME }}/lib/KhiopsNativeInterface.lib
key: ${{ github.run_id }}-${{ matrix.build-setup.os }}-${{ env.PRESET_NAME
}}
fail-on-cache-miss: true
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Set environment variables
shell: bash
run: |
echo "TEST_PY=test/LearningTest/cmd/python/test_khiops.py" >> "$GITHUB_ENV"
echo "APPLY_PY=test/LearningTest/cmd/python/apply_command.py" >> "$GITHUB_ENV"
echo "BIN_PATH=${{ github.workspace }}/build/${{ env.PRESET_NAME }}/bin" >> "$GITHUB_ENV"
- name: Setup MPI
uses: mpi4py/setup-mpi@v1
- name: Run Tests
# Run test on linux and macOS as describe in the top comment:
# - In parallel, run only MODL tests
# - In debug run only Standard/Iris for KNITRansfer and MODL_Coclustering, Standard/IrisLight for MODL
# - In release run all Standard tests
shell: bash
run: |
if [[ "${{ matrix.build-setup.os }}" == 'windows-2022' ]]; then
export EXT=".exe"
fi
if [[ "${{ matrix.running-mode }}" == "parallel" ]] ; then
export KhiopsMPIProcessNumber=3
fi
if [[ "${{ matrix.config }}" == "release" ]] ; then
python $TEST_PY Khiops ${BIN_PATH}/MODL${EXT} Standard
if [[ "${{ matrix.running-mode }}" != "parallel" ]] ; then
python $TEST_PY Coclustering ${BIN_PATH}/MODL_Coclustering${EXT} Standard
python $TEST_PY KNI ${BIN_PATH}/KNITransfer${EXT} Standard
python $TEST_PY KNI ${BIN_PATH}/KNITransfer${EXT} MultiTables SpliceJunction
fi
else
python $TEST_PY Khiops ${BIN_PATH}/MODL${EXT} Standard IrisLight
if [[ "${{ matrix.running-mode }}" != "parallel" ]] ; then
python $TEST_PY Coclustering ${BIN_PATH}/MODL_Coclustering${EXT} Standard Iris
python $TEST_PY KNI ${BIN_PATH}/KNITransfer${EXT} Standard Iris
fi
fi
- name: Collect results
shell: bash
if: success() || failure()
run: |
if [[ "${{ matrix.config }}" == "release" ]] ; then
python3 $APPLY_PY errors test/LearningTest/TestKhiops/Standard | tee test/LearningTest/TestKhiops/Standard/errors.txt
if [[ "${{ matrix.running-mode }}" != "parallel" ]] ; then
python $APPLY_PY errors test/LearningTest/TestCoclustering/Standard | tee test/LearningTest/TestCoclustering/Standard/errors.txt
python $APPLY_PY errors test/LearningTest/TestKNITransfer/Standard | tee test/LearningTest/TestKNITransfer/Standard/errors.txt
python $APPLY_PY errors test/LearningTest/TestKNITransfer/MultiTables SpliceJunction | tee test/LearningTest/TestKNITransfer/MultiTables/errors.txt
fi
else
python3 $APPLY_PY errors test/LearningTest/TestKhiops/Standard IrisLight | tee test/LearningTest/TestKhiops/Standard/errors.txt
if [[ "${{ matrix.running-mode }}" != "parallel" ]] ; then
python $APPLY_PY errors test/LearningTest/TestCoclustering/Standard Iris | tee test/LearningTest/TestCoclustering/Standard/errors.txt
python $APPLY_PY errors test/LearningTest/TestKNITransfer/Standard Iris | tee test/LearningTest/TestKNITransfer/Standard/errors.txt
fi
fi
- name: Check results
shell: bash
run: |
if grep -qr "error" --include="errors.txt" test/LearningTest/ ; then
echo "::error::Errors in test"
false
fi
if grep -qr "The test has not been launched" --include="errors.txt" test/LearningTest/ ; then
echo "::error::Test not launched"
false
fi
- name: Upload test results
if: failure()
uses: actions/upload-artifact@v3
with:
name: test-results-${{ env.PRESET_NAME }}-${{ matrix.running-mode}}
retention-days: 7
path: |-
test/LearningTest/**/results
test/LearningTest/**/results.ref
test/LearningTest/**/errors.txt
test/LearningTest/**/comparisonResults.log
cleanup-cache:
# Clean up all caches belonging to the current run
if: ${{ always() }}
needs: run-standard-tests
runs-on: ubuntu-latest
permissions:
actions: write
steps:
- name: Checkout sources
uses: actions/checkout@v3
with:
sparse-checkout: .git
- name: Cleanup cache
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |-
gh extension install actions/gh-actions-cache
echo "Fetching list of cache key for the current workflow"
cache_keys_for_delete=$(gh actions-cache list --key ${{ github.run_id }} | cut -f 1 )
set +e
echo "Deleting caches..."
for cache_key in $cache_keys_for_delete
do
gh actions-cache delete $cache_key --confirm
done
echo "Done"