# ns-3 CI/CD script with the code-linting stage # # Contains jobs to check the ns-3 coding style and perform lint checking. # Clang-format check-style-clang-format: stage: .pre image: ubuntu:latest before_script: - apt update - DEBIAN_FRONTEND=noninteractive apt install -y python3 clang-format-14 script: - python3 utils/check-style-clang-format.py --verbose . timeout: 1h # Clang-tidy clang-tidy: stage: code-linting image: ubuntu:latest variables: MPI_CI: 1 CLANG_TIDY_OUTPUT: clang-tidy-output.log before_script: - apt update - DEBIAN_FRONTEND=noninteractive apt install -y clang cmake clang-tidy clang-tidy-14 python3 python3-pip libboost-all-dev libeigen3-dev libgtk-3-dev libopenmpi-dev libsqlite3-dev gsl-bin libgsl-dev libgsl27 git ssh - pip3 install cppyy - ./ns3 configure -d debug --enable-clang-tidy --enable-examples --enable-tests --enable-asserts --enable-mpi --enable-python-bindings script: - if (git remote | grep -qw upstream) ; then git remote set-url upstream https://gitlab.com/nsnam/ns-3-dev.git ; else git remote add upstream https://gitlab.com/nsnam/ns-3-dev.git ; fi - git fetch upstream $CI_DEFAULT_BRANCH # Run clang-tidy-diff. If running on default branch, Git diff is empty and this is ignored. # File paths generated by git diff are relative to the working tree. Therefore, iregex should only contain paths relative to the working tree. - git diff -U0 upstream/$CI_DEFAULT_BRANCH | clang-tidy-diff-14.py -path cmake-cache/ -p1 -quiet -use-color -iregex "(contrib|examples|src|scratch|utils)\/.+\.(cpp|cc|cxx|c|h|hpp)" 1> $CLANG_TIDY_OUTPUT 2> /dev/null # Run full clang-tidy in the following cases: 1) default branch, 2) ".clang-tidy" file changed, 3) clang-tidy-diff had an error - if [[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] || (echo $(git diff --name-only upstream/$CI_DEFAULT_BRANCH) | grep -q ".clang-tidy") || (egrep -q -A 3 "file not found \[clang-diagnostic-error\]" $CLANG_TIDY_OUTPUT) ; then echo "Running full clang-tidy" ; run-clang-tidy-14 -p cmake-cache/ -quiet 1> $CLANG_TIDY_OUTPUT 2> /dev/null ; fi # Check job results - (! egrep -A 3 "error:|warning:|note:" $CLANG_TIDY_OUTPUT) - echo "No clang-tidy errors found" artifacts: paths: - $CLANG_TIDY_OUTPUT when: on_failure interruptible: true timeout: 3h # Emacs line emacs-line: stage: .pre image: ubuntu:latest script: - (! grep -rn --include="*.h" --include="*.cc" "c-file-style:\"gnu\"" ) || (echo "Found Emacs lines on the above C++ files" && exit 1) - echo "No Emacs lines found on C++ files" timeout: 1h # Spell checking spell-check: stage: .pre image: python:latest before_script: - pip install codespell script: # Get commit messages - if (git remote | grep -qw upstream) ; then git remote set-url upstream https://gitlab.com/nsnam/ns-3-dev.git ; else git remote add upstream https://gitlab.com/nsnam/ns-3-dev.git ; fi - git fetch upstream master - git log --pretty=%B HEAD...upstream/master ^upstream/master > git_messages.txt # Check source code and commit messages - codespell -f -C0 ./ timeout: 1h