xref: /honee/.gitlab-ci.yml (revision 240d24bd8d11a1e4b040370411269e797dbd4bec)
1# ----------------------------------------------------------------------------------------
2# HONEE GitLab CI
3# ----------------------------------------------------------------------------------------
4stages:
5  - test:stage-lint
6  - test:stage-full
7  - test:post
8  - test:docs
9  - deploy
10
11workflow:
12  auto_cancel:
13    on_job_failure: all
14
15.test-basic:
16  interruptible: true
17  only:
18    refs:
19      - web
20      - merge_requests
21
22.test:
23  extends: .test-basic
24  only:
25    refs:
26      - web
27      - merge_requests
28      - main
29      - release
30  except:
31    variables:
32      # Skip if the No-Code label is attached to a merge request (i.e., documentation only)
33      - $CI_MERGE_REQUEST_LABELS =~ /(^|,)No-Code($|,)/
34
35.docs:
36  image: python:3.10
37  before_script:
38    - pip install -r doc/requirements.txt
39    - apt-get update
40    - apt-get install -y doxygen librsvg2-bin
41
42
43# ----------------------------------------------------------------------------------------
44# Test formatting
45# ----------------------------------------------------------------------------------------
46noether-format:
47  stage: test:stage-lint
48  extends: 
49    - .test-basic
50  tags:
51    - noether
52    - shell
53  script:
54    - rm -f .SUCCESS
55    - echo "-------------- make format ---------" && export CLANG_FORMAT=clang-format-15 && $CLANG_FORMAT --version
56    - make -j$NPROC_CPU format && git diff --color=always --exit-code
57    - echo "-------------- make checkbadSource ---------"
58    - make -j$NPROC_CPU checkbadSource
59    - touch .SUCCESS
60
61
62# ----------------------------------------------------------------------------------------
63# Test static analysis
64# ----------------------------------------------------------------------------------------
65noether-lint:
66  stage: test:stage-lint
67  extends: .test
68  tags:
69    - noether
70    - shell
71  script:
72    - rm -f .SUCCESS
73    # Environment
74    - export CC=gcc
75    - echo "-------------- nproc ---------------" && NPROC_CPU=$(nproc) && NPROC_GPU=$(($(nproc)<8?$(nproc):8)) && echo "NPROC_CPU" $NPROC_CPU && echo "NPROC_GPU" $NPROC_GPU
76    - echo "-------------- CC ------------------" && $CC --version
77    # Libraries
78    # -- libCEED
79    - echo "-------------- libCEED -------------"
80    - export CEED_DIR=/projects/honee/libCEED && git -C $CEED_DIR -c safe.directory=$CEED_DIR describe && make -C $CEED_DIR info
81    # -- PETSc
82    - echo "-------------- PETSc ---------------"
83    - export PETSC_DIR=/projects/honee/petsc
84    - export PETSC_ARCH=arch-serial-cuda && git -C $PETSC_DIR -c safe.directory=$PETSC_DIR describe && make -C $PETSC_DIR info
85    - export PETSC_OPTIONS='-malloc_debug no' # faster tests
86    - export LD_LIBRARY_PATH=$PETSC_DIR/lib PATH="$PATH:$PETSC_DIR/bin" # cgnsdiff
87    - echo "-------------- HONEE ---------------" && make info
88    # make with Werror, Wall, supress loop vectorization warnings
89    - echo "-------------- make Werror ---------"
90    - PEDANTIC=1 PEDANTICFLAGS="-Werror -Wall -Wno-pass-failed" make -j$NPROC_CPU
91    # Clang-tidy
92    - echo "-------------- clang-tidy ----------" && export CLANG_TIDY=clang-tidy-15 && $CLANG_TIDY --version
93    - PETSC_ARCH=arch-serial-cuda make -j$NPROC_CPU tidy
94    # Report status
95    - touch .SUCCESS
96
97
98# ----------------------------------------------------------------------------------------
99# Test memory access assumptions
100# ----------------------------------------------------------------------------------------
101noether-memcheck:
102  stage: test:stage-lint
103  extends: .test
104  tags:
105    - noether
106    - shell
107  script:
108    - rm -f .SUCCESS
109    # Environment
110    - export COVERAGE=1 CC=clang-15
111    - export NPROC_POOL=8
112    - echo "-------------- nproc ---------------" && NPROC_CPU=$(nproc) && NPROC_GPU=$(($(nproc)<8?$(nproc):8)) && echo "NPROC_CPU" $NPROC_CPU && echo "NPROC_GPU" $NPROC_GPU
113    - echo "-------------- CC ------------------" && $CC --version
114    # Libraries
115    # -- libCEED
116    - echo "-------------- libCEED -------------"
117    - export CEED_DIR=/projects/honee/libCEED-cpu && git -C $CEED_DIR -c safe.directory=$CEED_DIR describe && make -C $CEED_DIR info
118    # -- PETSc
119    - echo "-------------- PETSc ---------------"
120    - export PETSC_DIR=/projects/honee/petsc
121    - export PETSC_ARCH=arch-serial-cpu-clang && git -C $PETSC_DIR -c safe.directory=$PETSC_DIR describe && make -C $PETSC_DIR info
122    - export PETSC_OPTIONS='-malloc_debug no' # faster tests
123    - export LD_LIBRARY_PATH=$PETSC_DIR/lib PATH="$PATH:$PETSC_DIR/bin" # cgnsdiff
124    - echo "-------------- HONEE ---------------" && make info
125    # ASAN
126    - echo "-------------- ASAN ----------------"
127    - export ASAN=1 AFLAGS="-fsanitize=address -fsanitize=leak"
128    - echo $AFLAGS
129    # HONEE
130    - echo "-------------- HONEE ---------------" && make info
131    - make clean
132    - make -j$NPROC_CPU
133    # Test suite
134    - echo "-------------- HONEE tests ---------"
135    - echo '[{"subject":"/","metrics":[{"name":"Transfer Size (KB)","value":"19.5","desiredSize":"smaller"},{"name":"Speed Index","value":0,"desiredSize":"smaller"},{"name":"Total Score","value":92,"desiredSize":"larger"},{"name":"Requests","value":4,"desiredSize":"smaller"}]}]' > performance.json
136    # -- Memcheck libCEED CPU backend, serial
137    - NPROC_TEST=1 make -k -j$((NPROC_CPU / NPROC_POOL)) CEED_BACKENDS="/cpu/self/memcheck" JUNIT_BATCH="cpu-serial-memcheck" junit search=navierstokes
138    # Report status
139    - touch .SUCCESS
140  after_script:
141    - |
142      if [ -f .SUCCESS ]; then
143        gcovr --gcov-executable "llvm-cov-15 gcov" --json-pretty --print-summary -o coverage-$CI_JOB_ID.json;
144      fi
145  artifacts:
146    paths:
147      - coverage-$CI_JOB_ID.json
148      - build/*.junit
149      - build/test_failure_artifacts
150    when: always
151    reports:
152      junit: build/*.junit
153      performance: performance.json
154    expire_in: 28 days
155
156
157# ----------------------------------------------------------------------------------------
158# CPU testing on Noether
159# ----------------------------------------------------------------------------------------
160noether-cpu:
161  stage: test:stage-full
162  extends: .test
163  tags:
164    - noether
165    - shell
166  script:
167    - rm -f .SUCCESS
168    # Environment
169    - export COVERAGE=1 CC=gcc
170    - export NPROC_POOL=4
171    - echo "-------------- nproc ---------------" && NPROC_CPU=$(nproc) && NPROC_GPU=$(($(nproc)<8?$(nproc):8)) && echo "NPROC_CPU" $NPROC_CPU && echo "NPROC_GPU" $NPROC_GPU
172    - echo "-------------- CC ------------------" && $CC --version
173    - echo "-------------- GCOV ----------------" && gcov --version
174    # Libraries
175    # -- libCEED
176    - echo "-------------- libCEED -------------"
177    - export CEED_DIR=/projects/honee/libCEED && git -C $CEED_DIR -c safe.directory=$CEED_DIR describe && make -C $CEED_DIR info
178    # -- PETSc
179    - echo "-------------- PETSc ---------------"
180    - export PETSC_DIR=/projects/honee/petsc
181    - export PETSC_ARCH=arch-parallel-cuda && git -C $PETSC_DIR -c safe.directory=$PETSC_DIR describe && make -C $PETSC_DIR info
182    - export PETSC_OPTIONS='-malloc_debug no' # faster tests
183    - export LD_LIBRARY_PATH=$PETSC_DIR/$PETSC_ARCH/lib PATH="$PATH:$PETSC_DIR/$PETSC_ARCH/bin" # cgnsdiff
184    # HONEE
185    - echo "-------------- HONEE ---------------" && make info
186    - make clean
187    - make -j$NPROC_CPU
188    # Test suite
189    - echo "-------------- HONEE tests ---------"
190    - echo '[{"subject":"/","metrics":[{"name":"Transfer Size (KB)","value":"19.5","desiredSize":"smaller"},{"name":"Speed Index","value":0,"desiredSize":"smaller"},{"name":"Total Score","value":92,"desiredSize":"larger"},{"name":"Requests","value":4,"desiredSize":"smaller"}]}]' > performance.json
191    # -- Fastest libCEED CPU backend, parallel
192    - echo "Parallel tests skipped for now"
193    # - source /home/phypid/spack/share/spack/setup-env.sh && spack load py-torch@2.3+cuda && export USE_TORCH=1
194    - export SMARTREDIS_DIR=/projects/honee/SmartSim/smartredis/install
195    - NPROC_TEST=1 make -k -j$((NPROC_CPU / NPROC_POOL / 1)) CEED_BACKENDS="/cpu/self" JUNIT_BATCH="cpu-serial" junit search=navierstokes
196    # - spack unload py-torch@2.3+cuda && export USE_TORCH=0
197    - source /projects/honee/SmartSim/venv/bin/activate
198    - NPROC_TEST=1 make -k -j$((NPROC_CPU / NPROC_POOL / 1)) CEED_BACKENDS="/cpu/self" JUNIT_BATCH="cpu-serial" junit search="test-smartsim"
199    # Report status
200    - touch .SUCCESS
201  after_script:
202    - |
203      if [ -f .SUCCESS ]; then
204        gcovr --gcov-executable "llvm-cov-15 gcov" --json-pretty --print-summary -o coverage-$CI_JOB_ID.json;
205      fi
206  artifacts:
207    paths:
208      - coverage-$CI_JOB_ID.json
209      - build/*.junit
210      - build/test_failure_artifacts
211    when: always
212    reports:
213      junit: build/*.junit
214      performance: performance.json
215    expire_in: 28 days
216
217
218# ----------------------------------------------------------------------------------------
219# CPU Int64 testing on Noether
220# ----------------------------------------------------------------------------------------
221noether-cpu-int64:
222  stage: test:stage-full
223  extends: .test
224  tags:
225    - noether
226    - shell
227  script:
228    - rm -f .SUCCESS
229    # Environment
230    - export COVERAGE=1 CC=gcc
231    - export NPROC_POOL=4
232    - echo "-------------- nproc ---------------" && NPROC_CPU=$(nproc) && NPROC_GPU=$(($(nproc)<8?$(nproc):8)) && echo "NPROC_CPU" $NPROC_CPU && echo "NPROC_GPU" $NPROC_GPU
233    - echo "-------------- CC ------------------" && $CC --version
234    - echo "-------------- GCOV ----------------" && gcov --version
235    # Libraries
236    # -- libCEED
237    - echo "-------------- libCEED -------------"
238    - export CEED_DIR=/projects/honee/libCEED && git -C $CEED_DIR -c safe.directory=$CEED_DIR describe && make -C $CEED_DIR info
239    # -- PETSc
240    - echo "-------------- PETSc ---------------"
241    - export PETSC_DIR=/projects/honee/petsc
242    - export PETSC_ARCH=arch-serial-cpu-int64 && git -C $PETSC_DIR -c safe.directory=$PETSC_DIR describe && make -C $PETSC_DIR info
243    - export PETSC_OPTIONS='-malloc_debug no' # faster tests
244    - export LD_LIBRARY_PATH=$PETSC_DIR/$PETSC_ARCH/lib PATH="$PATH:$PETSC_DIR/$PETSC_ARCH/bin" # cgnsdiff
245    # HONEE
246    - echo "-------------- HONEE ---------------" && make info
247    - make clean
248    - make -j$NPROC_CPU
249    # Test suite
250    - echo "-------------- HONEE tests ---------"
251    - echo '[{"subject":"/","metrics":[{"name":"Transfer Size (KB)","value":"19.5","desiredSize":"smaller"},{"name":"Speed Index","value":0,"desiredSize":"smaller"},{"name":"Total Score","value":92,"desiredSize":"larger"},{"name":"Requests","value":4,"desiredSize":"smaller"}]}]' > performance.json
252    # -- Fastest libCEED CPU backend, serial
253    # - source /home/phypid/spack/share/spack/setup-env.sh && spack load py-torch@2.3+cuda && export USE_TORCH=1
254    - export SMARTREDIS_DIR=/projects/honee/SmartSim/smartredis/install
255    - NPROC_TEST=1 make -k -j$((NPROC_CPU / NPROC_POOL / 1)) CEED_BACKENDS="/cpu/self" JUNIT_BATCH="cpu-serial-int64" junit search=navierstokes
256    # - spack unload py-torch@2.3+cuda && export USE_TORCH=0
257    - source /projects/honee/SmartSim/venv/bin/activate
258    - NPROC_TEST=1 make -k -j$((NPROC_CPU / NPROC_POOL / 1)) CEED_BACKENDS="/cpu/self" JUNIT_BATCH="cpu-serial-int64" junit search="test-smartsim"
259    # Report status
260    - touch .SUCCESS
261  after_script:
262    - |
263      if [ -f .SUCCESS ]; then
264        gcovr --gcov-executable "llvm-cov-15 gcov" --json-pretty --print-summary -o coverage-$CI_JOB_ID.json;
265      fi
266  artifacts:
267    paths:
268      - coverage-$CI_JOB_ID.json
269      - build/*.junit
270      - build/test_failure_artifacts
271    when: always
272    reports:
273      junit: build/*.junit
274      performance: performance.json
275    expire_in: 28 days
276
277
278#### Disable HIP temporarily
279
280# # ----------------------------------------------------------------------------------------
281# # GPU testing on Noether
282# # ----------------------------------------------------------------------------------------
283# noether-hip:
284#   stage: test:stage-full
285#   extends: .test
286#   tags:
287#     - noether
288#     - shell
289#   script:
290#     - rm -f .SUCCESS
291#     # Environment
292#     - export COVERAGE=1 CC=gcc HIPCC=hipcc
293#     - export NPROC_POOL=4
294#     - echo "-------------- nproc ---------------" && NPROC_CPU=$(nproc) && NPROC_GPU=$(($(nproc)<8?$(nproc):8)) && echo "NPROC_CPU" $NPROC_CPU && echo "NPROC_GPU" $NPROC_GPU
295#     - echo "-------------- CC ------------------" && $CC --version
296#     - echo "-------------- HIPCC ---------------" && $HIPCC --version && export HIP_DIR=/opt/rocm
297#     - echo "-------------- GCOV ----------------" && gcov --version
298#     # Libraries
299#     # -- libCEED
300#     - echo "-------------- libCEED -------------"
301#     - export CEED_DIR=/projects/honee/libCEED && git -C $CEED_DIR -c safe.directory=$CEED_DIR describe && make -C $CEED_DIR info
302#     # -- PETSc
303#     - echo "-------------- PETSc ---------------"
304#     - export PETSC_DIR=/projects/honee/petsc
305#     - export PETSC_ARCH=arch-parallel-hip && git -C $PETSC_DIR -c safe.directory=$PETSC_DIR describe && make -C $PETSC_DIR info
306#     - export PETSC_OPTIONS='-malloc_debug no' # faster tests
307#     - export LD_LIBRARY_PATH=$PETSC_DIR/$PETSC_ARCH/lib PATH="$PATH:$PETSC_DIR/$PETSC_ARCH/bin" # cgnsdiff
308#     # HONEE
309#     - echo "-------------- HONEE ---------------" && make info
310#     - make clean
311#     - make -j$NPROC_CPU
312#     # Test suite
313#     - echo "-------------- HONEE tests ---------"
314#     - echo '[{"subject":"/","metrics":[{"name":"Transfer Size (KB)","value":"19.5","desiredSize":"smaller"},{"name":"Speed Index","value":0,"desiredSize":"smaller"},{"name":"Total Score","value":92,"desiredSize":"larger"},{"name":"Requests","value":4,"desiredSize":"smaller"}]}]' > performance.json
315#     # -- Fastest libCEED HIP backend, serial
316#     # Note: /shared is faster due to /gen JiT time for CeedOperators overwhelming runtime improvements at these problem sizes
317#     - NPROC_TEST=1 make -k -j$((NPROC_GPU / NPROC_POOL / 1)) CEED_BACKENDS="/gpu/hip/shared" JUNIT_BATCH="hip-serial" junit search=navierstokes
318#     # Report status
319#     - touch .SUCCESS
320#   after_script:
321#     - |
322#       if [ -f .SUCCESS ]; then
323#         gcovr --xml-pretty --exclude-lines-by-pattern '^\s*SETERR.*' --exclude-unreachable-branches --print-summary -o coverage.xml;
324#       fi
325#   after_script:
326#     - |
327#       if [ -f .SUCCESS ]; then
328#         gcovr --gcov-executable "llvm-cov-15 gcov" --json-pretty --print-summary -o coverage-$CI_JOB_ID.json;
329#       fi
330#   artifacts:
331#     paths:
332#       - coverage-$CI_JOB_ID.json
333#       - build/*.junit
334#       - build/test_failure_artifacts
335#     when: always
336#     reports:
337#       junit: build/*.junit
338#       performance: performance.json
339#     expire_in: 28 days
340
341
342noether-cuda:
343  stage: test:stage-full
344  extends: .test
345  tags:
346    - noether
347    - shell
348  script:
349    - rm -f .SUCCESS
350    # Environment
351    - export COVERAGE=1 CC=gcc NVCC=nvcc
352    - export NPROC_POOL=4
353    - echo "-------------- nproc ---------------" && NPROC_CPU=$(nproc) && NPROC_GPU=$(($(nproc)<8?$(nproc):8)) && echo "NPROC_CPU" $NPROC_CPU && echo "NPROC_GPU" $NPROC_GPU
354    - echo "-------------- CC ------------------" && $CC --version
355    - echo "-------------- NVCC ----------------" && $NVCC --version
356    - echo "-------------- GCOV ----------------" && gcov --version
357    # Libraries
358    # -- libCEED
359    - echo "-------------- libCEED -------------"
360    - export CEED_DIR=/projects/honee/libCEED && git -C $CEED_DIR -c safe.directory=$CEED_DIR describe && make -C $CEED_DIR info
361    # -- PETSc
362    - echo "-------------- PETSc ---------------"
363    - export PETSC_DIR=/projects/honee/petsc
364    - export PETSC_ARCH=arch-parallel-cuda && git -C $PETSC_DIR -c safe.directory=$PETSC_DIR describe && make -C $PETSC_DIR info
365    - export PETSC_OPTIONS='-malloc_debug no -use_gpu_aware_mpi 0' # faster tests
366    - export LD_LIBRARY_PATH=$PETSC_DIR/$PETSC_ARCH/lib PATH="$PATH:$PETSC_DIR/$PETSC_ARCH/bin" # cgnsdiff
367    # HONEE
368    - echo "-------------- HONEE ---------------" && make info
369    - make clean
370    - make -j$NPROC_CPU
371    # Test suite
372    - echo "-------------- HONEE tests ---------"
373    - echo '[{"subject":"/","metrics":[{"name":"Transfer Size (KB)","value":"19.5","desiredSize":"smaller"},{"name":"Speed Index","value":0,"desiredSize":"smaller"},{"name":"Total Score","value":92,"desiredSize":"larger"},{"name":"Requests","value":4,"desiredSize":"smaller"}]}]' > performance.json
374    # -- Fastest libCEED CUDA backend, serial
375    # Note: /shared is faster due to /gen JiT time for CeedOperators overwhelming runtime improvements at these problem sizes
376    # - source /home/phypid/spack/share/spack/setup-env.sh && spack load py-torch@2.3+cuda && export USE_TORCH=1
377    - NPROC_TEST=1 make -k -j$((NPROC_GPU / NPROC_POOL / 1)) CEED_BACKENDS="/gpu/cuda/shared" JUNIT_BATCH="cuda-serial" junit search=navierstokes
378    # Report status
379    - touch .SUCCESS
380  after_script:
381    - |
382      if [ -f .SUCCESS ]; then
383        gcovr --gcov-executable "llvm-cov-15 gcov" --json-pretty --print-summary -o coverage-$CI_JOB_ID.json;
384      fi
385  artifacts:
386    paths:
387      - coverage-$CI_JOB_ID.json
388      - build/*.junit
389      - build/test_failure_artifacts
390    when: always
391    reports:
392      junit: build/*.junit
393      performance: performance.json
394    expire_in: 28 days
395
396
397test-coverage:
398  stage: test:post
399  extends: .test
400  tags:
401    - noether
402    - shell
403  when: always
404  needs: [noether-memcheck, noether-cpu, noether-cpu-int64, noether-cuda, ]
405  script:
406    - ls coverage-*
407    - mkdir coverage
408    - gcovr --json-add-tracefile "coverage-*.json" --xml-pretty -o coverage.xml --print-summary --html-nested coverage/index.html --html-theme github.dark-blue
409  coverage: '/^lines:\s+(\d+.\d\%)/'
410  artifacts:
411    paths:
412      - coverage.xml
413      - coverage
414    when: always
415    reports:
416      coverage_report:
417        coverage_format: cobertura
418        path: coverage.xml
419    expire_in: 28 days
420  environment:
421    name: coverage/$CI_COMMIT_REF_NAME
422    url: https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/coverage/index.html
423
424
425# ----------------------------------------------------------------------------------------
426# Build documentation
427# ----------------------------------------------------------------------------------------
428docs-review:
429  stage: test:docs
430  tags:
431    - noether
432    - docker
433  extends:
434    - .docs
435    - .test-basic
436  interruptible: true
437  script:
438    - export PETSC_DIR=/projects/honee/petsc PETSC_ARCH=arch-parallel-cuda CEED_DIR=/projects/honee/libCEED
439    - git -c safe.directory=/builds/phypid/honee submodule update --init
440    - make doc-html pkgconf=true DOXYGENOPTS= SPHINXOPTS=-W
441    - mv doc/build/html public
442  artifacts:
443    paths:
444      - public
445    expire_in: 28 days
446  environment:
447    name: review/$CI_COMMIT_REF_NAME
448    url: https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html
449
450
451# ----------------------------------------------------------------------------------------
452# Deploy documentation using GitLab pages
453# ----------------------------------------------------------------------------------------
454pages:  # this job name has special meaning to GitLab
455  stage: deploy
456  tags:
457    - noether
458    - docker
459  extends: .docs
460  interruptible: false
461  script:
462    - git -c safe.directory=/builds/phypid/honee submodule update --init
463    - make doc-dirhtml pkgconf=true DOXYGENOPTS=
464    - mv doc/build/dirhtml public
465  only:
466    - main
467  artifacts:
468    paths:
469      - public
470