CI #15
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [main, master] | |
| paths: | |
| - '**.cpp' | |
| - '**.cu' | |
| - '**.cuh' | |
| - '**.hpp' | |
| - 'CMakeLists.txt' | |
| - 'cmake/**' | |
| - '.clang-format' | |
| pull_request: | |
| branches: [main, master] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: ci-${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| format-check: | |
| name: Format Check | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Check C/C++/CUDA formatting | |
| run: | | |
| set -e | |
| echo "Installing clang-format..." | |
| sudo apt-get update -qq | |
| sudo apt-get install -qq -y clang-format > /dev/null 2>&1 | |
| echo "Using clang-format version: $(clang-format --version)" | |
| echo "Checking formatting on all C/C++/CUDA files..." | |
| FIND_CMD="find . -type f \( -name '*.cpp' -o -name '*.hpp' -o -name '*.cu' -o -name '*.cuh' \) \ | |
| ! -path './build/*' \ | |
| ! -path './third_party/*' \ | |
| ! -path './external/*' \ | |
| ! -path './vendor/*' \ | |
| ! -path './.git/*' \ | |
| ! -path './docs/*' \ | |
| ! -path './examples/*'" | |
| FAIL=0 | |
| while IFS= read -r file; do | |
| if ! clang-format --dry-run --Werror "$file" 2>&1; then | |
| echo "✗ $file" | |
| FAIL=1 | |
| fi | |
| done < <(eval $FIND_CMD) | |
| if [ $FAIL -eq 1 ]; then | |
| echo "" | |
| echo "✗ Format check failed. Please run clang-format on the above files." | |
| exit 1 | |
| fi | |
| echo "✓ All files pass formatting check" | |
| docs-consistency: | |
| name: Documentation Consistency | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Verify executable name consistency | |
| run: | | |
| echo "Checking executable name consistency..." | |
| # Check nbody_sim appears in key files | |
| if grep -rq 'nbody_sim' README.md README.zh-CN.md index.md docs/; then | |
| echo "✓ Executable name 'nbody_sim' found in documentation" | |
| else | |
| echo "⚠ Executable name 'nbody_sim' not found in some docs" | |
| fi | |
| # Check CMakeLists.txt has correct target | |
| if grep -q 'add_executable(nbody_sim' CMakeLists.txt; then | |
| echo "✓ CMakeLists.txt defines 'nbody_sim' target" | |
| else | |
| echo "✗ CMakeLists.txt missing 'nbody_sim' target" | |
| exit 1 | |
| fi | |
| - name: Verify keyboard controls documentation | |
| run: | | |
| echo "Checking keyboard controls documentation..." | |
| # Check controls are documented | |
| controls_found=0 | |
| if grep -q 'Space' README.md; then | |
| echo "✓ Space key documented" | |
| controls_found=$((controls_found + 1)) | |
| fi | |
| if grep -q 'Pause\|pause' README.md; then | |
| echo "✓ Pause action documented" | |
| controls_found=$((controls_found + 1)) | |
| fi | |
| if grep -q 'Reset\|reset' README.md; then | |
| echo "✓ Reset action documented" | |
| controls_found=$((controls_found + 1)) | |
| fi | |
| if [ $controls_found -ge 2 ]; then | |
| echo "✓ Controls documentation check passed" | |
| else | |
| echo "⚠ Some controls may be missing" | |
| fi | |
| - name: Verify test framework configuration | |
| run: | | |
| echo "Checking test framework configuration..." | |
| if grep -q 'googletest' CMakeLists.txt || grep -q 'GoogleTest' CMakeLists.txt; then | |
| echo "✓ Google Test configured in CMakeLists.txt" | |
| else | |
| echo "⚠ Google Test may not be configured" | |
| fi | |
| if grep -q 'rapidcheck' CMakeLists.txt || grep -q 'RapidCheck' CMakeLists.txt; then | |
| echo "✓ RapidCheck configured in CMakeLists.txt" | |
| else | |
| echo "⚠ RapidCheck may not be configured" | |
| fi | |
| - name: Verify project structure | |
| run: | | |
| echo "Checking project structure..." | |
| # Check essential directories | |
| for dir in src include/nbody tests docs; do | |
| if [ -d "$dir" ]; then | |
| echo "✓ Directory '$dir' exists" | |
| else | |
| echo "✗ Directory '$dir' missing" | |
| exit 1 | |
| fi | |
| done | |
| # Check essential files | |
| for file in CMakeLists.txt README.md LICENSE; do | |
| if [ -f "$file" ]; then | |
| echo "✓ File '$file' exists" | |
| else | |
| echo "✗ File '$file' missing" | |
| exit 1 | |
| fi | |
| done | |
| - name: Summary | |
| run: | | |
| echo "" | |
| echo "==========================================" | |
| echo "Documentation Consistency Check Complete" | |
| echo "==========================================" | |
| echo "" | |
| echo "All checks passed. Ready for deployment." | |
| markdown-lint: | |
| name: Markdown Lint | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Lint markdown files | |
| uses: DavidAnson/markdownlint-cli2-action@v19 | |
| with: | |
| globs: | | |
| *.md | |
| docs/**/*.md | |
| changelog/**/*.md | |
| examples/**/*.md | |
| build-info: | |
| name: Build Information | |
| runs-on: ubuntu-latest | |
| needs: [format-check, docs-consistency] | |
| steps: | |
| - name: Display build requirements | |
| run: | | |
| echo "# N-Body Simulation Build Requirements" | |
| echo "" | |
| echo "This project requires a CUDA-enabled environment for building." | |
| echo "" | |
| echo "## Hardware Requirements" | |
| echo "" | |
| echo "| Component | Minimum | Recommended |" | |
| echo "|-----------|---------|-------------|" | |
| echo "| GPU | NVIDIA CC 7.0+ | NVIDIA CC 8.0+ |" | |
| echo "| VRAM | 4GB | 8GB+ |" | |
| echo "| RAM | 8GB | 16GB+ |" | |
| echo "" | |
| echo "## Software Requirements" | |
| echo "" | |
| echo "| Component | Version |" | |
| echo "|-----------|---------|" | |
| echo "| CUDA Toolkit | 11.0+ |" | |
| echo "| CMake | 3.18+ |" | |
| echo "| OpenGL | 3.3+ |" | |
| echo "| GLFW | 3.3+ |" | |
| echo "| GLEW | 2.1+ |" | |
| echo "| GLM | 0.9.9+ |" | |
| echo "" | |
| echo "## Build Commands" | |
| echo "" | |
| echo '```bash' | |
| echo "# Clone repository" | |
| echo "git clone https://github.com/LessUp/n-body.git" | |
| echo "cd n-body" | |
| echo "" | |
| echo "# Build" | |
| echo "mkdir build && cd build" | |
| echo "cmake .. -DCMAKE_BUILD_TYPE=Release" | |
| echo "cmake --build . -j\$(nproc)" | |
| echo '```' | |
| echo "" | |
| echo "## Run Tests" | |
| echo "" | |
| echo '```bash' | |
| echo "ctest --output-on-failure" | |
| echo "./nbody_tests" | |
| echo '```' | |
| echo "" | |
| echo "## Run Simulation" | |
| echo "" | |
| echo '```bash' | |
| echo "./nbody_sim 10000 # 10K particles" | |
| echo "./nbody_sim 100000 # 100K particles" | |
| echo '```' | |
| echo "" | |
| echo "---" | |
| echo "CI validates formatting and documentation consistency." | |
| echo "For full build verification, use a local CUDA environment." |