From 9326e848d0a71e3899d3289eb52745397ec84cfe Mon Sep 17 00:00:00 2001 From: Aliaksandr Adziareika Date: Fri, 29 Aug 2025 10:11:52 +0200 Subject: [PATCH 1/4] Add CI script installing prebuilt openDAQ, building module, running tests, and uploading reports - Add download framework action - Add install framework action - Add determine openDAQ version action - Add build and test simple device module with binary framework package --- .github/actions/framework-download/action.yml | 50 ++++++++++ .github/actions/framework-install/action.yml | 42 +++++++++ .../framework-latest-release/action.yml | 91 +++++++++++++++++++ .github/workflows/ci.yml | 55 +++++++++++ CMakeLists.txt | 39 ++++---- example_module/CMakeLists.txt | 2 +- example_module/src/CMakeLists.txt | 2 + example_module/tests/CMakeLists.txt | 27 +++++- example_module/tests/test_app.cpp | 12 +-- example_module/tests/test_example_module.cpp | 15 +-- external/CMakeLists.txt | 7 +- external/openDAQ/CMakeLists.txt | 12 ++- server_application/CMakeLists.txt | 5 +- 13 files changed, 311 insertions(+), 48 deletions(-) create mode 100644 .github/actions/framework-download/action.yml create mode 100644 .github/actions/framework-install/action.yml create mode 100644 .github/actions/framework-latest-release/action.yml create mode 100644 .github/workflows/ci.yml diff --git a/.github/actions/framework-download/action.yml b/.github/actions/framework-download/action.yml new file mode 100644 index 0000000..6d34b86 --- /dev/null +++ b/.github/actions/framework-download/action.yml @@ -0,0 +1,50 @@ +name: Download openDAQ framework package +description: "Download a package from S3 for Linux or Windows" + +inputs: + src-opendaq-framework-dev: + required: true + description: "S3 path to the package" + dst-opendaq-framework-dev: + required: false + default: ${{ runner.temp }} + description: "Destination path for downloaded package" + + aws_access_key_id: + required: true + description: "AWS Access Key ID" + aws_secret_access_key: + required: true + description: "AWS Secret Access Key" + aws_region: + required: true + description: "AWS Region" + +runs: + using: composite + steps: + - name: Configure AWS + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ inputs.aws_access_key_id }} + aws-secret-access-key: ${{ inputs.aws_secret_access_key }} + aws-region: ${{ inputs.aws_region }} + + - name: Download package from S3 (Linux/macOS) + if: runner.os != 'Windows' + shell: bash + run: | + set -e + DST="${{ inputs.dst-opendaq-framework-dev }}" + SRC="${{ inputs.src-opendaq-framework-dev }}" + echo "Downloading $SRC to $DST" + aws s3 cp "$SRC" "$DST" + + - name: Download package from S3 (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + $dst = "${{ inputs.dst-opendaq-framework-dev }}" + $src = "${{ inputs.src-opendaq-framework-dev }}" + Write-Host "Downloading $src to $dst" + aws s3 cp "$src" "$dst" diff --git a/.github/actions/framework-install/action.yml b/.github/actions/framework-install/action.yml new file mode 100644 index 0000000..6e3e6de --- /dev/null +++ b/.github/actions/framework-install/action.yml @@ -0,0 +1,42 @@ +name: Install openDAQ framework package + +inputs: + opendaq-framework-package-filename: + required: true + + opendaq-framework-package-path: + required: false + default: ${{ runner.temp }} + +runs: + using: composite + + steps: + - name: Install openDAQ framework package (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + $packagePath = Join-Path "${{ inputs.opendaq-framework-package-path }}" "${{ inputs.opendaq-framework-package-filename }}" + $process = Start-Process -FilePath $packagePath -ArgumentList "/S" -Wait -NoNewWindow -PassThru + if ($process.ExitCode -eq 0) { + Write-Host "OpenDAQ installed successfully, updating PATH..." + $openDAQBin = "C:\Program Files\openDAQ\bin" + Add-Content -Path $env:GITHUB_ENV -Value "PATH=$openDAQBin`;$env:PATH" + Write-Host $env:PATH + } + else { + Write-Host "OpenDAQ installation failed with exit code $($process.ExitCode)" + exit $process.ExitCode + } + + - name: Install openDAQ framework package (Linux) + if: runner.os == 'Linux' + shell: bash + run: sudo dpkg -i "${{ inputs.opendaq-framework-package-path }}/${{ inputs.opendaq-framework-package-filename }}" + + - name: Unsupported runner OS + if: runner.os != 'Windows' && runner.os != 'Linux' + shell: bash + run: | + echo "Install openDAQ is not supported for ${{ runner.os }}" + exit 1 diff --git a/.github/actions/framework-latest-release/action.yml b/.github/actions/framework-latest-release/action.yml new file mode 100644 index 0000000..b0ddef5 --- /dev/null +++ b/.github/actions/framework-latest-release/action.yml @@ -0,0 +1,91 @@ +name: Determine latest openDAQ framework artefact + +inputs: + win32-force: + required: false + default: false + +outputs: + version: + description: "Latest openDAQ release version" + value: ${{ steps.determine-latest-package.outputs.version }} + platform: + description: "Detected platform" + value: ${{ steps.determine-latest-package.outputs.platform }} + packaging: + description: "Package type (deb/exe)" + value: ${{ steps.determine-latest-package.outputs.packaging }} + artefact: + description: "Artefact filename" + value: ${{ steps.determine-latest-package.outputs.artefact }} + uri: + description: "Full URI to artefact" + value: ${{ steps.determine-latest-package.outputs.uri }} + scheme: + description: "Scheme (s3)" + value: ${{ steps.determine-latest-package.outputs.scheme }} + authority: + description: "Authority (bucket)" + value: ${{ steps.determine-latest-package.outputs.authority }} + path: + description: "Path inside bucket" + value: ${{ steps.determine-latest-package.outputs.path }} + +runs: + using: composite + steps: + - name: Determine latest openDAQ package + id: determine-latest-package + shell: bash + run: | + set -e + + version=$(gh api repos/openDAQ/openDAQ/releases/latest --jq '.tag_name') + if [[ -z "$version" || "$version" == "null" ]]; then + echo "::error::Failed to determine latest openDAQ release version" + exit 1 + fi + + version=${version#v} + platform="" + packaging="" + + if [[ "$RUNNER_OS" == "Linux" ]]; then + arch=$(uname -m) + if [[ "$arch" == "x86_64" ]]; then + platform="ubuntu22.04-x86_64" + elif [[ "$arch" == "aarch64" ]]; then + platform="ubuntu22.04-arm64" + else + echo "::error::Unsupported Linux arch: $arch" + exit 1 + fi + packaging="deb" + + elif [[ "$RUNNER_OS" == "Windows" ]]; then + WIN32_FORCE="${{ inputs.win32-force }}" + if [[ "$WIN32_FORCE" == "true" ]]; then + platform="win32" + else + platform="win64" + fi + packaging="exe" + + else + echo "::error::Unsupported runner OS $RUNNER_OS" + exit 1 + fi + + artefact="opendaq-${version}-${platform}.${packaging}" + scheme="s3" + authority="bb-blueberry-sdk-releases" + sdk="releases/v${version}/SDK" + + echo "version=$version" >> $GITHUB_OUTPUT + echo "platform=$platform" >> $GITHUB_OUTPUT + echo "packaging=$packaging" >> $GITHUB_OUTPUT + echo "artefact=$artefact" >> $GITHUB_OUTPUT + echo "scheme=$scheme" >> $GITHUB_OUTPUT + echo "authority=$authority" >> $GITHUB_OUTPUT + echo "path=$sdk" >> $GITHUB_OUTPUT + echo "uri=${scheme}://${authority}/${sdk}/${artefact}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..9e5be89 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,55 @@ +name: Build and Test simple device module with latest openDAQ release + +on: + pull_request: + branches: + - main + - jira/* + +env: + GH_TOKEN: ${{ github.token }} + +jobs: + build-and-test: + + strategy: + matrix: + include: + - os: ubuntu-latest + generator: Ninja + - os: windows-latest + generator: "Visual Studio 17 2022" + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout simple device module repo + uses: actions/checkout@v4 + + - name: Determine openDAQ framework package + id: opendaq-framework + uses: ./.github/actions/framework-latest-release + + - name: Download openDAQ framework + uses: ./.github/actions/framework-download + with: + src-opendaq-framework-dev: ${{ steps.opendaq-framework.outputs.uri }} + dst-opendaq-framework-dev: ${{ runner.temp }}/${{ steps.opendaq-framework.outputs.artefact }} + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_REGION }} + + - name: Install openDAQ framework package + uses: ./.github/actions/framework-install + with: + opendaq-framework-package-filename: ${{ steps.opendaq-framework.outputs.artefact }} + + - name: Configure simple device module with CMake + run: cmake -B build/output -S . -G "${{ matrix.generator }}" -DEXAMPLE_MODULE_ENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release + + + - name: Build simple device module with CMake + run: cmake --build build/output --config Release + + - name: Run simple device module tests with CMake + run: ctest --test-dir build/output --output-on-failure -C Release -V diff --git a/CMakeLists.txt b/CMakeLists.txt index c046522..a631fc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,23 @@ cmake_minimum_required(VERSION 3.25) -set(REPO_NAME example_device_module) +project(SimpleDeviceModule VERSION 1.0.0) + +set(SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER "" CACHE STRING "Version of openDAQ SDK to build SimpleDeviceModule with") + set(REPO_OPTION_PREFIX EXAMPLE_MODULE) +set(SDK_TARGET_NAMESPACE daq) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(CMAKE_MESSAGE_CONTEXT_SHOW ON CACHE BOOL "Show CMake message context") + +option(EXAMPLE_MODULE_ENABLE_TESTS "Enable building tests for example_module" ON) +option(SIMPLE_DEVICE_MODULE_ENABLE_SERVER_APP "Enable building example server application" OFF) +if(SIMPLE_DEVICE_MODULE_ENABLE_SERVER_APP) + set(DAQMODULES_OPENDAQ_SERVER_MODULE ON CACHE BOOL "" FORCE) + set(OPENDAQ_ENABLE_NATIVE_STREAMING ON CACHE BOOL "" FORCE) +endif() -project(${REPO_NAME} VERSION 1.0.0) +list(APPEND CMAKE_MESSAGE_CONTEXT ${PROJECT_NAME}) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") if (POLICY CMP0135) cmake_policy(SET CMP0135 NEW) @@ -12,29 +27,21 @@ if (POLICY CMP0077) cmake_policy(SET CMP0077 NEW) endif() -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -list(APPEND CMAKE_MESSAGE_CONTEXT ${REPO_NAME}) -set(CMAKE_MESSAGE_CONTEXT_SHOW ON CACHE BOOL "Show CMake message context") - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - add_definitions(-DFMT_HEADER_ONLY) -option(OPENDAQ_DEVICE_EXAMPLE_ENABLE_SERVER_APP "Enable building example server application" OFF) - include(CommonUtils) setup_repo(${REPO_OPTION_PREFIX}) -if(OPENDAQ_DEVICE_EXAMPLE_ENABLE_SERVER_APP) - set(DAQMODULES_OPENDAQ_SERVER_MODULE ON CACHE BOOL "" FORCE) - set(OPENDAQ_ENABLE_NATIVE_STREAMING ON CACHE BOOL "" FORCE) +if (EXAMPLE_MODULE_ENABLE_TESTS) + message(STATUS "Unit tests are ENABLED") + enable_testing() endif() add_subdirectory(external) add_subdirectory(example_module) -if(OPENDAQ_DEVICE_EXAMPLE_ENABLE_SERVER_APP) - message(STATUS "Enbled example server application") +if(SIMPLE_DEVICE_MODULE_ENABLE_SERVER_APP) + message(STATUS "Enbled example server application") add_subdirectory(server_application) endif() @@ -56,4 +63,4 @@ elseif (UNIX AND NOT APPLE) endif() # Include CPack for packaging -include(CPack) \ No newline at end of file +include(CPack) diff --git a/example_module/CMakeLists.txt b/example_module/CMakeLists.txt index 6338c6d..a5f2808 100644 --- a/example_module/CMakeLists.txt +++ b/example_module/CMakeLists.txt @@ -3,6 +3,6 @@ project(ExampleModule VERSION 1.0.0 LANGUAGES CXX) add_subdirectory(src) -if (OPENDAQ_ENABLE_TESTS) +if (EXAMPLE_MODULE_ENABLE_TESTS) add_subdirectory(tests) endif() diff --git a/example_module/src/CMakeLists.txt b/example_module/src/CMakeLists.txt index 0726437..b642274 100644 --- a/example_module/src/CMakeLists.txt +++ b/example_module/src/CMakeLists.txt @@ -1,5 +1,6 @@ set(LIB_NAME example_module) set(MODULE_HEADERS_DIR ../include/${TARGET_FOLDER_NAME}) +list(APPEND CMAKE_MESSAGE_CONTEXT ${LIB_NAME}) set(SRC_Include common.h module_dll.h @@ -37,6 +38,7 @@ if (MSVC) target_compile_options(${LIB_NAME} PRIVATE /bigobj) endif() +find_package(openDAQ ${SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER} REQUIRED) target_link_libraries(${LIB_NAME} PUBLIC daq::opendaq ) diff --git a/example_module/tests/CMakeLists.txt b/example_module/tests/CMakeLists.txt index 7265fbc..38fce64 100644 --- a/example_module/tests/CMakeLists.txt +++ b/example_module/tests/CMakeLists.txt @@ -1,5 +1,6 @@ set(MODULE_NAME example_module) set(TEST_APP test_${MODULE_NAME}) +list(APPEND CMAKE_MESSAGE_CONTEXT ${TEST_APP}) set(TEST_SOURCES test_example_module.cpp test_app.cpp @@ -8,11 +9,33 @@ set(TEST_SOURCES test_example_module.cpp add_executable(${TEST_APP} ${TEST_SOURCES} ) -target_link_libraries(${TEST_APP} PRIVATE daq::test_utils +find_package(openDAQ ${SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER} REQUIRED) +target_link_libraries(${TEST_APP} PRIVATE daq::opendaq ${SDK_TARGET_NAMESPACE}::${MODULE_NAME} ) +if (NOT TARGET gtest) + include(FetchContent) + FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip + ) + set(BUILD_GMOCK ON CACHE BOOL "" FORCE) + set(BUILD_GTEST ON CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(googletest) +endif() + +target_link_libraries(${TEST_APP} + PRIVATE + GTest::gtest + GTest::gtest_main + GTest::gmock + GTest::gmock_main +) + add_test(NAME ${TEST_APP} COMMAND $ - WORKING_DIRECTORY bin + WORKING_DIRECTORY $ ) + +set_target_properties(${TEST_APP} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY $) diff --git a/example_module/tests/test_app.cpp b/example_module/tests/test_app.cpp index 4f6ea7d..37ad2b1 100644 --- a/example_module/tests/test_app.cpp +++ b/example_module/tests/test_app.cpp @@ -1,20 +1,10 @@ -#include -#include +#include #include -#include -#include - int main(int argc, char** args) { - daq::daqInitializeCoreObjectsTesting(); - daqInitModuleManagerLibrary(); - testing::InitGoogleTest(&argc, args); - testing::TestEventListeners& listeners = testing::UnitTest::GetInstance()->listeners(); - listeners.Append(new DaqMemCheckListener()); - auto res = RUN_ALL_TESTS(); return res; diff --git a/example_module/tests/test_example_module.cpp b/example_module/tests/test_example_module.cpp index 2847362..751e5dd 100644 --- a/example_module/tests/test_example_module.cpp +++ b/example_module/tests/test_example_module.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include @@ -19,8 +18,6 @@ using testing::SizeIs; using namespace daq; using namespace std::chrono_literals; -using ExampleChannel = modules::example_module::ExampleChannel; -using ExampleDevice = modules::example_module::ExampleDevice; using ExampleModuleTest = testing::Test; static ModulePtr CreateModule() @@ -153,10 +150,9 @@ TEST_F(ExampleModuleTest, GetDeviceType) DictPtr deviceTypes; ASSERT_NO_THROW(deviceTypes = moduleLib.getAvailableDeviceTypes()); - DeviceTypePtr expected = ExampleDevice::CreateType(); - StringPtr key = expected.getId(); + StringPtr key = "example_dev"; ASSERT_TRUE(deviceTypes.hasKey(key)); - ASSERT_EQ(deviceTypes.get(key).getId(), expected.getId()); + ASSERT_EQ(deviceTypes.get(key).getId(), key); } TEST_F(ExampleModuleTest, GetValueSignals) @@ -250,9 +246,9 @@ TEST_F(ExampleModuleTest, GetDomainSignal) RatioPtr tickResolution; ASSERT_NO_THROW(tickResolution = domainDescriptor.getTickResolution()) << id << " get domain signal tick resolution failed"; - ASSERT_TRUE(tickResolution.assigned()) << "[" + ASSERT_TRUE(tickResolution.assigned()) << id << " domain signal tick resolution is not assigned"; - ASSERT_EQ(tickResolution, ExampleChannel::getResolution()) + ASSERT_EQ(tickResolution, Ratio(1, 1000000)) << id << " domain signal tick resolution mismatches"; DataRulePtr dataRule; @@ -269,9 +265,6 @@ TEST_F(ExampleModuleTest, GetDomainSignal) StringPtr keyStart = "start"; ASSERT_EQ(dataRule.getParameters().get(keyStart), 0) << id << " domain signal data rule \"" << keyStart << "\" parameter mismatches"; - - ASSERT_EQ(domainDescriptor.getOrigin(), ExampleChannel::getEpoch()) - << id << " domain signal origin mismatches"; } } diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index c6ccc9d..1418c82 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -5,6 +5,7 @@ if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) message(FATAL_ERROR "In-source build is not supported!") endif() -include(FetchContent) - -add_subdirectory(openDAQ) +find_package(openDAQ ${SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER}) +if (NOT openDAQ_FOUND) + add_subdirectory(openDAQ) +endif() diff --git a/external/openDAQ/CMakeLists.txt b/external/openDAQ/CMakeLists.txt index 85ee031..4f8c4ff 100644 --- a/external/openDAQ/CMakeLists.txt +++ b/external/openDAQ/CMakeLists.txt @@ -1,12 +1,18 @@ set(OPENDAQ_ENABLE_TESTS false) +if(NOT SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER) + message(FATAL_ERROR "SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER is not set") +endif() + +include(FetchContent) + FetchContent_Declare( openDAQ GIT_REPOSITORY https://github.com/openDAQ/openDAQ.git - GIT_TAG v3.20.1 + GIT_TAG v${SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER} GIT_PROGRESS ON - SYSTEM - FIND_PACKAGE_ARGS 3.20.1 GLOBAL + SYSTEM + FIND_PACKAGE_ARGS ${SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER} GLOBAL ) FetchContent_MakeAvailable(openDAQ) diff --git a/server_application/CMakeLists.txt b/server_application/CMakeLists.txt index c9a7a15..41db6de 100644 --- a/server_application/CMakeLists.txt +++ b/server_application/CMakeLists.txt @@ -1,3 +1,6 @@ +set(SERVER_APP_NAME test_${MODULE_NAME}) +list(APPEND CMAKE_MESSAGE_CONTEXT ${SERVER_APP_NAME}) + add_executable(server_example main.cpp) target_link_libraries(server_example PRIVATE daq::opendaq) @@ -5,4 +8,4 @@ target_link_libraries(server_example PRIVATE daq::opendaq) add_dependencies( example_module daq::native_stream_srv_module -) \ No newline at end of file +) From e4c5bb24407b281a31ec1a66ae90c73e438c0dc9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Adziareika Date: Tue, 9 Sep 2025 13:51:18 +0200 Subject: [PATCH 2/4] Add CI workflow manual run --- .../framework-latest-release/action.yml | 30 +++++++++++++++---- .github/workflows/ci.yml | 22 +++++++++++++- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/.github/actions/framework-latest-release/action.yml b/.github/actions/framework-latest-release/action.yml index b0ddef5..c2750b5 100644 --- a/.github/actions/framework-latest-release/action.yml +++ b/.github/actions/framework-latest-release/action.yml @@ -1,32 +1,45 @@ name: Determine latest openDAQ framework artefact inputs: + + opendaq-framework-release-version: + required: false + default: latest + win32-force: required: false default: false outputs: + version: description: "Latest openDAQ release version" value: ${{ steps.determine-latest-package.outputs.version }} + platform: description: "Detected platform" value: ${{ steps.determine-latest-package.outputs.platform }} + packaging: description: "Package type (deb/exe)" value: ${{ steps.determine-latest-package.outputs.packaging }} + artefact: description: "Artefact filename" value: ${{ steps.determine-latest-package.outputs.artefact }} + uri: description: "Full URI to artefact" value: ${{ steps.determine-latest-package.outputs.uri }} + scheme: description: "Scheme (s3)" value: ${{ steps.determine-latest-package.outputs.scheme }} + authority: description: "Authority (bucket)" value: ${{ steps.determine-latest-package.outputs.authority }} + path: description: "Path inside bucket" value: ${{ steps.determine-latest-package.outputs.path }} @@ -40,13 +53,20 @@ runs: run: | set -e - version=$(gh api repos/openDAQ/openDAQ/releases/latest --jq '.tag_name') - if [[ -z "$version" || "$version" == "null" ]]; then - echo "::error::Failed to determine latest openDAQ release version" - exit 1 + input_version="${{ inputs.opendaq-framework-release-version }}" + + if [[ -z "$input_version" || "$input_version" == "latest" ]]; then + version=$(gh api repos/openDAQ/openDAQ/releases/latest --jq '.tag_name') + if [[ -z "$version" || "$version" == "null" ]]; then + echo "::error::Failed to determine latest openDAQ release version" + exit 1 + fi + + version=${version#v} + else + version="$input_version" fi - version=${version#v} platform="" packaging="" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e5be89..d0dce16 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,11 +1,27 @@ name: Build and Test simple device module with latest openDAQ release on: + push: + branches: + - main + pull_request: branches: - main - jira/* + workflow_dispatch: + inputs: + + branch: + required: false + default: "main" + + opendaq-framework-version: + required: false + type: string + default: latest + env: GH_TOKEN: ${{ github.token }} @@ -17,6 +33,7 @@ jobs: include: - os: ubuntu-latest generator: Ninja + - os: windows-latest generator: "Visual Studio 17 2022" @@ -25,10 +42,14 @@ jobs: steps: - name: Checkout simple device module repo uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.branch || github.event.client_payload.branch || github.ref }} - name: Determine openDAQ framework package id: opendaq-framework uses: ./.github/actions/framework-latest-release + with: + opendaq-framework-release-version: ${{ github.event.inputs.opendaq-framework-version || 'latest' }} - name: Download openDAQ framework uses: ./.github/actions/framework-download @@ -47,7 +68,6 @@ jobs: - name: Configure simple device module with CMake run: cmake -B build/output -S . -G "${{ matrix.generator }}" -DEXAMPLE_MODULE_ENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release - - name: Build simple device module with CMake run: cmake --build build/output --config Release From 165a61ab5debf7d30c43dd3ab1147cd05ab5d8fc Mon Sep 17 00:00:00 2001 From: Aliaksandr Adziareika <8034372+alexadereyko@users.noreply.github.com> Date: Wed, 10 Sep 2025 09:45:26 +0200 Subject: [PATCH 3/4] Add README for project and GitHub Actions - Project README: overview, build/test instructions, openDAQ integration notes - framework-latest-release: inputs, outputs, usage - framework-download: inputs, usage - framework-install: inputs, usage, OS-specific install details --- .github/actions/README.md | 55 ++++++++++++++++ .github/actions/framework-download/README.md | 45 +++++++++++++ .github/actions/framework-install/README.md | 60 +++++++++++++++++ .../framework-latest-release/README.md | 61 +++++++++++++++++ .github/workflows/README.md | 4 ++ .github/workflows/ci.md | 50 ++++++++++++++ README.md | 65 ++++++++++++++++--- 7 files changed, 332 insertions(+), 8 deletions(-) create mode 100644 .github/actions/README.md create mode 100644 .github/actions/framework-download/README.md create mode 100644 .github/actions/framework-install/README.md create mode 100644 .github/actions/framework-latest-release/README.md create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/ci.md diff --git a/.github/actions/README.md b/.github/actions/README.md new file mode 100644 index 0000000..b71210f --- /dev/null +++ b/.github/actions/README.md @@ -0,0 +1,55 @@ +# GitHub Reusable Actions for openDAQ Framework + +This directory contains **reusable GitHub Actions** used to work with the **openDAQ framework**. +The actions support determining the latest or specific release, downloading it from S3, and installing it on Linux or Windows runners. + +--- + +## Actions Overview + +| Action | Description | Inputs | Outputs | +|--------|-------------|--------|---------| +| [framework-latest-release](./framework-latest-release/README.md) | Determines which openDAQ framework package to use (latest release or specific version). | `opendaq-framework-release-version`, `win32-force` | `version`, `platform`, `packaging`, `artefact`, `uri`, `scheme`, `authority`, `path` | +| [framework-download](./framework-download/README.md) | Downloads the resolved openDAQ framework package from AWS S3. | `src-opendaq-framework-dev`, `dst-opendaq-framework-dev`, `aws_access_key_id`, `aws_secret_access_key`, `aws_region` | None | +| [framework-install](./framework-install/README.md) | Installs the downloaded openDAQ framework package on the runner. | `opendaq-framework-package-filename`, `opendaq-framework-package-path` | None | + +--- + +## Recommended Usage + +A typical workflow combining all three actions: + +```yaml +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Resolve openDAQ framework version + id: framework + uses: ./.github/actions/framework-latest-release + with: + opendaq-framework-release-version: latest + + - name: Download openDAQ framework + uses: ./.github/actions/framework-download + with: + src-opendaq-framework-dev: ${{ steps.framework.outputs.uri }} + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_REGION }} + + - name: Install openDAQ framework + uses: ./.github/actions/framework-install + with: + opendaq-framework-package-filename: ${{ steps.framework.outputs.artefact }} +``` + +## Notes + +- Linux and Windows runners are supported. +- framework-latest-release requires GitHub CLI (gh) and jq. +- framework-download requires AWS CLI. +- framework-install installs differently depending on OS. diff --git a/.github/actions/framework-download/README.md b/.github/actions/framework-download/README.md new file mode 100644 index 0000000..e820d1e --- /dev/null +++ b/.github/actions/framework-download/README.md @@ -0,0 +1,45 @@ +# framework-download + +This composite action downloads an **openDAQ framework package** from **AWS S3** to the runner. +It supports both Linux/macOS and Windows runners. + +--- + +## Inputs + +| Name | Required | Default | Description | +|-----------------------------|----------|---------------------|-------------| +| `src-opendaq-framework-dev` | yes | — | Full S3 URI to the package (e.g. `s3://bucket/releases/v3.20.4/SDK/opendaq-3.20.4-win64.exe`). | +| `dst-opendaq-framework-dev` | no | `${{ runner.temp }}`| Destination path for the downloaded package on the runner. | +| `aws_access_key_id` | yes | — | AWS Access Key ID used for authentication. | +| `aws_secret_access_key` | yes | — | AWS Secret Access Key used for authentication. | +| `aws_region` | yes | — | AWS Region where the bucket is located. | + +--- + +## Example usage + +```yaml +jobs: + download: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download openDAQ framework + uses: ./.github/actions/framework-download + with: + src-opendaq-framework-dev: "s3://bb-blueberry-sdk-releases/releases/v3.20.4/SDK/opendaq-3.20.4-ubuntu22.04-x86_64.deb" + dst-opendaq-framework-dev: "/tmp/opendaq-3.20.4-ubuntu22.04-x86_64.deb" + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_REGION }} +``` + +## Notes +- Uses aws-actions/configure-aws-credentials to set up credentials. +- Downloads via aws s3 cp, which must be available in the runner environment. + - On GitHub-hosted runners, the AWS CLI is pre-installed. +- Supports Linux/macOS (bash) and Windows (pwsh) runners. +- Destination path must be writable by the runner. diff --git a/.github/actions/framework-install/README.md b/.github/actions/framework-install/README.md new file mode 100644 index 0000000..fb3f31c --- /dev/null +++ b/.github/actions/framework-install/README.md @@ -0,0 +1,60 @@ +# framework-install + +This composite action installs an **openDAQ framework package** on the runner. +It supports **Windows (installer executable)** and **Linux (Debian package)**. +Other operating systems are not supported. + +--- + +## Inputs + +| Name | Required | Default | Description | +|-----------------------------------|----------|---------------------|-------------| +| `opendaq-framework-package-filename` | yes | — | Name of the package file (e.g. `opendaq-3.20.4-win64.exe`, `opendaq-3.20.4-ubuntu22.04-x86_64.deb`). | +| `opendaq-framework-package-path` | no | `${{ runner.temp }}`| Directory where the package file is located. | + +--- + +## Example usage + +```yaml +jobs: + install: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install openDAQ framework + uses: ./.github/actions/framework-install + with: + opendaq-framework-package-filename: "opendaq-3.20.4-win64.exe" + opendaq-framework-package-path: "C:\\actions\\temp" +``` +```yml +jobs: + install: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install openDAQ framework + uses: ./.github/actions/framework-install + with: + opendaq-framework-package-filename: "opendaq-3.20.4-ubuntu22.04-x86_64.deb" + opendaq-framework-package-path: "/tmp" +``` + +## Notes +- Windows: + - Runs the installer in silent mode (/S). + - After installation, updates the PATH environment variable to include: + ```powershell + PATH=C:\Program Files\openDAQ\bin;$PATH + ``` +- Linux: + - Installs the package via dpkg -i. + - Requires sudo access on the runner. +- Unsupported OS: + - The action exits with an error for macOS or other platforms. diff --git a/.github/actions/framework-latest-release/README.md b/.github/actions/framework-latest-release/README.md new file mode 100644 index 0000000..8791f2d --- /dev/null +++ b/.github/actions/framework-latest-release/README.md @@ -0,0 +1,61 @@ +# framework-latest-release + +This composite action determines the **openDAQ framework package** to use. +It supports resolving either the **latest release** from GitHub or a **specific version** provided as input, +and outputs all required information to download and install the package. + +--- + +## Inputs + +| Name | Required | Default | Description | +|-------------------------------------|----------|---------|-------------| +| `opendaq-framework-release-version` | no | `latest`| openDAQ framework version. Use `latest` for the newest release, or provide a specific version (e.g. `3.20.4`). | +| `win32-force` | no | `false` | On Windows runners, forces `win32` instead of `win64` platform. | + +--- + +## Outputs + +| Name | Description | +|------------|-------------| +| `version` | Resolved openDAQ release version (e.g. `3.20.4`). | +| `platform` | Detected platform string (`ubuntu22.04-x86_64`, `ubuntu22.04-arm64`, `win32`, `win64`). | +| `packaging`| Package type (`deb` on Linux, `exe` on Windows). | +| `artefact` | Resolved artefact filename (e.g. `opendaq-3.20.4-win64.exe`). | +| `scheme` | URI scheme (currently `s3`). | +| `authority`| Storage authority (S3 bucket name). | +| `path` | Path inside the bucket (e.g. `releases/v3.20.4/SDK`). | +| `uri` | Full URI to the artefact (e.g. `s3://bucket/releases/v3.20.4/SDK/opendaq-3.20.4-win64.exe`). | + +--- + +## Example usage + +```yaml +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Determine openDAQ framework package + id: framework + uses: ./.github/actions/framework-latest-release + with: + opendaq-framework-release-version: latest + + - name: Print resolved artefact info + run: | + echo "Version: ${{ steps.framework.outputs.version }}" + echo "Platform: ${{ steps.framework.outputs.platform }}" + echo "Artefact: ${{ steps.framework.outputs.artefact }}" + echo "URI: ${{ steps.framework.outputs.uri }}" +``` + +## Notes +- The action relies on GitHub CLI (gh) and jq. +- These are pre-installed on GitHub-hosted Ubuntu and Windows runners. +- On Windows, if you explicitly need a 32-bit package, set win32-force: true. +- If the latest release cannot be determined, the action fails. diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000..6aed2f8 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,4 @@ +## CI/CD Workflows + +- [Build and Test Simple Device Module](ci.md) + Builds and tests against openDAQ framework (latest or specific version). diff --git a/.github/workflows/ci.md b/.github/workflows/ci.md new file mode 100644 index 0000000..7ce9266 --- /dev/null +++ b/.github/workflows/ci.md @@ -0,0 +1,50 @@ +# Build and Test Simple Device Module with openDAQ Framework + +This workflow builds and tests the **Simple Device Module** using the **openDAQ framework**. +It supports using either the **latest release** of openDAQ or a **specific version** provided as input. + +## Triggers + +- **push** to `main` +- **pull_request** targeting `main` or `jira/*` +- **workflow_dispatch** (manual run with parameters) + +## Inputs (workflow_dispatch) + +| Name | Type | Required | Default | Description | +|-----------------------------|--------|----------|---------|-------------| +| `branch` | string | no | `main` | Branch to checkout | +| `opendaq-framework-version` | string | no | `latest`| openDAQ framework version. Use `latest` for the newest release, or provide a specific version tag (e.g. `3.20.4`). | + +## Matrix + +The workflow runs on: + +- `ubuntu-latest` (CMake + Ninja) +- `windows-latest` (CMake + Visual Studio 17 2022) + +## Jobs and Steps + +1. **Checkout Simple Device Module repo** — fetches the specified branch. +2. **Determine openDAQ framework package** + - If `opendaq-framework-version` is `latest`, the workflow queries GitHub Releases for the newest version. + - If a version string is provided, that version is used directly. +3. **Download openDAQ framework** — fetches the package (from S3). +4. **Install openDAQ framework package** — installs the framework. +5. **Configure with CMake** — configures the project with the appropriate generator. +6. **Build with CMake** — builds the project. +7. **Run tests** — executes unit tests with CTest. + +## Examples + +### Automatic runs +- On push to `main` +- On pull request to `main` or `jira/*` + +### Manual run +```yaml +workflow_dispatch: + inputs: + branch: "feature/my-branch" + opendaq-framework-version: "3.20.4" +``` diff --git a/README.md b/README.md index d982f87..41b9d65 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,63 @@ -# Example device module +# SimpleDeviceModule -Simple example that builds an openDAQ module giving access to an example device. Said device contains 2 channels, each with a value and time signal. The value signal outputs a counter signal, increasing at a rate of 1 per second. +**SimpleDeviceModule** is an example module demonstrating how to build and test a simple device module using the **openDAQ framework**. +This repository can serve as a template for building other modules integrated with openDAQ. -## Testing the module +--- -To test the module, enable the `OPENDAQ_DEVICE_EXAMPLE_ENABLE_SERVER_APP` cmake flag. Doing so will add an openDAQ native server module to your build targets, and add an additional "server_application" executable. Running the executable will create a device, add an openDAQ server, and enable discovery. +## Prerequisites -To connect to the device, the openDAQ Python GUI application can be used (Latest Python version is recommended): +- **CMake** (>= 3.25) +- **Git** +- **C++ compiler** (Visual Studio on Windows, GCC/Clang on Linux/macOS) +- Optional: **openDAQ framework** installed locally or available via versioned checkout +--- + +## Building the Project + +There are two main ways to provide the openDAQ framework: + +1. **Using a local openDAQ installation** + - Install the openDAQ package on your machine. + - Set the environment variable `OPENDAQ_ROOT` to the path containing the binaries. + - Then CMake will automatically detect the binaries during configuration. + +```bash +export OPENDAQ_ROOT=/path/to/opendaq + +cmake -S . -B build/output \ + -G "Ninja" \ + -DEXAMPLE_MODULE_ENABLE_TESTS=ON \ + -DSIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER=3.20.4 +``` + +2. **Using a specific openDAQ version via CMake** + - Pass the desired version using the `SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER`. + - CMake will perform a checkout of the openDAQ repository at the specified tag and build the minimal set of binaries needed to build the module and run tests. + +```bash +cmake -S . -B build/output \ + -G "Ninja" \ + -DEXAMPLE_MODULE_ENABLE_TESTS=ON \ + -DSIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER=3.20.4 +``` + +--- + +### Example: Build Module + +```bash +cmake --build build/output --config Release +``` + +#### Note: +- The flag `EXAMPLE_MODULE_ENABLE_TESTS=ON` is required if you want to build the module tests for subsequent execution. +- Building the module without `EXAMPLE_MODULE_ENABLE_TESTS=ON` will skip test compilation. +- Providing either `OPENDAQ_ROOT` or `SIMPLE_DEVICE_MODULE_OPENDAQ_SDK_VER` is mandatory for the module to find the required binaries. + +### Running Tests +Once the build is complete: +```bash +ctest --test-dir build/output --output-on-failure -C Release -V ``` -py -m pip install openDAQ -py -m openDAQ -``` \ No newline at end of file From 7fdb8617de1d891d655bb669cc8239f1dcd5cde7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Adziareika <8034372+alexadereyko@users.noreply.github.com> Date: Wed, 17 Sep 2025 12:21:22 +0200 Subject: [PATCH 4/4] Create reusable workflow and composite action for module build and test - Add ci-framework.yml: reusable workflow for testing with openDAQ framework artifacts - Add module-build-test composite action: automated CMake configure, build, and test - Update ci.yml: use new composite action, add fail-fast: false for matrix jobs --- .github/actions/README.md | 55 --------- .github/actions/framework-download/README.md | 45 ------- .github/actions/framework-download/action.yml | 50 -------- .github/actions/framework-install/README.md | 60 ---------- .github/actions/framework-install/action.yml | 42 ------- .../framework-latest-release/README.md | 61 ---------- .../framework-latest-release/action.yml | 111 ------------------ .github/actions/module-build-test/action.yml | 29 +++++ .github/workflows/README.md | 4 - .github/workflows/ci-framework.yml | 82 +++++++++++++ .github/workflows/ci.md | 50 -------- .github/workflows/ci.yml | 85 ++++++-------- .gitignore | 7 +- 13 files changed, 152 insertions(+), 529 deletions(-) delete mode 100644 .github/actions/README.md delete mode 100644 .github/actions/framework-download/README.md delete mode 100644 .github/actions/framework-download/action.yml delete mode 100644 .github/actions/framework-install/README.md delete mode 100644 .github/actions/framework-install/action.yml delete mode 100644 .github/actions/framework-latest-release/README.md delete mode 100644 .github/actions/framework-latest-release/action.yml create mode 100644 .github/actions/module-build-test/action.yml delete mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/ci-framework.yml delete mode 100644 .github/workflows/ci.md diff --git a/.github/actions/README.md b/.github/actions/README.md deleted file mode 100644 index b71210f..0000000 --- a/.github/actions/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# GitHub Reusable Actions for openDAQ Framework - -This directory contains **reusable GitHub Actions** used to work with the **openDAQ framework**. -The actions support determining the latest or specific release, downloading it from S3, and installing it on Linux or Windows runners. - ---- - -## Actions Overview - -| Action | Description | Inputs | Outputs | -|--------|-------------|--------|---------| -| [framework-latest-release](./framework-latest-release/README.md) | Determines which openDAQ framework package to use (latest release or specific version). | `opendaq-framework-release-version`, `win32-force` | `version`, `platform`, `packaging`, `artefact`, `uri`, `scheme`, `authority`, `path` | -| [framework-download](./framework-download/README.md) | Downloads the resolved openDAQ framework package from AWS S3. | `src-opendaq-framework-dev`, `dst-opendaq-framework-dev`, `aws_access_key_id`, `aws_secret_access_key`, `aws_region` | None | -| [framework-install](./framework-install/README.md) | Installs the downloaded openDAQ framework package on the runner. | `opendaq-framework-package-filename`, `opendaq-framework-package-path` | None | - ---- - -## Recommended Usage - -A typical workflow combining all three actions: - -```yaml -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Resolve openDAQ framework version - id: framework - uses: ./.github/actions/framework-latest-release - with: - opendaq-framework-release-version: latest - - - name: Download openDAQ framework - uses: ./.github/actions/framework-download - with: - src-opendaq-framework-dev: ${{ steps.framework.outputs.uri }} - aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws_region: ${{ secrets.AWS_REGION }} - - - name: Install openDAQ framework - uses: ./.github/actions/framework-install - with: - opendaq-framework-package-filename: ${{ steps.framework.outputs.artefact }} -``` - -## Notes - -- Linux and Windows runners are supported. -- framework-latest-release requires GitHub CLI (gh) and jq. -- framework-download requires AWS CLI. -- framework-install installs differently depending on OS. diff --git a/.github/actions/framework-download/README.md b/.github/actions/framework-download/README.md deleted file mode 100644 index e820d1e..0000000 --- a/.github/actions/framework-download/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# framework-download - -This composite action downloads an **openDAQ framework package** from **AWS S3** to the runner. -It supports both Linux/macOS and Windows runners. - ---- - -## Inputs - -| Name | Required | Default | Description | -|-----------------------------|----------|---------------------|-------------| -| `src-opendaq-framework-dev` | yes | — | Full S3 URI to the package (e.g. `s3://bucket/releases/v3.20.4/SDK/opendaq-3.20.4-win64.exe`). | -| `dst-opendaq-framework-dev` | no | `${{ runner.temp }}`| Destination path for the downloaded package on the runner. | -| `aws_access_key_id` | yes | — | AWS Access Key ID used for authentication. | -| `aws_secret_access_key` | yes | — | AWS Secret Access Key used for authentication. | -| `aws_region` | yes | — | AWS Region where the bucket is located. | - ---- - -## Example usage - -```yaml -jobs: - download: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Download openDAQ framework - uses: ./.github/actions/framework-download - with: - src-opendaq-framework-dev: "s3://bb-blueberry-sdk-releases/releases/v3.20.4/SDK/opendaq-3.20.4-ubuntu22.04-x86_64.deb" - dst-opendaq-framework-dev: "/tmp/opendaq-3.20.4-ubuntu22.04-x86_64.deb" - aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws_region: ${{ secrets.AWS_REGION }} -``` - -## Notes -- Uses aws-actions/configure-aws-credentials to set up credentials. -- Downloads via aws s3 cp, which must be available in the runner environment. - - On GitHub-hosted runners, the AWS CLI is pre-installed. -- Supports Linux/macOS (bash) and Windows (pwsh) runners. -- Destination path must be writable by the runner. diff --git a/.github/actions/framework-download/action.yml b/.github/actions/framework-download/action.yml deleted file mode 100644 index 6d34b86..0000000 --- a/.github/actions/framework-download/action.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Download openDAQ framework package -description: "Download a package from S3 for Linux or Windows" - -inputs: - src-opendaq-framework-dev: - required: true - description: "S3 path to the package" - dst-opendaq-framework-dev: - required: false - default: ${{ runner.temp }} - description: "Destination path for downloaded package" - - aws_access_key_id: - required: true - description: "AWS Access Key ID" - aws_secret_access_key: - required: true - description: "AWS Secret Access Key" - aws_region: - required: true - description: "AWS Region" - -runs: - using: composite - steps: - - name: Configure AWS - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ inputs.aws_access_key_id }} - aws-secret-access-key: ${{ inputs.aws_secret_access_key }} - aws-region: ${{ inputs.aws_region }} - - - name: Download package from S3 (Linux/macOS) - if: runner.os != 'Windows' - shell: bash - run: | - set -e - DST="${{ inputs.dst-opendaq-framework-dev }}" - SRC="${{ inputs.src-opendaq-framework-dev }}" - echo "Downloading $SRC to $DST" - aws s3 cp "$SRC" "$DST" - - - name: Download package from S3 (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: | - $dst = "${{ inputs.dst-opendaq-framework-dev }}" - $src = "${{ inputs.src-opendaq-framework-dev }}" - Write-Host "Downloading $src to $dst" - aws s3 cp "$src" "$dst" diff --git a/.github/actions/framework-install/README.md b/.github/actions/framework-install/README.md deleted file mode 100644 index fb3f31c..0000000 --- a/.github/actions/framework-install/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# framework-install - -This composite action installs an **openDAQ framework package** on the runner. -It supports **Windows (installer executable)** and **Linux (Debian package)**. -Other operating systems are not supported. - ---- - -## Inputs - -| Name | Required | Default | Description | -|-----------------------------------|----------|---------------------|-------------| -| `opendaq-framework-package-filename` | yes | — | Name of the package file (e.g. `opendaq-3.20.4-win64.exe`, `opendaq-3.20.4-ubuntu22.04-x86_64.deb`). | -| `opendaq-framework-package-path` | no | `${{ runner.temp }}`| Directory where the package file is located. | - ---- - -## Example usage - -```yaml -jobs: - install: - runs-on: windows-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install openDAQ framework - uses: ./.github/actions/framework-install - with: - opendaq-framework-package-filename: "opendaq-3.20.4-win64.exe" - opendaq-framework-package-path: "C:\\actions\\temp" -``` -```yml -jobs: - install: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install openDAQ framework - uses: ./.github/actions/framework-install - with: - opendaq-framework-package-filename: "opendaq-3.20.4-ubuntu22.04-x86_64.deb" - opendaq-framework-package-path: "/tmp" -``` - -## Notes -- Windows: - - Runs the installer in silent mode (/S). - - After installation, updates the PATH environment variable to include: - ```powershell - PATH=C:\Program Files\openDAQ\bin;$PATH - ``` -- Linux: - - Installs the package via dpkg -i. - - Requires sudo access on the runner. -- Unsupported OS: - - The action exits with an error for macOS or other platforms. diff --git a/.github/actions/framework-install/action.yml b/.github/actions/framework-install/action.yml deleted file mode 100644 index 6e3e6de..0000000 --- a/.github/actions/framework-install/action.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Install openDAQ framework package - -inputs: - opendaq-framework-package-filename: - required: true - - opendaq-framework-package-path: - required: false - default: ${{ runner.temp }} - -runs: - using: composite - - steps: - - name: Install openDAQ framework package (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: | - $packagePath = Join-Path "${{ inputs.opendaq-framework-package-path }}" "${{ inputs.opendaq-framework-package-filename }}" - $process = Start-Process -FilePath $packagePath -ArgumentList "/S" -Wait -NoNewWindow -PassThru - if ($process.ExitCode -eq 0) { - Write-Host "OpenDAQ installed successfully, updating PATH..." - $openDAQBin = "C:\Program Files\openDAQ\bin" - Add-Content -Path $env:GITHUB_ENV -Value "PATH=$openDAQBin`;$env:PATH" - Write-Host $env:PATH - } - else { - Write-Host "OpenDAQ installation failed with exit code $($process.ExitCode)" - exit $process.ExitCode - } - - - name: Install openDAQ framework package (Linux) - if: runner.os == 'Linux' - shell: bash - run: sudo dpkg -i "${{ inputs.opendaq-framework-package-path }}/${{ inputs.opendaq-framework-package-filename }}" - - - name: Unsupported runner OS - if: runner.os != 'Windows' && runner.os != 'Linux' - shell: bash - run: | - echo "Install openDAQ is not supported for ${{ runner.os }}" - exit 1 diff --git a/.github/actions/framework-latest-release/README.md b/.github/actions/framework-latest-release/README.md deleted file mode 100644 index 8791f2d..0000000 --- a/.github/actions/framework-latest-release/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# framework-latest-release - -This composite action determines the **openDAQ framework package** to use. -It supports resolving either the **latest release** from GitHub or a **specific version** provided as input, -and outputs all required information to download and install the package. - ---- - -## Inputs - -| Name | Required | Default | Description | -|-------------------------------------|----------|---------|-------------| -| `opendaq-framework-release-version` | no | `latest`| openDAQ framework version. Use `latest` for the newest release, or provide a specific version (e.g. `3.20.4`). | -| `win32-force` | no | `false` | On Windows runners, forces `win32` instead of `win64` platform. | - ---- - -## Outputs - -| Name | Description | -|------------|-------------| -| `version` | Resolved openDAQ release version (e.g. `3.20.4`). | -| `platform` | Detected platform string (`ubuntu22.04-x86_64`, `ubuntu22.04-arm64`, `win32`, `win64`). | -| `packaging`| Package type (`deb` on Linux, `exe` on Windows). | -| `artefact` | Resolved artefact filename (e.g. `opendaq-3.20.4-win64.exe`). | -| `scheme` | URI scheme (currently `s3`). | -| `authority`| Storage authority (S3 bucket name). | -| `path` | Path inside the bucket (e.g. `releases/v3.20.4/SDK`). | -| `uri` | Full URI to the artefact (e.g. `s3://bucket/releases/v3.20.4/SDK/opendaq-3.20.4-win64.exe`). | - ---- - -## Example usage - -```yaml -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Determine openDAQ framework package - id: framework - uses: ./.github/actions/framework-latest-release - with: - opendaq-framework-release-version: latest - - - name: Print resolved artefact info - run: | - echo "Version: ${{ steps.framework.outputs.version }}" - echo "Platform: ${{ steps.framework.outputs.platform }}" - echo "Artefact: ${{ steps.framework.outputs.artefact }}" - echo "URI: ${{ steps.framework.outputs.uri }}" -``` - -## Notes -- The action relies on GitHub CLI (gh) and jq. -- These are pre-installed on GitHub-hosted Ubuntu and Windows runners. -- On Windows, if you explicitly need a 32-bit package, set win32-force: true. -- If the latest release cannot be determined, the action fails. diff --git a/.github/actions/framework-latest-release/action.yml b/.github/actions/framework-latest-release/action.yml deleted file mode 100644 index c2750b5..0000000 --- a/.github/actions/framework-latest-release/action.yml +++ /dev/null @@ -1,111 +0,0 @@ -name: Determine latest openDAQ framework artefact - -inputs: - - opendaq-framework-release-version: - required: false - default: latest - - win32-force: - required: false - default: false - -outputs: - - version: - description: "Latest openDAQ release version" - value: ${{ steps.determine-latest-package.outputs.version }} - - platform: - description: "Detected platform" - value: ${{ steps.determine-latest-package.outputs.platform }} - - packaging: - description: "Package type (deb/exe)" - value: ${{ steps.determine-latest-package.outputs.packaging }} - - artefact: - description: "Artefact filename" - value: ${{ steps.determine-latest-package.outputs.artefact }} - - uri: - description: "Full URI to artefact" - value: ${{ steps.determine-latest-package.outputs.uri }} - - scheme: - description: "Scheme (s3)" - value: ${{ steps.determine-latest-package.outputs.scheme }} - - authority: - description: "Authority (bucket)" - value: ${{ steps.determine-latest-package.outputs.authority }} - - path: - description: "Path inside bucket" - value: ${{ steps.determine-latest-package.outputs.path }} - -runs: - using: composite - steps: - - name: Determine latest openDAQ package - id: determine-latest-package - shell: bash - run: | - set -e - - input_version="${{ inputs.opendaq-framework-release-version }}" - - if [[ -z "$input_version" || "$input_version" == "latest" ]]; then - version=$(gh api repos/openDAQ/openDAQ/releases/latest --jq '.tag_name') - if [[ -z "$version" || "$version" == "null" ]]; then - echo "::error::Failed to determine latest openDAQ release version" - exit 1 - fi - - version=${version#v} - else - version="$input_version" - fi - - platform="" - packaging="" - - if [[ "$RUNNER_OS" == "Linux" ]]; then - arch=$(uname -m) - if [[ "$arch" == "x86_64" ]]; then - platform="ubuntu22.04-x86_64" - elif [[ "$arch" == "aarch64" ]]; then - platform="ubuntu22.04-arm64" - else - echo "::error::Unsupported Linux arch: $arch" - exit 1 - fi - packaging="deb" - - elif [[ "$RUNNER_OS" == "Windows" ]]; then - WIN32_FORCE="${{ inputs.win32-force }}" - if [[ "$WIN32_FORCE" == "true" ]]; then - platform="win32" - else - platform="win64" - fi - packaging="exe" - - else - echo "::error::Unsupported runner OS $RUNNER_OS" - exit 1 - fi - - artefact="opendaq-${version}-${platform}.${packaging}" - scheme="s3" - authority="bb-blueberry-sdk-releases" - sdk="releases/v${version}/SDK" - - echo "version=$version" >> $GITHUB_OUTPUT - echo "platform=$platform" >> $GITHUB_OUTPUT - echo "packaging=$packaging" >> $GITHUB_OUTPUT - echo "artefact=$artefact" >> $GITHUB_OUTPUT - echo "scheme=$scheme" >> $GITHUB_OUTPUT - echo "authority=$authority" >> $GITHUB_OUTPUT - echo "path=$sdk" >> $GITHUB_OUTPUT - echo "uri=${scheme}://${authority}/${sdk}/${artefact}" >> $GITHUB_OUTPUT diff --git a/.github/actions/module-build-test/action.yml b/.github/actions/module-build-test/action.yml new file mode 100644 index 0000000..f5e0fb4 --- /dev/null +++ b/.github/actions/module-build-test/action.yml @@ -0,0 +1,29 @@ +name: Build and test simple device module +description: Configure, build and test simple device module with CMake + +runs: + using: composite + steps: + - name: Set CMake generator + shell: bash + run: | + if [[ "${{ runner.os }}" == "Windows" ]]; then + echo "CMAKE_GENERATOR=Visual Studio 17 2022" >> $GITHUB_ENV + else + echo "CMAKE_GENERATOR=Ninja" >> $GITHUB_ENV + fi + + - name: Configure simple device module with CMake + shell: bash + run: | + cmake -B build/output -S . -G "$CMAKE_GENERATOR" -DEXAMPLE_MODULE_ENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release + + - name: Build simple device module with CMake + shell: bash + run: | + cmake --build build/output --config Release + + - name: Run simple device module tests with CMake + shell: bash + run: | + ctest --test-dir build/output --output-on-failure -C Release -V diff --git a/.github/workflows/README.md b/.github/workflows/README.md deleted file mode 100644 index 6aed2f8..0000000 --- a/.github/workflows/README.md +++ /dev/null @@ -1,4 +0,0 @@ -## CI/CD Workflows - -- [Build and Test Simple Device Module](ci.md) - Builds and tests against openDAQ framework (latest or specific version). diff --git a/.github/workflows/ci-framework.yml b/.github/workflows/ci-framework.yml new file mode 100644 index 0000000..e63c830 --- /dev/null +++ b/.github/workflows/ci-framework.yml @@ -0,0 +1,82 @@ +name: Build simple device module with openDAQ framework and run tests + +on: + workflow_dispatch: + inputs: + runner: + description: "Runner label" + required: true + type: string + + branch: + description: "Branch to checkout" + required: false + type: string + default: "" + + artifact-run-id: + required: true + type: string + + artifact-name: + required: true + type: string + + file-name: + required: true + type: string + + workflow_call: + inputs: + runner: + description: "Runner label" + required: true + type: string + + branch: + description: "Branch to checkout" + required: false + type: string + default: "" + + artifact-run-id: + required: true + type: string + + artifact-name: + required: true + type: string + + file-name: + required: true + type: string + +env: + GH_TOKEN: ${{ github.token }} + +jobs: + test-artifact: + runs-on: ${{ inputs.runner }} + + steps: + - name: Checkout openDAQ module repository + uses: actions/checkout@v4 + with: + repository: openDAQ/SimpleDeviceModule + ref: ${{ inputs.branch }} + + - name: Download openDAQ framework artifact + id: download + uses: openDAQ/actions/framework-download-artifact@jira/TBBAS-2680-opendaq-gh-actions-github-api-wrapper-unit-tests + with: + run-id: ${{ inputs.artifact-run-id }} + artifact-name: ${{ inputs.artifact-name }} + artifact-filename: ${{ inputs.file-name }} + + - name: Install openDAQ framework artifact + uses: openDAQ/actions/framework-install@jira/TBBAS-2680-opendaq-gh-actions-github-api-wrapper-unit-tests + with: + framework-filename: ${{ steps.download.outputs.artifact }} + + - name: Build and test simple device module + uses: ./.github/actions/module-build-test diff --git a/.github/workflows/ci.md b/.github/workflows/ci.md deleted file mode 100644 index 7ce9266..0000000 --- a/.github/workflows/ci.md +++ /dev/null @@ -1,50 +0,0 @@ -# Build and Test Simple Device Module with openDAQ Framework - -This workflow builds and tests the **Simple Device Module** using the **openDAQ framework**. -It supports using either the **latest release** of openDAQ or a **specific version** provided as input. - -## Triggers - -- **push** to `main` -- **pull_request** targeting `main` or `jira/*` -- **workflow_dispatch** (manual run with parameters) - -## Inputs (workflow_dispatch) - -| Name | Type | Required | Default | Description | -|-----------------------------|--------|----------|---------|-------------| -| `branch` | string | no | `main` | Branch to checkout | -| `opendaq-framework-version` | string | no | `latest`| openDAQ framework version. Use `latest` for the newest release, or provide a specific version tag (e.g. `3.20.4`). | - -## Matrix - -The workflow runs on: - -- `ubuntu-latest` (CMake + Ninja) -- `windows-latest` (CMake + Visual Studio 17 2022) - -## Jobs and Steps - -1. **Checkout Simple Device Module repo** — fetches the specified branch. -2. **Determine openDAQ framework package** - - If `opendaq-framework-version` is `latest`, the workflow queries GitHub Releases for the newest version. - - If a version string is provided, that version is used directly. -3. **Download openDAQ framework** — fetches the package (from S3). -4. **Install openDAQ framework package** — installs the framework. -5. **Configure with CMake** — configures the project with the appropriate generator. -6. **Build with CMake** — builds the project. -7. **Run tests** — executes unit tests with CTest. - -## Examples - -### Automatic runs -- On push to `main` -- On pull request to `main` or `jira/*` - -### Manual run -```yaml -workflow_dispatch: - inputs: - branch: "feature/my-branch" - opendaq-framework-version: "3.20.4" -``` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d0dce16..72bb675 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,74 +2,59 @@ name: Build and Test simple device module with latest openDAQ release on: push: - branches: - - main - + branches: [main] pull_request: - branches: - - main - - jira/* - - workflow_dispatch: - inputs: - - branch: - required: false - default: "main" - - opendaq-framework-version: - required: false - type: string - default: latest env: GH_TOKEN: ${{ github.token }} jobs: - build-and-test: + test-asset: + permissions: + contents: read + actions: read + + env: + GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }} strategy: + fail-fast: false matrix: include: - os: ubuntu-latest - generator: Ninja - + platform-alias: "ubuntu20.04-x86_64" - os: windows-latest - generator: "Visual Studio 17 2022" + platform-alias: "win64" runs-on: ${{ matrix.os }} - + steps: - name: Checkout simple device module repo uses: actions/checkout@v4 - with: - ref: ${{ github.event.inputs.branch || github.event.client_payload.branch || github.ref }} - - name: Determine openDAQ framework package - id: opendaq-framework - uses: ./.github/actions/framework-latest-release + - name: Download openDAQ framework asset + id: download-framework-filename + uses: openDAQ/actions/framework-download-release@jira/TBBAS-2680-opendaq-gh-actions-github-api-wrapper-unit-tests with: - opendaq-framework-release-version: ${{ github.event.inputs.opendaq-framework-version || 'latest' }} - - - name: Download openDAQ framework - uses: ./.github/actions/framework-download + platform: ${{ matrix.platform-alias }} + github-token: ${{ secrets.PAT_TOKEN }} + + - name: Normalize downloaded asset path + id: normalize-framework-filename + shell: bash + run: | + asset=${{ steps.download-framework-filename.outputs.asset }} + # Normalize output-dir path for cross-platform compatibility + if command -v cygpath >/dev/null 2>&1; then + asset="$(cygpath -w "$asset")" + echo "Normalized path (Windows): $asset" + fi + echo "asset=$asset" >> $GITHUB_OUTPUT + + - name: Install openDAQ framework asset + uses: openDAQ/actions/framework-install@jira/TBBAS-2680-opendaq-gh-actions-github-api-wrapper-unit-tests with: - src-opendaq-framework-dev: ${{ steps.opendaq-framework.outputs.uri }} - dst-opendaq-framework-dev: ${{ runner.temp }}/${{ steps.opendaq-framework.outputs.artefact }} - aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws_region: ${{ secrets.AWS_REGION }} - - - name: Install openDAQ framework package - uses: ./.github/actions/framework-install - with: - opendaq-framework-package-filename: ${{ steps.opendaq-framework.outputs.artefact }} - - - name: Configure simple device module with CMake - run: cmake -B build/output -S . -G "${{ matrix.generator }}" -DEXAMPLE_MODULE_ENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release - - - name: Build simple device module with CMake - run: cmake --build build/output --config Release + framework-filename: ${{ steps.normalize-framework-filename.outputs.asset }} - - name: Run simple device module tests with CMake - run: ctest --test-dir build/output --output-on-failure -C Release -V + - name: Build and test simple device module + uses: ./.github/actions/module-build-test diff --git a/.gitignore b/.gitignore index 295355a..72017e9 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,9 @@ bckp # cmake CMakeUserPresets.json -CMakeSettings.json \ No newline at end of file +CMakeSettings.json + +# Secrets +.secrets +# Local configs +.actrc