name: check on: push: pull_request: release: types: - published jobs: clang_format_check: runs-on: ubuntu-24.04 steps: # checkout - uses: actions/checkout@v6 with: submodules: recursive - name: Run clang-format style check for C/C++ programs. uses: DoozyX/clang-format-lint-action@v0.18 with: source: 'src plugins include tests' exclude: 'include/neuron/utils/uthash.h include/neuron/utils/utarray.h include/neuron/utils/utlist.h include/neuron/utils/zlog.h src/otel/trace.pb-c.h src/otel/trace.pb-c.c src/otel/resource.pb-c.h src/otel/resource.pb-c.c src/otel/common.pb-c.c src/otel/common.pb-c.h plugins/mqtt/ptformat.pb-c.h plugins/mqtt/ptformat.pb-c.c' style: file clangFormatVersion: 10 cppcheck: runs-on: ubuntu-24.04 container: ghcr.io/neugates/build:x86_64-main steps: - uses: actions/checkout@v4 with: submodules: recursive - name: cppcheck run: | sudo apt install -y cppcheck cppcheck --enable=all --error-exitcode=2 --inline-suppr --suppress=missingInclude --suppress=unusedFunction --suppress=*:src/otel/trace.pb-c.c --suppress=*:src/otel/common.pb-c.c --suppress=*:src/otel/resource.pb-c.c ./plugins ./src cppcheck --enable=all --error-exitcode=2 --inline-suppr --suppress=missingInclude --suppress=variableScope ./simulator flawfinder: name: Flawfinder Scan runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v6 - name: flawfinder_scan uses: david-a-wheeler/flawfinder@2.0.20 with: arguments: '--minlevel=3 .' build: runs-on: ubuntu-24.04 container: ghcr.io/neugates/build:x86_64-main steps: - uses: actions/checkout@v4 with: submodules: recursive - name: compile run: | git config --global --add safe.directory $(pwd) mkdir -p build && cd build cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake make -j4 - uses: actions/upload-artifact@v4 with: name: neuron-build path: | build ut: runs-on: ubuntu-24.04 container: ghcr.io/neugates/build:x86_64-main needs: [build] steps: - uses: actions/checkout@v4 with: submodules: recursive - uses: actions/download-artifact@v4 with: name: neuron-build path: ./build - name: unit test run: | chmod -R +x ./build/ cd build cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake ctest --output-on-failure - name: create cov report run: | sudo apt-get update sudo apt-get -y install lcov mkdir -p cov_report ./create_cov_report.sh ut - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: verbose: true fail_ci_if_error: true token: ${{ secrets.CODECOV_TOKEN }} directory: ./cov_report/ files: ./cov_report/cov-ut.info pft: runs-on: ubuntu-24.04 container: ghcr.io/neugates/build:x86_64-main needs: [build] strategy: matrix: plugin: [core, ekuiper, modbus, mqtt, metrics] steps: - uses: actions/checkout@v4 with: submodules: recursive - name: setup dependencies run: | sudo apt-get install -y mosquitto pip install -U pytest requests prometheus-client gmqtt pynng sniffio sudo apt-get install -y socat - uses: actions/download-artifact@v4 with: name: neuron-build path: ./build - name: function test run: | chmod -R +x ./build/ cd build cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake cd .. if [ "${{ matrix.plugin }}" = "core" ]; then pytest -s -v tests/ft \ --ignore=tests/ft/app/test_ekuiper.py \ --ignore=tests/ft/app/test_mqtt.py \ --ignore=tests/ft/app/test_azure.py \ --ignore=tests/ft/app/test_kafka.py \ --ignore=tests/ft/driver/test_modbus.py \ --ignore=tests/ft/metrics/test_metrics.py \ --ignore=tests/ft/login/test_launch.py \ --ignore=tests/ft/login/test_filter_error.py \ --ignore=tests/ft/login/test_login.py elif [ "${{ matrix.plugin }}" = "ekuiper" ]; then pytest -s -v tests/ft/app/"test_ekuiper.py" elif [ "${{ matrix.plugin }}" = "modbus" ]; then pytest -s -v tests/ft/driver/"test_modbus.py" elif [ "${{ matrix.plugin }}" = "mqtt" ]; then pytest -s -v tests/ft/app/"test_mqtt.py" else pytest -s -v tests/ft/metrics/"test_metrics.py" fi - name: create cov report run: | sudo apt-get update sudo apt-get -y install lcov mkdir -p cov_report ./create_cov_report.sh ${{ matrix.plugin }} - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: verbose: true fail_ci_if_error: true token: ${{ secrets.CODECOV_TOKEN }} directory: ./cov_report/ files: ./cov_report/cov-${{ matrix.plugin }}.info pft_kafka: runs-on: ubuntu-24.04 container: ghcr.io/neugates/build:x86_64-main needs: [build] services: kafka: image: apache/kafka:3.7.0 env: KAFKA_NODE_ID: "1" KAFKA_PROCESS_ROLES: broker,controller KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093 KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1" KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: "0" CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk ports: - 9092:9092 options: >- --health-cmd "bash -c 'echo > /dev/tcp/localhost/9092'" --health-interval 10s --health-timeout 5s --health-retries 10 --health-start-period 30s steps: - uses: actions/checkout@v4 with: submodules: recursive - name: setup dependencies run: | python3 -m pip install --upgrade pip pip install -U pytest requests confluent-kafka==2.3.0 - uses: actions/download-artifact@v4 with: name: neuron-build path: ./build - name: debug kafka plugin deps run: | echo "=== libs in staging prefix ===" ls -la /home/neuron/main/libs/x86_64-linux-gnu/lib/librdkafka* || echo "no librdkafka" ls -la /home/neuron/main/libs/x86_64-linux-gnu/lib/libzstd* || echo "no libzstd" ls -la /home/neuron/main/libs/x86_64-linux-gnu/lib/libsasl2* || echo "no libsasl2" echo "=== libs in /usr/local/lib ===" ls -la /usr/local/lib/librdkafka* /usr/local/lib/libzstd* /usr/local/lib/libsasl2* 2>/dev/null || echo "none yet" echo "=== ldd librdkafka from staging ===" ldd /home/neuron/main/libs/x86_64-linux-gnu/lib/librdkafka.so.1 || true echo "=== ldd plugin-kafka from build ===" chmod -R +x ./build/ 2>/dev/null || true ldd ./build/plugins/libplugin-kafka.so || true - name: function test env: KAFKA_BROKER: kafka:9092 run: | chmod -R +x ./build/ cd build cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake cd .. ldconfig echo "=== post-ldconfig ldd check ===" ldd ./build/plugins/libplugin-kafka.so || true ldd /usr/local/lib/librdkafka.so.1 || true echo "=== try manual dlopen ===" python3 -c "import ctypes; ctypes.CDLL('./build/plugins/libplugin-kafka.so')" 2>&1 || true pytest -s -v tests/ft/app/test_kafka.py - name: create cov report run: | sudo apt-get update sudo apt-get -y install lcov mkdir -p cov_report ./create_cov_report.sh kafka - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: verbose: true fail_ci_if_error: true token: ${{ secrets.CODECOV_TOKEN }} directory: ./cov_report/ files: ./cov_report/cov-kafka.info