From 6e7a453ddd1fb6acd03257ff56067514c789f5fe Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Fri, 22 Dec 2023 16:10:12 -0500 Subject: [PATCH 01/17] chore: added a code owner designation file, a pull request template and a conventional commit reference file --- .github/CODEOWNERS | 36 ++++++++++++++++++++ .github/pull_request_template.md | 57 ++++++++++++++++++++++++++++++++ commit_msg_reference.md | 37 +++++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/pull_request_template.md create mode 100644 commit_msg_reference.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..5562c9d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,36 @@ +# ================================================================================================= +# Files or directories with designated code owner. +# +# Note: +# - Each line is a file pattern followed by one or more owners. +# - Branch with branch protection rule "Require review from Code Owners" +# will automaticaly trigger a request to a designated code owner +# ================================================================================================= + +# ....Repository wide code owner................................................................... +# These owners will be the default owners for everything in the repo. +#* @pomerlef + + +# ....High level files............................................................................. +/README.md @pomerlef +/LICENSE @pomerlef + +# ....Core directories and files................................................................... +/examples @boxanm @simonpierredeschenes +/nabo @boxanm @simonpierredeschenes +/python @boxanm @simonpierredeschenes +/tests @boxanm @simonpierredeschenes + +# ....User install tools........................................................................... +/.env.libnabo @RedLeader962 +/libnabo_dependencies_installer.bash @RedLeader962 +/libnabo_installer.bash @RedLeader962 + +# ....DevOps related............................................................................... +/.github/ @RedLeader962 +/build_system/ @RedLeader962 +/.gitmodules @RedLeader962 +/.gitignore @RedLeader962 +/.dockerignore @RedLeader962 + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..4a635b4 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,57 @@ +# Description + +### Summary: + +### Changes and type of changes (quick overview): + +- +- +- + +--- + +# Checklist: + +### Code related + +- [ ] I have made corresponding changes to the documentation + (i.e.: function, class, script header, README.md) +- [ ] I have commented hard-to-understand code +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] All tests pass locally with my changes + (Check [README.md #Contributing](/~https://github.com/norlab-ulaval/libnabo/tree/develop#contributing) + for local testing procedure using _libpointmatcher-build-system_) + +[//]: # ( TODO: write a contributing section in the readme or add a contributing.md) + +### PR creation related + +- [ ] My pull request `base ref` branch is set to the `develop` branch + (the _build-system_ won't be triggered otherwise) +- [ ] My pull request branch is up-to-date with the `develop` branch + (the _build-system_ will reject it otherwise) + +### PR description related + +- [ ] I have included a quick summary of the changes +- [ ] I have indicated the related issue's id with `# ` if changes are of type `fix` +- [ ] I have included a high-level list of changes and their corresponding type + - Types: `feat` `fix` `docs` `style` `refactor` `perf` `test` `build` `ci` `chore` `revert` + - Breaking changes: `!` + - Reference: + see [commit_msg_reference.md](/~https://github.com/norlab-ulaval/libnabo/blob/develop/commit_msg_reference.md) + in the repository root for details + +--- + +## Note for repository admins + +### Release PR related + +- Only repository admins have the privilege to `push/merge` on the default branch (ie: `master`) + and the `develop` branch. +- Keep PR in `draft` mode until all the release reviewers are ready to push the release. +- Once a PR from `release` -> `master` branch is created (not in draft mode), + - it triggers the _build-system_ test + - (in-progress) and it triggers the _semantic release automation_ + diff --git a/commit_msg_reference.md b/commit_msg_reference.md new file mode 100644 index 0000000..6d25410 --- /dev/null +++ b/commit_msg_reference.md @@ -0,0 +1,37 @@ +# _Conventional Commits_ specification quick reference + +See https://www.conventionalcommits.org for details + + +#### Commit types description: + +- `!`: Commit that introduces a breaking API change (correlating with MAJOR in Semantic + Versioning) +- `feat`: A new feature +- `fix`: A bug fix +- `docs`: Documentation only changes +- `style`: Changes that do not affect the meaning of the code (white-space, formatting, missing + semi-colons, etc) +- `refactor`: A code change that neither fixes a bug nor adds a feature +- `perf`: A code change that improves performance +- `test`: Adding missing tests or correcting existing tests +- `build`: Changes that affect the build system or external dependencies (example scopes: gulp, + broccoli, npm) +- `ci`: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, + BrowserStack, SauceLabs) +- `chore`: Other changes that don't modify src or test files +- `revert`: Reverts a previous commit + +#### Commit footer: + +- `BREAKING CHANGE`: Commit that introduces a breaking API change (correlating with MAJOR in Semantic Versioning) + +#### Commit message structure +``` +[()]: + +[optional-body] + +[optional-footer(s)] + +``` From 5b35c992c67e821bcbc1626d648912f5ebaf0b6a Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Tue, 2 Jan 2024 14:05:00 -0500 Subject: [PATCH 02/17] build: Added norlab-build-system submodule to repository [NMO-405] --- .gitmodules | 3 +++ build_system/utilities/norlab-build-system | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 build_system/utilities/norlab-build-system diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e19c3b4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "build_system/utilities/norlab-build-system"] + path = build_system/utilities/norlab-build-system + url = /~https://github.com/norlab-ulaval/norlab-build-system.git diff --git a/build_system/utilities/norlab-build-system b/build_system/utilities/norlab-build-system new file mode 160000 index 0000000..617d447 --- /dev/null +++ b/build_system/utilities/norlab-build-system @@ -0,0 +1 @@ +Subproject commit 617d447151d1438aadfd2ba44d12fabbb95d772b From b161422fa499448b8082e618f4e6ce4ea42cf0c3 Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Tue, 2 Jan 2024 14:12:06 -0500 Subject: [PATCH 03/17] build: Added norlab-shell-script-tools submodule to repository [NMO-405] --- .gitmodules | 3 +++ build_system/utilities/norlab-shell-script-tools | 1 + 2 files changed, 4 insertions(+) create mode 160000 build_system/utilities/norlab-shell-script-tools diff --git a/.gitmodules b/.gitmodules index e19c3b4..56c23ad 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "build_system/utilities/norlab-build-system"] path = build_system/utilities/norlab-build-system url = /~https://github.com/norlab-ulaval/norlab-build-system.git +[submodule "utilities/norlab-shell-script-tools"] + path = build_system/utilities/norlab-shell-script-tools + url = /~https://github.com/norlab-ulaval/norlab-shell-script-tools.git diff --git a/build_system/utilities/norlab-shell-script-tools b/build_system/utilities/norlab-shell-script-tools new file mode 160000 index 0000000..f7da296 --- /dev/null +++ b/build_system/utilities/norlab-shell-script-tools @@ -0,0 +1 @@ +Subproject commit f7da29662b6fa9417cab2b7b9b0c94111ffa4a89 From 2485fc87b5c8b66d70ad0c55efe4fe20d957670f Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Mon, 8 Jan 2024 16:32:38 -0500 Subject: [PATCH 04/17] feat: integrate norlab-build-system library and implement linabo-build-system [NMO-405] - add build system logic for both continuous integration and faster multi-os-version/multi-architecture development workflow - add user install script for both libnabo and its dependencies - add contributing instructions - add JetBrain run configuration for build system - update NBS and N2ST submodule to latest --- .dockerignore | 23 ++ .env.libnabo | 35 +++ .github/pull_request_template.md | 27 +- README.md | 108 ++++++- build_system/.env | 43 +++ build_system/.env.build_matrix.dependencies | 42 +++ build_system/.env.build_matrix.libnabo | 40 +++ .../.env.build_matrix.libnabo.bleeding | 42 +++ ...ler.bash \342\200\272 --help menu.run.xml" | 19 ++ ...rix.bash \342\200\272 --help menu.run.xml" | 19 ++ ...ntu.bash \342\200\272 --help menu.run.xml" | 19 ++ .../[NABO] run all bats tests.run.xml | 19 ++ ...ependencies (BUILD MATRIX SUBSET).run.xml" | 19 ++ ...s-general dependencies (AS IN TC).run.xml" | 19 ++ ...\200\272 build _service_ _popup_.run.xml" | 19 ++ ...ies_arm64v8 ci_PR_arm64v8 _popup_.run.xml" | 19 ++ ...uild test_compilation__ (Release).run.xml" | 19 ++ ...efixed_path (BUILD MATRIX SUBSET).run.xml" | 19 ++ ...wd tree + docker system disk usage.run.xml | 17 ++ .../.jetbrains_run_config/interactive.run.xml | 17 ++ .../list docker images + container.run.xml | 17 ++ ...sh \342\200\272 test flag (popup).run.xml" | 17 ++ ...rminal in a Ubuntu 20.04 container.run.xml | 17 ++ ...ocker_dryrun_and_config_tests.bash.run.xml | 19 ++ ...ute_compose_over_build_matrix.bash.run.xml | 17 ++ ...e_over_build_matrix_with_flag.bash.run.xml | 17 ++ build_system/README.md | 1 + build_system/docker-compose.dependencies.yaml | 39 +++ build_system/docker-compose.libnabo.yaml | 104 +++++++ .../nabo_crawl_dependencies_build_matrix.bash | 39 +++ .../nabo_crawl_libnabo_build_matrix.bash | 40 +++ ...o_crawl_libnabo_build_matrix.bleeding.bash | 39 +++ .../nabo_create_multiarch_docker_builder.bash | 24 ++ .../nabo_install_docker_tools.bash | 25 ++ ...un_all_docker_dryrun_and_config_tests.bash | 15 + .../tests/run_bats_core_test_in_n2st.bash | 46 +++ .../tests_bats/bats_helper_functions.bash | 9 + .../test_dotenv_libpointmatcher.bats | 107 +++++++ ..._nabo_crawl_dependencies_build_matrix.bats | 92 ++++++ .../test_nabo_crawl_libnabo_build_matrix.bats | 96 ++++++ ...o_crawl_libnabo_build_matrix.bleeding.bats | 101 +++++++ .../test_build_system_nabo_installer.bats | 149 ++++++++++ ...docker_tools_and_buildx_create_script.bats | 83 ++++++ .../test_user_nabo_installer.bats | 134 +++++++++ ..._nabo_crawl_dependencies_build_matrix.bash | 14 + ...ryrun_nabo_crawl_libnabo_build_matrix.bash | 10 + ...o_crawl_libnabo_build_matrix.bleeding.bash | 10 + ..._nabo_crawl_dependencies_build_matrix.bash | 9 + ...ation_nabo_crawl_libnabo_build_matrix.bash | 9 + ...o_crawl_libnabo_build_matrix.bleeding.bash | 9 + .../Dockerfile.build_system_test | 90 ++++++ .../build_and_run_IamBuildSystemTester.bash | 61 ++++ .../tests_docker_interactive/entrypoint.bash | 8 + ...est_execute_compose_over_build_matrix.bash | 17 ++ ...e_compose_over_build_matrix_with_flag.bash | 17 ++ build_system/ubuntu/Dockerfile.dependencies | 97 ++++++ .../ubuntu/Dockerfile.dependencies.doxygen | 36 +++ build_system/ubuntu/Dockerfile.libnabo.ci_PR | 56 ++++ .../Dockerfile.libnabo.compilation_test | 107 +++++++ .../ubuntu/Dockerfile.libnabo.hub_release | 63 ++++ build_system/ubuntu/entrypoint.bash | 29 ++ .../ubuntu/nabo_execute_nabo_unittest.bash | 74 +++++ .../nabo_install_dependencies_ubuntu.bash | 126 ++++++++ .../nabo_install_doc_dependencies_ubuntu.bash | 83 ++++++ .../ubuntu/nabo_install_libnabo_ubuntu.bash | 279 ++++++++++++++++++ .../commit_msg_reference.md | 0 contributing/contributing_instructions.md | 134 +++++++++ libnabo_dependencies_installer.bash | 74 +++++ libnabo_installer.bash | 85 ++++++ 69 files changed, 3298 insertions(+), 30 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.libnabo create mode 100644 build_system/.env create mode 100644 build_system/.env.build_matrix.dependencies create mode 100644 build_system/.env.build_matrix.libnabo create mode 100644 build_system/.env.build_matrix.libnabo.bleeding create mode 100644 "build_system/.jetbrains_run_config/(HELP) bash libnabo_installer.bash \342\200\272 --help menu.run.xml" create mode 100644 "build_system/.jetbrains_run_config/(HELP) bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 --help menu.run.xml" create mode 100644 "build_system/.jetbrains_run_config/(HELP) bash nabo_install_libnabo_ubuntu.bash \342\200\272 --help menu.run.xml" create mode 100644 build_system/.jetbrains_run_config/[NABO] run all bats tests.run.xml create mode 100644 "build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build dependencies-general dependencies (BUILD MATRIX SUBSET).run.xml" create mode 100644 "build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build&push dependencies-general dependencies (AS IN TC).run.xml" create mode 100644 "build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build _service_ _popup_.run.xml" create mode 100644 "build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build dependencies_arm64v8 ci_PR_arm64v8 _popup_.run.xml" create mode 100644 "build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" create mode 100644 "build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" create mode 100644 build_system/.jetbrains_run_config/cwd tree + docker system disk usage.run.xml create mode 100644 build_system/.jetbrains_run_config/interactive.run.xml create mode 100644 build_system/.jetbrains_run_config/list docker images + container.run.xml create mode 100644 "build_system/.jetbrains_run_config/lpm_execute_compose_over_build_matrix.bash \342\200\272 test flag (popup).run.xml" create mode 100644 build_system/.jetbrains_run_config/run and open a terminal in a Ubuntu 20.04 container.run.xml create mode 100644 build_system/.jetbrains_run_config/run_all_docker_dryrun_and_config_tests.bash.run.xml create mode 100644 build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix.bash.run.xml create mode 100644 build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix_with_flag.bash.run.xml create mode 100644 build_system/README.md create mode 100644 build_system/docker-compose.dependencies.yaml create mode 100644 build_system/docker-compose.libnabo.yaml create mode 100644 build_system/nabo_crawl_dependencies_build_matrix.bash create mode 100644 build_system/nabo_crawl_libnabo_build_matrix.bash create mode 100644 build_system/nabo_crawl_libnabo_build_matrix.bleeding.bash create mode 100644 build_system/nabo_utility_script/nabo_create_multiarch_docker_builder.bash create mode 100644 build_system/nabo_utility_script/nabo_install_docker_tools.bash create mode 100644 build_system/tests/run_all_docker_dryrun_and_config_tests.bash create mode 100644 build_system/tests/run_bats_core_test_in_n2st.bash create mode 100644 build_system/tests/tests_bats/bats_helper_functions.bash create mode 100644 build_system/tests/tests_bats/test_dotenv_libpointmatcher.bats create mode 100644 build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_dependencies_build_matrix.bats create mode 100644 build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bats create mode 100644 build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bleeding.bats create mode 100644 build_system/tests/tests_bats/tests_installer/test_build_system_nabo_installer.bats create mode 100644 build_system/tests/tests_bats/tests_installer/test_nabo_install_docker_tools_and_buildx_create_script.bats create mode 100644 build_system/tests/tests_bats/tests_installer/test_user_nabo_installer.bats create mode 100644 build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_dependencies_build_matrix.bash create mode 100644 build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bash create mode 100644 build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bleeding.bash create mode 100644 build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_dependencies_build_matrix.bash create mode 100644 build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bash create mode 100644 build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bleeding.bash create mode 100644 build_system/tests/tests_docker_interactive/Dockerfile.build_system_test create mode 100644 build_system/tests/tests_docker_interactive/build_and_run_IamBuildSystemTester.bash create mode 100644 build_system/tests/tests_docker_interactive/entrypoint.bash create mode 100644 build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix.bash create mode 100644 build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix_with_flag.bash create mode 100644 build_system/ubuntu/Dockerfile.dependencies create mode 100644 build_system/ubuntu/Dockerfile.dependencies.doxygen create mode 100644 build_system/ubuntu/Dockerfile.libnabo.ci_PR create mode 100644 build_system/ubuntu/Dockerfile.libnabo.compilation_test create mode 100644 build_system/ubuntu/Dockerfile.libnabo.hub_release create mode 100644 build_system/ubuntu/entrypoint.bash create mode 100644 build_system/ubuntu/nabo_execute_nabo_unittest.bash create mode 100644 build_system/ubuntu/nabo_install_dependencies_ubuntu.bash create mode 100644 build_system/ubuntu/nabo_install_doc_dependencies_ubuntu.bash create mode 100644 build_system/ubuntu/nabo_install_libnabo_ubuntu.bash rename commit_msg_reference.md => contributing/commit_msg_reference.md (100%) create mode 100644 contributing/contributing_instructions.md create mode 100644 libnabo_dependencies_installer.bash create mode 100644 libnabo_installer.bash diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6cf6bc7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,23 @@ + +# Note: +# - libnabo cmake install require that the README.md file exist in the docker image +# - libnaboer-CI doc related step require that .svg, .png and .md be copied in the docker image + +# Graphic/image related +*.svg +*.svgz +*.png +*.drawio + +# Text related +*.pdf + +# Files + + +# Directories +drawio/* +visual/* + +# IDE +.run/* diff --git a/.env.libnabo b/.env.libnabo new file mode 100644 index 0000000..7909792 --- /dev/null +++ b/.env.libnabo @@ -0,0 +1,35 @@ +# ================================================================================================= +# +# Set project related environment variables. Those are available for convenience +# and are also required by 'norlab-shell-script-tools' library. +# +# Usage: +# +# Important! Source this file from 'libnabo' repository root +# $ cd +# $ set -o allexport && source .env.libnabo && set +o allexport +# +# ================================================================================================= + +PROJECT_PROMPT_NAME='NABO' + +# ....Programaticaly fetch source code information................................................. +PROJECT_GIT_REMOTE_URL="/~https://github.com/norlab-ulaval/libnabo" +PROJECT_GIT_NAME=$( basename "${PROJECT_GIT_REMOTE_URL}" .git ) +PROJECT_PATH=$( git rev-parse --show-toplevel ) +PROJECT_SRC_NAME="$( basename ${PROJECT_PATH} )" + +# ....Set NABO related environment variable with their own prefix.................................. +# Note: Those with "PROJECT_" prefix will get eventualy overiden in the case where N2ST is used +# as a library. Using generic testing logic require that environment variables with +# "PROJECT_" prefix be available. +NABO_PROMPT_NAME="${PROJECT_PROMPT_NAME}" +NABO_GIT_REMOTE_URL="${PROJECT_GIT_REMOTE_URL}" +NABO_GIT_NAME="${PROJECT_GIT_NAME}" +NABO_PATH="${PROJECT_PATH}" +NABO_SRC_NAME="${PROJECT_SRC_NAME}" + +# ....Set dependencies path........................................................................ +NABO_BUILD_SYSTEM_PATH="${PROJECT_PATH}/build_system" +N2ST_PATH="${PROJECT_PATH}/build_system/utilities/norlab-shell-script-tools" +NBS_PATH="${PROJECT_PATH}/build_system/utilities/norlab-build-system" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 4a635b4..f352a90 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -19,10 +19,10 @@ - [ ] I have commented hard-to-understand code - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] All tests pass locally with my changes - (Check [README.md #Contributing](/~https://github.com/norlab-ulaval/libnabo/tree/develop#contributing) - for local testing procedure using _libpointmatcher-build-system_) + (Check [contributing/contributing_instructions.md](/~https://github.com/norlab-ulaval/libnabo/tree/develop/contributing/contributing_instructions.md) + for local testing procedure using _libnabo-build-system_) -[//]: # ( TODO: write a contributing section in the readme or add a contributing.md) +[//]: # ( TODO: NMO-466 docs: write contributiong section in readme or add contributing.md) ### PR creation related @@ -35,23 +35,8 @@ - [ ] I have included a quick summary of the changes - [ ] I have indicated the related issue's id with `# ` if changes are of type `fix` -- [ ] I have included a high-level list of changes and their corresponding type - - Types: `feat` `fix` `docs` `style` `refactor` `perf` `test` `build` `ci` `chore` `revert` - - Breaking changes: `!` - - Reference: - see [commit_msg_reference.md](/~https://github.com/norlab-ulaval/libnabo/blob/develop/commit_msg_reference.md) - in the repository root for details +- [ ] I have included a high-level list of changes and their corresponding types + (See [contributing/commit_msg_reference.md](/~https://github.com/norlab-ulaval/libnabo/blob/develop/contributing/commit_msg_reference.md) + for details) --- - -## Note for repository admins - -### Release PR related - -- Only repository admins have the privilege to `push/merge` on the default branch (ie: `master`) - and the `develop` branch. -- Keep PR in `draft` mode until all the release reviewers are ready to push the release. -- Once a PR from `release` -> `master` branch is created (not in draft mode), - - it triggers the _build-system_ test - - (in-progress) and it triggers the _semantic release automation_ - diff --git a/README.md b/README.md index 2cf9e00..d9c00c6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,26 @@ -libnabo is a fast K Nearest Neighbour library for low-dimensional spaces. -It provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates. -Its current CPU implementation is strongly inspired by [ANN], but with more compact data types. +
+ +[//]: # (====GitHub badges========================================================================) + +GitHub Repo stars +GitHub forks +GitHub License +GitHub release (with filter) + +
+
+ + +[//]: # ( ==== Description =========================================== ) +**libnabo is a fast K Nearest Neighbour library for low-dimensional spaces.
+It provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates.** +
+Its current CPU implementation is strongly inspired by [ANN], but with more compact data types.
On the average, libnabo is 5% to 20% faster than [ANN]. +
+
+ +
libnabo depends on [Eigen], a modern C++ matrix and linear-algebra library. libnabo works with either version 2 or 3 of Eigen. @@ -11,6 +30,53 @@ libnabo was developed by [Stéphane Magnenat](http://stephane.magnenat.net) as p If you are interested in a pure-[Rust](https://www.rust-lang.org/) version, check [that repository](/~https://github.com/enlightware/nabo-rs) out. +--- + +[//]: # (====Supported OS and aarch===============================================================) + +### Supported OS And Architecture +libnabo is tested on our build system under the following architecture and OS: + +- x86 and arm64/v8 +- Ubuntu bionic (18.04) focal (20.04) and jammy (22.04) + +Note: + +- libnabo reportedly works on MacOs OsX (latest) and Windows (latest) + +--- + +[//]: # (====Release note=========================================================================) + +### ★ Version `1.1.0` Release Note + +This release of _libnabo_ introduces the integration +of [norlab-build-system (NBS)](/~https://github.com/norlab-ulaval/norlab-build-system) as a _git +submodule_ for codebase development and testing. + +Execute the following to clone the repository with its submodule: + +```shell +git clone --recurse-submodules /~https://github.com/norlab-ulaval/libnabo.git +``` + +If _libnabo_ was previously cloned, execute the following to fetch its new submodule + +```shell +git submodule update --remote --recursive --init +``` + +### ★ Contributing Instructions + +See [contributing_instructions.md](contributing/contributing_instructions.md) +for instructions related to bug reporting, code contribution and for setting up +the `libnabo-build-system` +on your workstation to speed up your local development workflow. + + +--- + + Download ======== @@ -19,9 +85,30 @@ They provide a package with the shared library, another with the development hea The source code is available from github, you can clone the git tree by doing: - git clone git://github.com/ethz-asl/libnabo.git +```shell +git clone --recurse-submodules /~https://github.com/norlab-ulaval/libnabo.git +``` +Docker images +======== +Run the following commands to pull and run libnabo in a docker container +```shell +docker pull norlabulaval/libnabo:latest-ubuntu-focal + +docker run -it --rm norlabulaval/libnabo:latest-ubuntu-focal +``` +See available [libnabo image tags](https://hub.docker.com/repository/docker/norlabulaval/libnabo/) on dockerhub. + +To install docker related dependencies on ubuntu, execute the following + +```shell +cd ./build_system/nabo_utility_script + +# Execute docker tools install script i.e. docker daemon, docker compose, docker buildx +bash nabo_install_docker_tools.bash +``` + Compilation =========== @@ -29,6 +116,14 @@ libnabo uses [CMake] as build system. The complete compilation process depends on the system you are using (Linux, Mac OS X or Windows). You will find a nice introductory tutorial in [this video](http://www.youtube.com/watch?v=CLvZTyji_Uw). +For conveniences, you can use the provided installer script for ubuntu +```shell +bash libnabo_dependencies_installer.bash + +# Use the --help flag to see the list of optional flag +bash libnabo_installer.bash [] +``` + Prerequisites ------------- @@ -147,11 +242,6 @@ If you use libnabo in the academic context, please cite this paper that evaluate } -Bug reporting -============= - -Please use [github's issue tracker](http://github.com/ethz-asl/libnabo/issues) to report bugs. - License ======= diff --git a/build_system/.env b/build_system/.env new file mode 100644 index 0000000..647adc9 --- /dev/null +++ b/build_system/.env @@ -0,0 +1,43 @@ + +# +# Dockerhub or self hosted hub domain name +# +NBS_DOCKERHUB_NAMESPACE=norlabulaval + +# +# Repository url +# +# Note: +# - Main repo: /~https://github.com/norlab-ulaval/libnabo +# - Legacy repo: /~https://github.com/ethz-asl/libnabo + +NBS_REPOSITORY_DOMAIN=norlab-ulaval + +NBS_REPOSITORY_NAME=libnabo + +# +# Install script variables +# +NBS_LIB_INSTALL_PATH=/opt/percep3d_libraries + +# +# Path to the NBS build system directory (.env.build_matrix should be there) +# +NBS_SUPERPROJECT_BUILD_SYSTEM_DIR=./build_system + +# +# NorLab-build-system & NorLab-sheel-script-tools +# +PROJECT_PROMPT_NAME=NABO +NBS_SPLASH_NAME="Libnabo" +NBS_SPLASH_NAME_BUILD_SYSTEM="Libnabo Build System" + +# +# Docker built-in environment variable (do not change the variable name +# +COMPOSE_PROJECT_NAME=libnabo + +## Unmute BUILDKIT_PROGRESS to set globaly for debugging dockerfile +## For debuging docker build localy, use `docker build --progress=plain --no-cache` flags instead +#BUILDKIT_PROGRESS=plain + diff --git a/build_system/.env.build_matrix.dependencies b/build_system/.env.build_matrix.dependencies new file mode 100644 index 0000000..90f4fd4 --- /dev/null +++ b/build_system/.env.build_matrix.dependencies @@ -0,0 +1,42 @@ +# +# Build matrix variables +# + +# +# The compose file on which the build matrix will be crawled +# +NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.dependencies.yaml + +# +# Libnabo version +# +# 'latest' is the latest push to the libnabo master branch +#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' 'v2.0.test' ) +NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) + +# +# Libnabo dependencies CMAKE_BUILD_TYPE +# +# Part of the build matrix used for PR +NBS_MATRIX_CMAKE_BUILD_TYPE=( 'None' ) + +# +# Libnabo dependencies supported OS +# +# ToDo: implement OsX support for arm64-Darwin (ref task NMO-213) +#NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' 'osx' ) +NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' ) + +# +# ubuntu supported versions +# +# Ubuntu release: https://ubuntu.com/about/release-cycle +# bionic=18.04 focal=20.04 jammy=22.04 +# Part of the build matrix used for PR +#NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' ) +NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' 'jammy' ) +# +# iceboxed: implement other OS support (ref task NMO-213 OsX arm64-Darwin and NMO-210 OsX x86 CD components) +#NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( 'monterey' 'ventura' ) +NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( ) + diff --git a/build_system/.env.build_matrix.libnabo b/build_system/.env.build_matrix.libnabo new file mode 100644 index 0000000..9d3366b --- /dev/null +++ b/build_system/.env.build_matrix.libnabo @@ -0,0 +1,40 @@ +# +# Build matrix variables +# + +# +# The compose file on which the build matrix will be crawled +# +NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.libnabo.yaml + +# +# Libnabo version +# +# 'latest' is the latest push to the libnabo master branch +#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' ) +NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) + +# +# Libnabo CMAKE_BUILD_TYPE +# +NBS_MATRIX_CMAKE_BUILD_TYPE=( 'Release' 'RelWithDebInfo' 'MinSizeRel' ) +# Note: 'None' for building dependencies images + +# +# Libnabo supported OS +# +# ToDo: implement OsX support for arm64-Darwin (ref task NMO-213) +#NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' 'l4t' 'osx' ) +NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' ) + +# +# ubuntu supported versions +# +# Ubuntu release: https://ubuntu.com/about/release-cycle +# bionic=18.04 focal=20.04 jammy=22.04 +NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' 'jammy' ) +# +# iceboxed: implement other OS support (ref task NMO-213 OsX arm64-Darwin and NMO-210 OsX x86 CD components) +#NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( 'monterey' 'ventura' ) +NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( ) + diff --git a/build_system/.env.build_matrix.libnabo.bleeding b/build_system/.env.build_matrix.libnabo.bleeding new file mode 100644 index 0000000..1f24c4e --- /dev/null +++ b/build_system/.env.build_matrix.libnabo.bleeding @@ -0,0 +1,42 @@ +# +# Build matrix variables +# + +# +# The compose file on which the build matrix will be crawled +# +NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.libnabo.yaml + +# +# Libnabo version +# +# 'latest' is the latest push to the libnabo master branch +#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' ) +NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) + +# +# Libnabo CMAKE_BUILD_TYPE +# +NBS_MATRIX_CMAKE_BUILD_TYPE=( 'Debug' 'Release' 'RelWithDebInfo' 'MinSizeRel' ) +# ToDo: fixme!! (ref task NMO-306 ﹅→ Test fail › install script flag `--cmake-build-type Debug --compile-test` and for all distro) +# Note: 'None' for building dependencies images + +# +# Libnabo supported OS +# +# ToDo: implement OsX support for arm64-Darwin (ref task NMO-213) +#NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' 'l4t' 'osx' ) +NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' ) + +# +# ubuntu supported versions +# +# Ubuntu release: https://ubuntu.com/about/release-cycle +# bionic=18.04 focal=20.04 jammy=22.04 +NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' 'jammy' ) +# ToDo: fixme!! (ref task NMO-305 ﹅→ Build fail: ubuntu jammy with utest compilation). +# +# iceboxed: implement other OS support (ref task NMO-213 OsX arm64-Darwin and NMO-210 OsX x86 CD components) +#NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( 'monterey' 'ventura' ) +NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( ) + diff --git "a/build_system/.jetbrains_run_config/(HELP) bash libnabo_installer.bash \342\200\272 --help menu.run.xml" "b/build_system/.jetbrains_run_config/(HELP) bash libnabo_installer.bash \342\200\272 --help menu.run.xml" new file mode 100644 index 0000000..f41385e --- /dev/null +++ "b/build_system/.jetbrains_run_config/(HELP) bash libnabo_installer.bash \342\200\272 --help menu.run.xml" @@ -0,0 +1,19 @@ + + + + diff --git "a/build_system/.jetbrains_run_config/(HELP) bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 --help menu.run.xml" "b/build_system/.jetbrains_run_config/(HELP) bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 --help menu.run.xml" new file mode 100644 index 0000000..281da6b --- /dev/null +++ "b/build_system/.jetbrains_run_config/(HELP) bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 --help menu.run.xml" @@ -0,0 +1,19 @@ + + + + diff --git "a/build_system/.jetbrains_run_config/(HELP) bash nabo_install_libnabo_ubuntu.bash \342\200\272 --help menu.run.xml" "b/build_system/.jetbrains_run_config/(HELP) bash nabo_install_libnabo_ubuntu.bash \342\200\272 --help menu.run.xml" new file mode 100644 index 0000000..f03d30c --- /dev/null +++ "b/build_system/.jetbrains_run_config/(HELP) bash nabo_install_libnabo_ubuntu.bash \342\200\272 --help menu.run.xml" @@ -0,0 +1,19 @@ + + + + diff --git a/build_system/.jetbrains_run_config/[NABO] run all bats tests.run.xml b/build_system/.jetbrains_run_config/[NABO] run all bats tests.run.xml new file mode 100644 index 0000000..2fbe4d4 --- /dev/null +++ b/build_system/.jetbrains_run_config/[NABO] run all bats tests.run.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build dependencies-general dependencies (BUILD MATRIX SUBSET).run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build dependencies-general dependencies (BUILD MATRIX SUBSET).run.xml" new file mode 100644 index 0000000..c9ccf41 --- /dev/null +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build dependencies-general dependencies (BUILD MATRIX SUBSET).run.xml" @@ -0,0 +1,19 @@ + + + + diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build&push dependencies-general dependencies (AS IN TC).run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build&push dependencies-general dependencies (AS IN TC).run.xml" new file mode 100644 index 0000000..804f77e --- /dev/null +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_dependencies_build_matrix.bash \342\200\272 build&push dependencies-general dependencies (AS IN TC).run.xml" @@ -0,0 +1,19 @@ + + + + diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build _service_ _popup_.run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build _service_ _popup_.run.xml" new file mode 100644 index 0000000..5bd99fe --- /dev/null +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build _service_ _popup_.run.xml" @@ -0,0 +1,19 @@ + + + + diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build dependencies_arm64v8 ci_PR_arm64v8 _popup_.run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build dependencies_arm64v8 ci_PR_arm64v8 _popup_.run.xml" new file mode 100644 index 0000000..e2ab359 --- /dev/null +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build dependencies_arm64v8 ci_PR_arm64v8 _popup_.run.xml" @@ -0,0 +1,19 @@ + + + + diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" new file mode 100644 index 0000000..2ab8e6f --- /dev/null +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" @@ -0,0 +1,19 @@ + + + + diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" new file mode 100644 index 0000000..a0bec81 --- /dev/null +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" @@ -0,0 +1,19 @@ + + + + diff --git a/build_system/.jetbrains_run_config/cwd tree + docker system disk usage.run.xml b/build_system/.jetbrains_run_config/cwd tree + docker system disk usage.run.xml new file mode 100644 index 0000000..072d348 --- /dev/null +++ b/build_system/.jetbrains_run_config/cwd tree + docker system disk usage.run.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/build_system/.jetbrains_run_config/interactive.run.xml b/build_system/.jetbrains_run_config/interactive.run.xml new file mode 100644 index 0000000..da68954 --- /dev/null +++ b/build_system/.jetbrains_run_config/interactive.run.xml @@ -0,0 +1,17 @@ + + + + diff --git a/build_system/.jetbrains_run_config/list docker images + container.run.xml b/build_system/.jetbrains_run_config/list docker images + container.run.xml new file mode 100644 index 0000000..255d5db --- /dev/null +++ b/build_system/.jetbrains_run_config/list docker images + container.run.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git "a/build_system/.jetbrains_run_config/lpm_execute_compose_over_build_matrix.bash \342\200\272 test flag (popup).run.xml" "b/build_system/.jetbrains_run_config/lpm_execute_compose_over_build_matrix.bash \342\200\272 test flag (popup).run.xml" new file mode 100644 index 0000000..c1a8c5c --- /dev/null +++ "b/build_system/.jetbrains_run_config/lpm_execute_compose_over_build_matrix.bash \342\200\272 test flag (popup).run.xml" @@ -0,0 +1,17 @@ + + + + diff --git a/build_system/.jetbrains_run_config/run and open a terminal in a Ubuntu 20.04 container.run.xml b/build_system/.jetbrains_run_config/run and open a terminal in a Ubuntu 20.04 container.run.xml new file mode 100644 index 0000000..b646b2f --- /dev/null +++ b/build_system/.jetbrains_run_config/run and open a terminal in a Ubuntu 20.04 container.run.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/build_system/.jetbrains_run_config/run_all_docker_dryrun_and_config_tests.bash.run.xml b/build_system/.jetbrains_run_config/run_all_docker_dryrun_and_config_tests.bash.run.xml new file mode 100644 index 0000000..b7b466b --- /dev/null +++ b/build_system/.jetbrains_run_config/run_all_docker_dryrun_and_config_tests.bash.run.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix.bash.run.xml b/build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix.bash.run.xml new file mode 100644 index 0000000..32ae760 --- /dev/null +++ b/build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix.bash.run.xml @@ -0,0 +1,17 @@ + + + + diff --git a/build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix_with_flag.bash.run.xml b/build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix_with_flag.bash.run.xml new file mode 100644 index 0000000..362bb8f --- /dev/null +++ b/build_system/.jetbrains_run_config/test_execute_compose_over_build_matrix_with_flag.bash.run.xml @@ -0,0 +1,17 @@ + + + + diff --git a/build_system/README.md b/build_system/README.md new file mode 100644 index 0000000..64af5cb --- /dev/null +++ b/build_system/README.md @@ -0,0 +1 @@ +See [contributing/contributing_instructions.md](/~https://github.com/norlab-ulaval/libnabo/tree/develop/contributing/contributing_instructions.md) for instructions related to bug reporting, code contribution and for setting up the `libnabo-build-system` on your workstation to speed up your local development workflow. diff --git a/build_system/docker-compose.dependencies.yaml b/build_system/docker-compose.dependencies.yaml new file mode 100644 index 0000000..7b3348a --- /dev/null +++ b/build_system/docker-compose.dependencies.yaml @@ -0,0 +1,39 @@ +services: + + # ====Dependency related services================================================================ + dependencies: + image: ${NBS_DOCKERHUB_NAMESPACE:?err}/libnabo-dependencies:${NBS_IMAGE_TAG:?err} + build: + context: .. + dockerfile: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR:?err}/ubuntu/Dockerfile.dependencies + platforms: + - "linux/amd64" + - "linux/arm64/v8" + args: + BASE_IMAGE: ${DEPENDENCIES_BASE_IMAGE:?err} + BASE_IMAGE_TAG: ${DEPENDENCIES_BASE_IMAGE_TAG:?err} + NBS_SUPERPROJECT_BUILD_SYSTEM_DIR: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR:?err} + IS_TEAMCITY_RUN: ${IS_TEAMCITY_RUN} + NBS_LIB_INSTALL_PATH: ${NBS_LIB_INSTALL_PATH:?err} + NBS_REPOSITORY_NAME: ${NBS_REPOSITORY_NAME:?err} + tty: true + stdin_open: true + init: true # Propagate exit code (See remark in task NMO-266) + + dependencies-doc: + image: ${NBS_DOCKERHUB_NAMESPACE:?err}/libnabo-dependencies-doc:${NBS_IMAGE_TAG:?err} + build: + context: .. + dockerfile: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR:?err}/ubuntu/Dockerfile.dependencies.doxygen + platforms: + - "linux/amd64" + - "linux/arm64/v8" + args: + PROJECT_HUB: ${NBS_DOCKERHUB_NAMESPACE} + BASE_IMAGE: libnabo-dependencies + BASE_IMAGE_TAG: ${NBS_IMAGE_TAG} + IS_TEAMCITY_RUN: ${IS_TEAMCITY_RUN} + depends_on: + - dependencies + tty: true + stdin_open: true diff --git a/build_system/docker-compose.libnabo.yaml b/build_system/docker-compose.libnabo.yaml new file mode 100644 index 0000000..463a075 --- /dev/null +++ b/build_system/docker-compose.libnabo.yaml @@ -0,0 +1,104 @@ +include: + - docker-compose.dependencies.yaml + +services: + + # ====Pull-request related services============================================================== + # ....Test logic related to libnabo install casses............................................... + _test_compilation: + image: ${NBS_DOCKERHUB_NAMESPACE:?err}/libnabo-compilation-test:${NBS_IMAGE_TAG:?err} + pull_policy: build + build: + context: .. + dockerfile: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR:?err}/ubuntu/Dockerfile.libnabo.compilation_test + no_cache: true + target: test-compilation-auto-path-resolution + ## Mute 'platforms' while using arch virtualization with C++ build to prevent segmentation fault during nabo cmake install +# platforms: +# - "linux/amd64" +# - "linux/arm64/v8" + args: + PROJECT_HUB: ${NBS_DOCKERHUB_NAMESPACE} + BASE_IMAGE: libnabo-dependencies + BASE_IMAGE_TAG: ${NBS_IMAGE_TAG} + IS_TEAMCITY_RUN: ${IS_TEAMCITY_RUN} + REPOSITORY_VERSION: 'latest' + CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE:?err} + INSTALL_SCRIPT_FLAG: '--build-system-CI-install' + tty: true + stdin_open: true + init: true # Propagate exit code (See remark in task NMO-266) + depends_on: + - dependencies + test_compilation_prefixed_path: + extends: _test_compilation + build: + target: test-compilation-prefixed-path + depends_on: + - _test_compilation + test_compilation_auto_path_resolution: + extends: _test_compilation + build: + target: test-compilation-auto-path-resolution + depends_on: + - _test_compilation + + # ....Test logic related to libnabo codebase unit-test........................................... + ci_PR: + image: ${NBS_DOCKERHUB_NAMESPACE:?err}/libnabo-ci-pr:${NBS_IMAGE_TAG:?err} + pull_policy: build + build: + context: .. + dockerfile: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR}/ubuntu/Dockerfile.libnabo.ci_PR + no_cache: true + args: + PROJECT_HUB: ${NBS_DOCKERHUB_NAMESPACE} + BASE_IMAGE: libnabo-dependencies + BASE_IMAGE_TAG: ${NBS_IMAGE_TAG} + IS_TEAMCITY_RUN: ${IS_TEAMCITY_RUN} + REPOSITORY_VERSION: 'latest' + CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE:?err} + INSTALL_SCRIPT_FLAG: '--build-system-CI-install --compile-test' + tty: true + stdin_open: true + init: true # Propagate exit code (See remark in task NMO-266) + depends_on: + - dependencies + ci_PR_amd64: + extends: ci_PR + build: + platforms: + - "linux/amd64" + ci_PR_arm64v8: + extends: ci_PR + build: + platforms: + - "linux/arm64/v8" + + # ====Dockerhub release image==================================================================== + release: + image: ${NBS_DOCKERHUB_NAMESPACE:?err}/libnabo:${NBS_IMAGE_TAG:?err} + container_name: libnabo + build: + context: .. + dockerfile: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR}/ubuntu/Dockerfile.libnabo.hub_release + platforms: + - "linux/amd64" + - "linux/arm64/v8" + no_cache: true + args: + PROJECT_HUB: ${NBS_DOCKERHUB_NAMESPACE} + BASE_IMAGE: libnabo-dependencies-doc + BASE_IMAGE_TAG: ${NBS_IMAGE_TAG} + IS_TEAMCITY_RUN: ${IS_TEAMCITY_RUN} + REPOSITORY_VERSION: ${REPOSITORY_VERSION:?err} + CMAKE_BUILD_TYPE: 'Release' + INSTALL_SCRIPT_FLAG: '--compile-test --generate-doc' + tty: true + stdin_open: true + init: true # Propagate exit code (See remark in task NMO-266) + depends_on: + - dependencies + - dependencies-doc + + diff --git a/build_system/nabo_crawl_dependencies_build_matrix.bash b/build_system/nabo_crawl_dependencies_build_matrix.bash new file mode 100644 index 0000000..1449603 --- /dev/null +++ b/build_system/nabo_crawl_dependencies_build_matrix.bash @@ -0,0 +1,39 @@ +#!/bin/bash +# ================================================================================================= +# +# Execute build matrix specified in '.env.build_matrix.dependencies' +# +# Redirect the execution to 'nbs_execute_compose_over_build_matrix.bash' from the norlab-build-system library +# +# Usage: +# $ bash nabo_crawl_dependencies_build_matrix.bash [] [-- ] +# +# $ bash nabo_crawl_dependencies_build_matrix.bash -- build --dry-run +# +# Run script with the '--help' flag for details +# +# ================================================================================================= +PARAMS="$@" + +# ....path resolution logic........................................................................ +NABO_ROOT="$(dirname "$(realpath "$0")")/.." +NABO_BUILD_SYSTEM_PATH="${NABO_ROOT}/build_system" +NBS_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-build-system" +N2ST_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-shell-script-tools" + +# ....Load environment variables from file......................................................... +cd "${NABO_BUILD_SYSTEM_PATH}" || exit 1 +set -o allexport && source .env && set +o allexport + +# ....Source NBS dependencies...................................................................... +cd "${NBS_PATH}" || exit 1 +source import_norlab_build_system_lib.bash + +# ====begin======================================================================================== +cd "${NBS_PATH}/src/utility_scripts" || exit 1 + +DOTENV_BUILD_MATRIX_REALPATH=${NABO_BUILD_SYSTEM_PATH}/.env.build_matrix.dependencies + +# Note: do not double quote PARAMS or threat it as a array otherwise it will cause error +# shellcheck disable=SC2086 +source nbs_execute_compose_over_build_matrix.bash "${DOTENV_BUILD_MATRIX_REALPATH}" $PARAMS diff --git a/build_system/nabo_crawl_libnabo_build_matrix.bash b/build_system/nabo_crawl_libnabo_build_matrix.bash new file mode 100644 index 0000000..fd716a5 --- /dev/null +++ b/build_system/nabo_crawl_libnabo_build_matrix.bash @@ -0,0 +1,40 @@ +#!/bin/bash +# ================================================================================================= +# +# Execute build matrix specified in .env.build_matrix.libnabo +# +# Redirect the execution to 'nbs_execute_compose_over_build_matrix.bash' from the norlab-build-system library +# +# Usage: +# $ bash nabo_crawl_libnabo_build_matrix.bash [] [-- ] +# +# $ bash nabo_crawl_libnabo_build_matrix.bash -- build --dry-run +# +# Run script with the '--help' flag for details +# +# ================================================================================================= +PARAMS="$@" + +# ....path resolution logic........................................................................ +NABO_ROOT="$(dirname "$(realpath "$0")")/.." +NABO_BUILD_SYSTEM_PATH="${NABO_ROOT}/build_system" +NBS_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-build-system" +N2ST_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-shell-script-tools" + +# ....Load environment variables from file......................................................... +cd "${NABO_BUILD_SYSTEM_PATH}" || exit 1 +set -o allexport && source .env && set +o allexport + +# ....Source NBS dependencies...................................................................... +cd "${NBS_PATH}" || exit 1 +source import_norlab_build_system_lib.bash + +# ====begin======================================================================================== +cd "${NBS_PATH}/src/utility_scripts" || exit 1 + +DOTENV_BUILD_MATRIX_REALPATH=${NABO_BUILD_SYSTEM_PATH}/.env.build_matrix.libnabo + +# Note: do not double quote PARAMS or threat it as a array otherwise it will cause error +# shellcheck disable=SC2086 +source nbs_execute_compose_over_build_matrix.bash "${DOTENV_BUILD_MATRIX_REALPATH}" $PARAMS + diff --git a/build_system/nabo_crawl_libnabo_build_matrix.bleeding.bash b/build_system/nabo_crawl_libnabo_build_matrix.bleeding.bash new file mode 100644 index 0000000..17bb27c --- /dev/null +++ b/build_system/nabo_crawl_libnabo_build_matrix.bleeding.bash @@ -0,0 +1,39 @@ +#!/bin/bash +# ================================================================================================= +# +# Execute build matrix specified in .env.build_matrix.libnabo.bleeding +# +# Redirect the execution to 'nbs_execute_compose_over_build_matrix.bash' from the norlab-build-system library +# +# Usage: +# $ bash nabo_crawl_libnabo_build_matrix.bleeding.bash [] [-- ] +# +# $ bash nabo_crawl_libnabo_build_matrix.bleeding.bash -- build --dry-run +# +# Run script with the '--help' flag for details +# +# ================================================================================================= +PARAMS="$@" + +# ....path resolution logic........................................................................ +NABO_ROOT="$(dirname "$(realpath "$0")")/.." +NABO_BUILD_SYSTEM_PATH="${NABO_ROOT}/build_system" +NBS_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-build-system" +N2ST_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-shell-script-tools" + +# ....Load environment variables from file......................................................... +cd "${NABO_BUILD_SYSTEM_PATH}" || exit 1 +set -o allexport && source .env && set +o allexport + +# ....Source NBS dependencies...................................................................... +cd "${NBS_PATH}" || exit 1 +source import_norlab_build_system_lib.bash + +# ====begin======================================================================================== +cd "${NBS_PATH}/src/utility_scripts" || exit 1 + +DOTENV_BUILD_MATRIX_REALPATH=${NABO_BUILD_SYSTEM_PATH}/.env.build_matrix.libnabo.bleeding + +# Note: do not double quote PARAMS or threat it as a array otherwise it will cause error +# shellcheck disable=SC2086 +source nbs_execute_compose_over_build_matrix.bash "${DOTENV_BUILD_MATRIX_REALPATH}" $PARAMS diff --git a/build_system/nabo_utility_script/nabo_create_multiarch_docker_builder.bash b/build_system/nabo_utility_script/nabo_create_multiarch_docker_builder.bash new file mode 100644 index 0000000..0252da8 --- /dev/null +++ b/build_system/nabo_utility_script/nabo_create_multiarch_docker_builder.bash @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Utility script to create a multi-architecture docker builder +# +# usage: +# $ bash ./nabo_utility_script/nabo_create_multiarch_docker_builder.bash +# +function nabo::create_multiarch_docker_builder() { + local TMP_CWD + TMP_CWD=$(pwd) + + # ....Project root logic......................................................................... + NABO_PATH=$(git rev-parse --show-toplevel) + + # ====Begin===================================================================================== + cd "${NABO_PATH}"/build_system/utilities/norlab-build-system/install_scripts/ \ + && bash nbs_create_multiarch_docker_builder.bash + + # ====Teardown=================================================================================== + cd "${TMP_CWD}" +} + +# ::::main::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +nabo::create_multiarch_docker_builder diff --git a/build_system/nabo_utility_script/nabo_install_docker_tools.bash b/build_system/nabo_utility_script/nabo_install_docker_tools.bash new file mode 100644 index 0000000..6612b75 --- /dev/null +++ b/build_system/nabo_utility_script/nabo_install_docker_tools.bash @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Utility script to install docker related tools and execute basic configuration +# +# usage: +# $ bash ./nabo_utility_script/nabo_install_docker_tools.bash +# + +function nabo::install_docker_tools() { + local TMP_CWD + TMP_CWD=$(pwd) + + # ....Project root logic......................................................................... + NABO_PATH=$(git rev-parse --show-toplevel) + + # ====Begin===================================================================================== + cd "${NABO_PATH}"/build_system/utilities/norlab-build-system/install_scripts/ \ + && bash nbs_install_docker_tools.bash + + # ====Teardown=================================================================================== + cd "${TMP_CWD}" +} + +# ::::main::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +nabo::install_docker_tools diff --git a/build_system/tests/run_all_docker_dryrun_and_config_tests.bash b/build_system/tests/run_all_docker_dryrun_and_config_tests.bash new file mode 100644 index 0000000..21c4444 --- /dev/null +++ b/build_system/tests/run_all_docker_dryrun_and_config_tests.bash @@ -0,0 +1,15 @@ +#!/bin/bash +# +# Run all tests in directory +# +# Usage: +# $ bash run_all_docker_dryrun_and_config_tests.bash +# +# + +_PATH_TO_SCRIPT="$(realpath "$0")" +SCRIPT_DIR_PATH="$(dirname "${_PATH_TO_SCRIPT}")" +TEST_DIR="$SCRIPT_DIR_PATH/tests_docker_dryrun_and_config" + +source "${SCRIPT_DIR_PATH}/../utilities/norlab-build-system/src/utility_scripts/nbs_run_all_test_and_dryrun_in_directory.bash" "${TEST_DIR}" + diff --git a/build_system/tests/run_bats_core_test_in_n2st.bash b/build_system/tests/run_bats_core_test_in_n2st.bash new file mode 100644 index 0000000..6ab3cde --- /dev/null +++ b/build_system/tests/run_bats_core_test_in_n2st.bash @@ -0,0 +1,46 @@ +#!/bin/bash +# ================================================================================================= +# Execute libnabo repo shell script tests via 'norlab-shell-script-tools' library +# +# Note the script can be executed from anywhere as long as its inside the libnabo repository +# +# Usage: +# $ bash run_bats_core_test_in_n2st.bash ['[/]' ['']] +# +# Arguments: +# - [''] The directory from which to start test, default to 'tests' +# - ['/'] A specific bats file to run, default will +# run all bats file in the test directory +# +# Globals: none +# +# ================================================================================================= +PARAMS="$@" + +if [[ -z $PARAMS ]]; then + # Set to default bats tests directory if none specified + PARAMS="build_system/tests/tests_bats/" +fi + +N2ST_PATH="build_system/utilities/norlab-shell-script-tools" + +function n2st::run_n2st_testsing_tools(){ + local TMP_CWD + TMP_CWD=$(pwd) + + # ....Project root logic......................................................................... + NABO_PATH=$(git rev-parse --show-toplevel) + N2ST_PATH=${N2ST_PATH:-"./utilities/norlab-shell-script-tools"} + + # ....Execute N2ST run_bats_tests_in_docker.bash................................................. + cd "$NABO_PATH" + + # shellcheck disable=SC2086 + bash "${N2ST_PATH}/tests/bats_testing_tools/run_bats_tests_in_docker.bash" $PARAMS + + # ....Teardown................................................................................... + cd "$TMP_CWD" + } + +n2st::run_n2st_testsing_tools + diff --git a/build_system/tests/tests_bats/bats_helper_functions.bash b/build_system/tests/tests_bats/bats_helper_functions.bash new file mode 100644 index 0000000..efbbea4 --- /dev/null +++ b/build_system/tests/tests_bats/bats_helper_functions.bash @@ -0,0 +1,9 @@ +#!/bin/bash + +function test_generic_help_flag_logic() { + assert_success + + assert_output --regexp .*"Starting".*"${TESTED_FILE}".*"\$".*"${TESTED_FILE} \[--help\] <.env.build_matrix.*> \[\] \[-- \]".*"Mandatory argument:".*"<.env.build_matrix.*>".*"Optional arguments:".*"-h, --help".*"--docker-debug-logs".*"--fail-fast" + + refute_output --regexp .*"Starting".*"${TESTED_FILE}".*"\[NBS\]".*"Build images specified in".*"'${COMPOSE_FILE}'".*"following".*"${DOTENV_BUILD_MATRIX_NAME}" +} diff --git a/build_system/tests/tests_bats/test_dotenv_libpointmatcher.bats b/build_system/tests/tests_bats/test_dotenv_libpointmatcher.bats new file mode 100644 index 0000000..b99d723 --- /dev/null +++ b/build_system/tests/tests_bats/test_dotenv_libpointmatcher.bats @@ -0,0 +1,107 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== + +DOTENV_FILE=".env.libnabo" +TESTED_FILE_PATH="." + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + ## Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# printenv >&3 +} + +# executed before each test +setup() { + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== +@test "${DOTENV_FILE} › Env variables set ok" { + # ....Pre-condition.............................................................................. + assert_empty "${PROJECT_PROMPT_NAME}" + assert_empty "${PROJECT_GIT_REMOTE_URL}" + assert_empty "${PROJECT_GIT_NAME}" + assert_empty "${PROJECT_SRC_NAME}" + assert_empty "${PROJECT_PATH}" + + assert_empty "${NABO_PROMPT_NAME}" + assert_empty "${NABO_GIT_REMOTE_URL}" + assert_empty "${NABO_GIT_NAME}" + assert_empty "${NABO_PATH}" + assert_empty "${NABO_SRC_NAME}" + + assert_empty "${NABO_BUILD_SYSTEM_PATH}" + assert_empty "${N2ST_PATH}" + assert_empty "${NBS_PATH}" + + # ....Source .env.project........................................................................ + set -o allexport + source "${BATS_DOCKER_WORKDIR:?err}/${DOTENV_FILE}" + set +o allexport + +# printenv | grep -e 'CONTAINER_PROJECT_' -e 'PROJECT_' >&3 + + # ....Tests...................................................................................... + assert_equal "${PROJECT_PROMPT_NAME}" "NABO" + assert_regex "${PROJECT_GIT_REMOTE_URL}" "/~https://github.com/norlab-ulaval/libnabo"'(".git")?' + assert_equal "${PROJECT_GIT_NAME}" "libnabo" + assert_equal "${PROJECT_SRC_NAME}" "libnabo" + assert_equal "${PROJECT_PATH}" "/code/libnabo" + + assert_equal "${NABO_PROMPT_NAME}" "NABO" + assert_regex "${NABO_GIT_REMOTE_URL}" "/~https://github.com/norlab-ulaval/libnabo"'(".git")?' + assert_equal "${NABO_GIT_NAME}" "libnabo" + assert_equal "${NABO_SRC_NAME}" "libnabo" + assert_equal "${NABO_PATH}" "/code/libnabo" + + assert_equal "${NABO_BUILD_SYSTEM_PATH}" "/code/libnabo/build_system" + assert_equal "${N2ST_PATH}" "/code/libnabo/build_system/utilities/norlab-shell-script-tools" + assert_equal "${NBS_PATH}" "/code/libnabo/build_system/utilities/norlab-build-system" +} diff --git a/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_dependencies_build_matrix.bats b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_dependencies_build_matrix.bats new file mode 100644 index 0000000..b388f11 --- /dev/null +++ b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_dependencies_build_matrix.bats @@ -0,0 +1,92 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + load "${SRC_CODE_PATH}/build_system/tests/tests_bats/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== + +TESTED_FILE="nabo_crawl_dependencies_build_matrix.bash" +TESTED_FILE_PATH="./build_system/" +COMPOSE_FILE="docker-compose.dependencies.yaml" +DOTENV_BUILD_MATRIX="${SRC_CODE_PATH}"/build_system/.env.build_matrix.dependencies +DOTENV_BUILD_MATRIX_NAME=$( basename "${DOTENV_BUILD_MATRIX}" ) + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + ## Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# printenv >&3 +} + +# executed before each test +setup() { + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== + +@test "${TESTED_FILE} › docker image › execute ok › expect pass" { + + run bash "${TESTED_FILE}" "${DOTENV_BUILD_MATRIX}" --fail-fast -- build + assert_success + assert_output --regexp .*"Starting".*"${TESTED_FILE}".*"\[NBS\]".*"Build images specified in".*"'${COMPOSE_FILE}'".*"following".*"${DOTENV_BUILD_MATRIX_NAME}" + assert_output --regexp "Status of tag crawled:".*"Pass".*"› latest".*"Completed".*"${TESTED_FILE}".* +} + +# ....Test --help flag related logic............................................................... +@test "${TESTED_FILE} › --help as first argument › execute ok › expect pass" { + run bash "${TESTED_FILE}" --help + test_generic_help_flag_logic +} + +@test "${TESTED_FILE} › second arg: --help › execute ok › expect pass" { + run bash "${TESTED_FILE}" --fail-fast --help + test_generic_help_flag_logic +} + +# ToDo: implement >> test for IS_TEAMCITY_RUN==true casses +# (NICE TO HAVE) ToDo: implement >> test for python intsall casses with regard to distribution + diff --git a/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bats b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bats new file mode 100644 index 0000000..e9e09b4 --- /dev/null +++ b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bats @@ -0,0 +1,96 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + load "${SRC_CODE_PATH}/build_system/tests/tests_bats/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== + +TESTED_FILE="nabo_crawl_libnabo_build_matrix.bash" +TESTED_FILE_PATH="./build_system/" +COMPOSE_FILE="docker-compose.libnabo.yaml" +DOTENV_BUILD_MATRIX="${SRC_CODE_PATH}"/build_system/.env.build_matrix.libnabo +DOTENV_BUILD_MATRIX_NAME=$( basename "${DOTENV_BUILD_MATRIX}" ) + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + ## Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# printenv >&3 +} + +# executed before each test +setup() { + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== + + +@test "${TESTED_FILE} › docker image › execute ok › expect pass" { + + run bash "${TESTED_FILE}" "${DOTENV_BUILD_MATRIX}" --fail-fast -- build + + assert_success + assert_output --regexp .*"Starting".*"${TESTED_FILE}".*"\[NBS\]".*"Build images specified in".*"'${COMPOSE_FILE}'".*"following".*"${DOTENV_BUILD_MATRIX_NAME}" + assert_output --regexp "Status of tag crawled:".*"Pass".*"› latest".*"Completed".*"${TESTED_FILE}".* +} + + +# ....Test --help flag related logic............................................................... + +@test "${TESTED_FILE} › --help as first argument › execute ok › expect pass" { + run bash "${TESTED_FILE}" --help + test_generic_help_flag_logic +} + +@test "${TESTED_FILE} › second arg: --help › execute ok › expect pass" { + run bash "${TESTED_FILE}" --fail-fast --help + test_generic_help_flag_logic +} + +# ToDo: implement >> test for IS_TEAMCITY_RUN==true casses +# (NICE TO HAVE) ToDo: implement >> test for python intsall casses with regard to distribution + diff --git a/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bleeding.bats b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bleeding.bats new file mode 100644 index 0000000..d39ea67 --- /dev/null +++ b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.bleeding.bats @@ -0,0 +1,101 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + load "${SRC_CODE_PATH}/build_system/tests/tests_bats/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== + +TESTED_FILE="nabo_crawl_libnabo_build_matrix.bleeding.bash" +TESTED_FILE_PATH="./build_system/" +COMPOSE_FILE="docker-compose.libnabo.yaml" +DOTENV_BUILD_MATRIX="${SRC_CODE_PATH}"/build_system/.env.build_matrix.libnabo.bleeding +DOTENV_BUILD_MATRIX_NAME=$( basename "${DOTENV_BUILD_MATRIX}" ) + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + ## Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# printenv >&3 +} + +# executed before each test +setup() { + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== + +@test "${TESTED_FILE} › docker image › execute ok › expect pass" { +# skip "tmp mute" # ToDo: on task end >> delete this line ← + + run bash "${TESTED_FILE}" "${DOTENV_BUILD_MATRIX}" --fail-fast -- build +# OPTIONS=( "${DOTENV_BUILD_MATRIX}" "--ubuntu-version-build-matrix-override jammy" "--fail-fast" "--" "config --quiet" ) +# run bash "${TESTED_FILE}" "${OPTIONS[@]}" + + assert_success + assert_output --regexp .*"Starting".*"${TESTED_FILE}".*"\[NBS\]".*"Build images specified in".*"'${COMPOSE_FILE}'".*"following".*"${DOTENV_BUILD_MATRIX_NAME}" + assert_output --regexp .*"\[NBS done\]".*"FINAL › Build matrix completed with command".*"\$".*"docker compose -f ${COMPOSE_FILE}" +# build --dry-run + assert_output --regexp "Status of tag crawled:".*"Pass".*"› latest".*"Completed".*"${TESTED_FILE}".* +} + +# ....Test --help flag related logic............................................................... + +@test "${TESTED_FILE} › --help as first argument › execute ok › expect pass" { +# skip "tmp dev" # ToDo: on task end >> delete this line ← + run bash "${TESTED_FILE}" --help + test_generic_help_flag_logic +} + +@test "${TESTED_FILE} › second arg: --help › execute ok › expect pass" { +# skip "tmp dev" # ToDo: on task end >> delete this line ← + + run bash "${TESTED_FILE}" --fail-fast --help + test_generic_help_flag_logic +} + +## ToDo: implement >> test for IS_TEAMCITY_RUN==true casses +## (NICE TO HAVE) ToDo: implement >> test for python intsall casses with regard to distribution diff --git a/build_system/tests/tests_bats/tests_installer/test_build_system_nabo_installer.bats b/build_system/tests/tests_bats/tests_installer/test_build_system_nabo_installer.bats new file mode 100644 index 0000000..f3574bc --- /dev/null +++ b/build_system/tests/tests_bats/tests_installer/test_build_system_nabo_installer.bats @@ -0,0 +1,149 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== +TESTED_FILE3="nabo_install_dependencies_ubuntu.bash" +TESTED_FILE4="nabo_install_libnabo_ubuntu.bash" +TESTED_FILE_PATH3="./build_system/ubuntu" + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + # Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# pwd >&3 && tree -L 2 -a ./build_system/utilities >&3 +# printenv >&3 +} + +# executed before each test +setup() { + echo "(Bats) Source project .env" + set -o allexport + source "${BATS_DOCKER_WORKDIR:?err}/build_system/.env" + set +o allexport + + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + echo "(Bats) Reset install directory" + rm -rf "${NBS_LIB_INSTALL_PATH}" + +# bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== +# ....Build system install script.................................................................. + +@test "Dependencies | run $TESTED_FILE3 › expect pass" { +# skip "tmp debug" # ToDo: on task end >> delete this line ← + cd "${BATS_DOCKER_WORKDIR}" + + run bash ./${TESTED_FILE_PATH3}/$TESTED_FILE3 --test-run + + assert_success + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install Libnabo dependencies".*"Boost" + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install Libnabo dependencies".*"Eigen" + + assert_output --regexp .*"\[".*"NABO done".*"\]".*"Libnabo dependencies installed" +} + +@test "Libnabo | run $TESTED_FILE4 (default) › expect pass" { +# skip "tmp debug" # ToDo: on task end >> delete this line ← + cd "${BATS_DOCKER_WORKDIR}" + + run bash "./${TESTED_FILE_PATH3}/$TESTED_FILE4" --test-run + + assert_success + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install libnabo" + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D LIBNABO_BUILD_TESTS=OFF -D LIBNABO_BUILD_DOXYGEN=OFF /opt/percep3d_libraries/libnabo" + refute_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D LIBNABO_BUILD_TESTS=OFF -D LIBNABO_BUILD_DOXYGEN=OFF -D CMAKE_INSTALL_PREFIX=/opt/percep3d_libraries /opt/percep3d_libraries/libnabo" + + assert_output --regexp .*"\[".*"NABO done".*"\]".*"libnabo installed successfully at".* +} + +@test "Libnabo | run $TESTED_FILE4 (default) (read APPEND_TO_CMAKE_FLAG ok) › expect pass" { +# skip "tmp debug" # ToDo: on task end >> delete this line ← + cd "${BATS_DOCKER_WORKDIR}" + + export APPEND_TO_CMAKE_FLAG=( -D CMAKE_INSTALL_PREFIX=/opt/test_dir ) + run source "./${TESTED_FILE_PATH3}/$TESTED_FILE4" --test-run + + assert_success + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install libnabo" + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D LIBNABO_BUILD_TESTS=OFF -D LIBNABO_BUILD_DOXYGEN=OFF -D CMAKE_INSTALL_PREFIX=/opt/test_dir /opt/percep3d_libraries/libnabo" + refute_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D LIBNABO_BUILD_TESTS=OFF -D LIBNABO_BUILD_DOXYGEN=OFF /opt/percep3d_libraries/libnabo" + + assert_output --regexp .*"\[".*"NABO done".*"\]".*"libnabo installed successfully at".* +} + + +@test "Libnabo | run $TESTED_FILE4 (argument check) › expect pass" { +# skip "tmp debug" # ToDo: on task end >> delete this line ← + cd "${BATS_DOCKER_WORKDIR}" + + run bash "./${TESTED_FILE_PATH3}/$TESTED_FILE4" --test-run \ + --install-path /opt/test_dir \ + --repository-version 1.0.7 \ + --compile-test \ + --generate-doc \ + --cmake-build-type Release + + assert_success + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install libnabo" + + assert_output --partial "switching to 'tags/1.0.7'." + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Repository checkout at tag 1.0.7" + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=Release -D LIBNABO_BUILD_TESTS=ON -D LIBNABO_BUILD_DOXYGEN=ON /opt/test_dir/libnabo" + refute_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D LIBNABO_BUILD_TESTS=OFF -D LIBNABO_BUILD_DOXYGEN=OFF /opt/percep3d_libraries/libnabo" + + + assert_output --regexp .*"\[".*"NABO done".*"\]".*"libnabo installed successfully at".* + +} diff --git a/build_system/tests/tests_bats/tests_installer/test_nabo_install_docker_tools_and_buildx_create_script.bats b/build_system/tests/tests_bats/tests_installer/test_nabo_install_docker_tools_and_buildx_create_script.bats new file mode 100644 index 0000000..7ca9dcc --- /dev/null +++ b/build_system/tests/tests_bats/tests_installer/test_nabo_install_docker_tools_and_buildx_create_script.bats @@ -0,0 +1,83 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== +TESTED_FILE="nabo_install_docker_tools.bash" +TESTED_FILE2="nabo_create_multiarch_docker_builder.bash" +TESTED_FILE_PATH="./build_system/nabo_utility_script" + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + ## Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# printenv >&3 +} + +# executed before each test +setup() { + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== + +@test "run $TESTED_FILE from root › expect pass" { + cd "${BATS_DOCKER_WORKDIR}" + + run bash "./${TESTED_FILE_PATH}/$TESTED_FILE" + assert_success + run docker --version + assert_output --regexp "Docker version".*"build".* +} + +@test "run $TESTED_FILE2 (mock 'docker buildx create' step) › expect pass" { + cd "${BATS_DOCKER_WORKDIR}" + + mock_docker_command_exit_ok + + run source "./${TESTED_FILE_PATH}/$TESTED_FILE2" + assert_success +} diff --git a/build_system/tests/tests_bats/tests_installer/test_user_nabo_installer.bats b/build_system/tests/tests_bats/tests_installer/test_user_nabo_installer.bats new file mode 100644 index 0000000..0fbd6dd --- /dev/null +++ b/build_system/tests/tests_bats/tests_installer/test_user_nabo_installer.bats @@ -0,0 +1,134 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== +TESTED_FILE="libnabo_dependencies_installer.bash" +TESTED_FILE2="libnabo_installer.bash" +TESTED_FILE_PATH="." + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + ## Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# printenv >&3 +} + +# executed before each test +setup() { + echo "(Bats) Source project .env" + set -o allexport + source "${BATS_DOCKER_WORKDIR:?err}/build_system/.env" + set +o allexport + + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + echo "(Bats) Reset install directory" + rm -rf "${NBS_LIB_INSTALL_PATH}" + +# bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== + + +# ----User install script-------------------------------------------------------------------------- +# ....Test installer › pre-condition failure....................................................... +@test "Dependencies | source $TESTED_FILE › expect fail" { + cd "${BATS_DOCKER_WORKDIR}" + + run source "./${TESTED_FILE_PATH}/$TESTED_FILE" + assert_failure 1 + assert_output --regexp .*"\[".*"NABO ERROR".*"\]".*"Execute this script in a subshell".*"bash ${TESTED_FILE}" +} + +# bats test_tags=tag:1 +@test "Libnabo | source $TESTED_FILE2 › expect fail" { + cd "${BATS_DOCKER_WORKDIR}" + + run source "./${TESTED_FILE_PATH}/$TESTED_FILE" + assert_failure 1 + assert_output --regexp .*"\[".*"NABO ERROR".*"\]".*"Execute this script in a subshell".*"bash ${TESTED_FILE}" +} + +# ....Test installer › normal case................................................................. +@test "Dependencies | run $TESTED_FILE from root › expect pass" { + cd "${BATS_DOCKER_WORKDIR}" + + run bash "./${TESTED_FILE_PATH}/$TESTED_FILE" --test-run + + assert_success + + ## General dependencies + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install development utilities" + assert_output --regexp .*"\[".*"NABO".*"\]".*"The install script is executed in stand alone mode" + assert_output --regexp .*"\[".*"NBS".*"\]".*"Starting nbs::install_python_dev_tools" + assert_output --regexp .*"\[".*"NBS".*"\]".*"Install python development tools for Ubuntu distro".* + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install Libnabo dependencies › Boost" + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install Libnabo dependencies › Eigen" +# assert_output --regexp .*"\[".*"NABO".*"\]".*"Install Libnabo dev tools" + + assert_output --regexp .*"\[".*"NABO done".*"\]".*"Libnabo dependencies installed" + + ## Documentation dependencies + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install libnabo documentation related dependencies" + assert_output --regexp .*"\[".*"NABO done".*"\]".*"Libnabo documentation related dependencies installed" + + assert_output --regexp .*"\[".*"NABO done".*"\]".*"All Libnabo dependencies installed" +} + +@test "Libnabo | run $TESTED_FILE2 from root › expect pass" { + cd "${BATS_DOCKER_WORKDIR}" + + run bash "./${TESTED_FILE_PATH}/$TESTED_FILE2" --generate-doc --cmake-build-type Release --test-run + + assert_success + assert_output --regexp .*"\[".*"NABO".*"\]".*"Install libnabo" + + assert_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=Release -D LIBNABO_BUILD_TESTS=OFF -D LIBNABO_BUILD_DOXYGEN=ON /opt/percep3d_libraries/libnabo" + refute_output --regexp .*"\[".*"NABO".*"\]".*"Execute".*"cmake -D CMAKE_BUILD_TYPE=Release -D LIBNABO_BUILD_TESTS=OFF -D LIBNABO_BUILD_DOXYGEN=ON -D CMAKE_INSTALL_PREFIX=/opt/percep3d_libraries /opt/percep3d_libraries/libnabo" + + assert_output --regexp .*"\[".*"NABO done".*"\]".*"libnabo installed successfully at".* + assert_output --regexp .*"\[".*"NABO done".*"\]".*"Libnabo install script completed. Have fun" +} diff --git a/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_dependencies_build_matrix.bash b/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_dependencies_build_matrix.bash new file mode 100644 index 0000000..97b9852 --- /dev/null +++ b/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_dependencies_build_matrix.bash @@ -0,0 +1,14 @@ +#!/bin/bash + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../" + +# ====begin======================================================================================== +#FLAGS=( '--fail-fast' '--' 'build' '--dry-run' ) +#bash nabo_crawl_dependencies_build_matrix.bash ${FLAGS[@]} + +#bash nabo_crawl_dependencies_build_matrix.bash --fail-fast -- build --dry-run dependencies dependencies-doc + +bash nabo_crawl_dependencies_build_matrix.bash --fail-fast -- build --dry-run diff --git a/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bash b/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bash new file mode 100644 index 0000000..415a227 --- /dev/null +++ b/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bash @@ -0,0 +1,10 @@ +#!/bin/bash + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../" + +# ====begin======================================================================================== +#bash nabo_crawl_libnabo_build_matrix.bash --fail-fast -- build --dry-run ci_PR_amd64 ci_PR_arm64v8 +bash nabo_crawl_libnabo_build_matrix.bash --fail-fast -- build --dry-run diff --git a/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bleeding.bash b/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bleeding.bash new file mode 100644 index 0000000..97901dd --- /dev/null +++ b/build_system/tests/tests_docker_dryrun_and_config/dryrun_nabo_crawl_libnabo_build_matrix.bleeding.bash @@ -0,0 +1,10 @@ +#!/bin/bash + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../" + +# ====begin======================================================================================== +#bash nabo_crawl_libnabo_build_matrix.bleeding.bash --fail-fast -- build --dry-run ci_PR_amd64 ci_PR_arm64v8 +bash nabo_crawl_libnabo_build_matrix.bleeding.bash --fail-fast -- build --dry-run diff --git a/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_dependencies_build_matrix.bash b/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_dependencies_build_matrix.bash new file mode 100644 index 0000000..b655b22 --- /dev/null +++ b/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_dependencies_build_matrix.bash @@ -0,0 +1,9 @@ +#!/bin/bash + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../" + +# ====begin======================================================================================== +bash nabo_crawl_dependencies_build_matrix.bash --fail-fast -- config --quiet diff --git a/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bash b/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bash new file mode 100644 index 0000000..2fdef7b --- /dev/null +++ b/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bash @@ -0,0 +1,9 @@ +#!/bin/bash + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../" + +# ====begin======================================================================================== +bash nabo_crawl_libnabo_build_matrix.bash --fail-fast -- config --quiet diff --git a/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bleeding.bash b/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bleeding.bash new file mode 100644 index 0000000..b4ce470 --- /dev/null +++ b/build_system/tests/tests_docker_dryrun_and_config/test_configuration_nabo_crawl_libnabo_build_matrix.bleeding.bash @@ -0,0 +1,9 @@ +#!/bin/bash + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../" + +# ====begin======================================================================================== +bash nabo_crawl_libnabo_build_matrix.bleeding.bash --fail-fast -- config --quiet diff --git a/build_system/tests/tests_docker_interactive/Dockerfile.build_system_test b/build_system/tests/tests_docker_interactive/Dockerfile.build_system_test new file mode 100644 index 0000000..485acbc --- /dev/null +++ b/build_system/tests/tests_docker_interactive/Dockerfile.build_system_test @@ -0,0 +1,90 @@ +ARG BASE_IMAGE=ubuntu +ARG BASE_IMAGE_TAG=focal +FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS base-image + +LABEL org.opencontainers.image.authors="luc.coupal.1@ulaval.ca" + +SHELL ["/bin/bash", "-e", "-c"] +ARG DEBIAN_FRONTEND=noninteractive +WORKDIR / + +# ....Setup timezone and localization.............................................................. +# change the locale from POSIX to UTF-8 +RUN apt-get update && \ + apt-get install --assume-yes --no-install-recommends \ + locales && \ + rm -rf /var/lib/apt/lists/* + +RUN locale-gen en_US en_US.UTF-8 && update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 +ENV LANG=en_US.UTF-8 +ENV PYTHONIOENCODING=utf-8 + +# ====Begin install================================================================================ + +# ....Install development utilities................................................................ +RUN apt-get update \ + && apt-get install --assume-yes --no-install-recommends \ + sudo \ + gnupg2 \ + lsb-release \ + cmake \ + build-essential \ + curl \ + wget \ + ca-certificates \ + git \ + vim \ + tree \ + less \ + apt-utils \ + zip gzip tar unzip \ + fontconfig \ + software-properties-common \ + bash-completion \ + && rm -rf /var/lib/apt/lists/* + + +# ....Install docker tools......................................................................... + +# Required for norlab-build-system path resolution logic +WORKDIR /libnabo +COPY ./.git ./.git + +# Copy all files from the checkout branch in the repository (except those in the .dockerignore) +WORKDIR /libnabo/build_system + +COPY ./build_system/utilities/norlab-build-system ./utilities/norlab-build-system +COPY ./build_system/utilities/norlab-shell-script-tools ./utilities/norlab-shell-script-tools + +COPY ./build_system/.env ./.env +#COPY ./build_system/.env.prompt ./.env.prompt +COPY ./build_system/nabo_utility_script/nabo_install_docker_tools.bash ./nabo_utility_script/nabo_install_docker_tools.bash +#COPY ./build_system/function_library/prompt_utilities.bash ./function_library/prompt_utilities.bash + +RUN chmod +x ./nabo_utility_script/nabo_install_docker_tools.bash +RUN source ./nabo_utility_script/nabo_install_docker_tools.bash + + +# ....Copy and prep libnabo repository main files.................................................. +WORKDIR /libnabo + +COPY .. /libnabo/ + +# Note: Build context must be at repository root +RUN /bin/bash -c " \ +if [[ ! -f LICENSE ]]; then \ + echo -e \"\nBuild context must be at repository root.\nProject root not reached! Current workdir: $(pwd).\nAborting build now!\n\"; \ + exit 1; \ +fi" + + +RUN chmod +x --recursive /libnabo/ + +# ====End========================================================================================== +WORKDIR ./build_system + +## Trick to validate the output of the file created with COPY <] +# +set -e +#set -v +#set -x + +DOCKER_CMD_ARGS=${*} + +clear + +TMP_CWD=$(pwd) + +# ....Helper function.............................................................................. +if [[ "$(basename $(pwd))" == "tests" ]]; then + cd ../ +fi + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")/../../.." +cd "${NABO_ROOT_DIR}" + +set -o allexport && source ./build_system/.env && set +o allexport + +# ....Helper function.............................................................................................. +# import shell functions from utilities library +source "./build_system/utilities/norlab-shell-script-tools/import_norlab_shell_script_tools_lib.bash" + +# ====Begin======================================================================================== +print_formated_script_header 'build_and_run_IamBuildSystemTester.bash' "${MSG_LINE_CHAR_TEST}" + +# ....Build image.................................................................................. +echo +print_msg "Building 'nabo.ubuntu20.buildsystem.test'" +# Note: Build context must be at repository root + +pwd +tree -L 1 -a + +show_and_execute_docker "build -f build_system/tests/tests_docker_interactive/Dockerfile.build_system_test -t nabo.ubuntu20.buildsystem.test ." +#--no-cache + +# ....Run container................................................................................ +print_msg "Starting 'IamBuildSystemTester'" + +if [[ -n ${DOCKER_CMD_ARGS} ]]; then + print_msg "Passing command ${MSG_DIMMED_FORMAT}\"${DOCKER_CMD_ARGS}\"${MSG_END_FORMAT} to docker run" +fi + +show_and_execute_docker "run --name IamBuildSystemTester -it --rm nabo.ubuntu20.buildsystem.test ${DOCKER_CMD_ARGS}" + +print_formated_script_footer 'build_and_run_IamBuildSystemTester.bash' "${MSG_LINE_CHAR_TEST}" +# ====Teardown===================================================================================== +cd "${TMP_CWD}" diff --git a/build_system/tests/tests_docker_interactive/entrypoint.bash b/build_system/tests/tests_docker_interactive/entrypoint.bash new file mode 100644 index 0000000..6504199 --- /dev/null +++ b/build_system/tests/tests_docker_interactive/entrypoint.bash @@ -0,0 +1,8 @@ +#!/bin/bash + +pwd +tree -L 3 + +# ====Continue===================================================================================== +exec "${@}" + diff --git a/build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix.bash b/build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix.bash new file mode 100644 index 0000000..3217090 --- /dev/null +++ b/build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix.bash @@ -0,0 +1,17 @@ +#!/bin/bash + +clear + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../.." + +pwd + +# ====begin======================================================================================== +bash build_system/tests/tests_docker_interactive/build_and_run_IamBuildSystemTester.bash "bash ./nabo_crawl_libnabo_build_matrix.bash \ + --repository-version-build-matrix-override latest \ + --cmake-build-type-build-matrix-override None \ + --docker-debug-logs \ + -- build --dry-run" diff --git a/build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix_with_flag.bash b/build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix_with_flag.bash new file mode 100644 index 0000000..9aa9830 --- /dev/null +++ b/build_system/tests/tests_docker_interactive/test_execute_compose_over_build_matrix_with_flag.bash @@ -0,0 +1,17 @@ +#!/bin/bash + +clear + +# ....path resolution logic........................................................................ +_PATH_TO_SCRIPT="$(realpath "${BASH_SOURCE[0]}")" +NABO_ROOT_DIR="$(dirname "${_PATH_TO_SCRIPT}")" +cd "${NABO_ROOT_DIR}/../../.." + +# ====begin======================================================================================== +bash build_system/tests/tests_docker_interactive/build_and_run_IamBuildSystemTester.bash "bash ./nabo_crawl_libnabo_build_matrix.bash \ + --repository-version-build-matrix-override PR1 \ + --cmake-build-type-build-matrix-override RelWithDebInfo \ + --os-name-build-matrix-override osx \ + --osx-version-build-matrix-override ventura \ + --ubuntu-version-build-matrix-override jammy \ + -- build --dry-run dependencies" diff --git a/build_system/ubuntu/Dockerfile.dependencies b/build_system/ubuntu/Dockerfile.dependencies new file mode 100644 index 0000000..a531c5e --- /dev/null +++ b/build_system/ubuntu/Dockerfile.dependencies @@ -0,0 +1,97 @@ +ARG BASE_IMAGE=ubuntu +ARG BASE_IMAGE_TAG=focal +FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS base-image + +LABEL org.opencontainers.image.authors="luc.coupal.1@ulaval.ca" + +ARG NBS_LIB_INSTALL_PATH +ARG NBS_REPOSITORY_NAME +ENV NBS_LIB_INSTALL_PATH=${NBS_LIB_INSTALL_PATH:?'Build argument needs to be set and non-empty.'} +ENV NBS_REPOSITORY_NAME=${NBS_REPOSITORY_NAME:?'Build argument needs to be set and non-empty.'} + +ENV NBS_PATH=${NBS_LIB_INSTALL_PATH}/norlab-build-system +ENV N2ST_PATH=${NBS_LIB_INSTALL_PATH}/norlab-shell-script-tools + +ARG NBS_SUPERPROJECT_BUILD_SYSTEM_DIR +ENV NBS_SUPERPROJECT_BUILD_SYSTEM_DIR=${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR:-"${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR}"} + +ARG IS_TEAMCITY_RUN +ENV IS_TEAMCITY_RUN=${IS_TEAMCITY_RUN:-false} + +SHELL ["/bin/bash", "-c"] +ARG DEBIAN_FRONTEND=noninteractive +ENV DEBIAN_FRONTEND=${DEBIAN_FRONTEND} +ENV TZ=Etc/UTC + +ENV TERM=${TERM:-"xterm-256color"} + +# ....Setup timezone and localization.............................................................. +# change the locale from POSIX to UTF-8 +RUN apt-get update && \ + apt-get install --assume-yes --no-install-recommends \ + locales \ + tzdata && \ + rm -rf /var/lib/apt/lists/* + +RUN locale-gen en_US en_US.UTF-8 && update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 +ENV LANG=en_US.UTF-8 +ENV PYTHONIOENCODING=utf-8 + + +# ====Begin install================================================================================ + +# ....Install development utilities................................................................ +RUN apt-get update && \ + apt-get install --assume-yes --no-install-recommends \ + sudo \ + bash-completion \ + git \ + vim \ + tree \ + curl \ + wget \ + gnupg2 \ + zip gzip tar unzip \ + net-tools \ + ca-certificates \ + apt-utils && \ + rm -rf /var/lib/apt/lists/* + +# ....Install norlab-build-system library.......................................................... +WORKDIR "${NBS_LIB_INSTALL_PATH}" +RUN git clone --recurse-submodules /~https://github.com/norlab-ulaval/norlab-build-system.git +RUN git clone --recurse-submodules /~https://github.com/norlab-ulaval/norlab-shell-script-tools.git + +# ====Begin======================================================================================== + +# Required for norlab-build-system path resolution logic +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}" +COPY ./.git ./.git + +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}/${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR}" + + +COPY ./${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR}/.env . + +WORKDIR "${NBS_PATH}/src/utility_scripts/" +RUN chmod +x ./nbs_install_python_dev_tools.bash +RUN bash nbs_install_python_dev_tools.bash + + +# ====Install Libnabo dependencies================================================================= +FROM base-image AS libnabo-dependencies + +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}/${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR}" + +COPY ./${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR}/ubuntu/nabo_install_dependencies_ubuntu.bash ./ubuntu/ + +WORKDIR ./ubuntu +RUN chmod +x ./nabo_install_dependencies_ubuntu.bash +RUN bash ./nabo_install_dependencies_ubuntu.bash + +# ====End========================================================================================== +FROM libnabo-dependencies AS final +WORKDIR "${NBS_LIB_INSTALL_PATH}/" +RUN rm -r -f "./${NBS_REPOSITORY_NAME}" + +CMD [ "bash" ] diff --git a/build_system/ubuntu/Dockerfile.dependencies.doxygen b/build_system/ubuntu/Dockerfile.dependencies.doxygen new file mode 100644 index 0000000..56f2325 --- /dev/null +++ b/build_system/ubuntu/Dockerfile.dependencies.doxygen @@ -0,0 +1,36 @@ +ARG PROJECT_HUB=norlabulaval +ARG BASE_IMAGE=libnabo-dependencies +ARG BASE_IMAGE_TAG +FROM ${PROJECT_HUB}/${BASE_IMAGE}:${BASE_IMAGE_TAG:?err} AS libnabo-dependencies-full + +LABEL org.opencontainers.image.authors="luc.coupal.1@ulaval.ca" + +ARG IS_TEAMCITY_RUN +ENV IS_TEAMCITY_RUN=${IS_TEAMCITY_RUN:-false} + +SHELL ["/bin/bash", "-c"] +ARG DEBIAN_FRONTEND=noninteractive + +# Required for norlab-build-system path resolution logic +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}" +COPY ./.git ./.git + +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}/build_system" + +COPY ./build_system/.env . + +COPY ./build_system/ubuntu/nabo_install_doc_dependencies_ubuntu.bash ./ubuntu/ + +# ====Install Libnabo documentation related dependencies=========================================== +WORKDIR ./ubuntu + +RUN chmod +x nabo_install_doc_dependencies_ubuntu.bash + +RUN bash nabo_install_doc_dependencies_ubuntu.bash + +# ====End========================================================================================== +WORKDIR "${NBS_LIB_INSTALL_PATH}/" +RUN rm -r -f "./${NBS_REPOSITORY_NAME}" + +FROM libnabo-dependencies-full AS final +CMD [ "bash" ] diff --git a/build_system/ubuntu/Dockerfile.libnabo.ci_PR b/build_system/ubuntu/Dockerfile.libnabo.ci_PR new file mode 100644 index 0000000..4c44b55 --- /dev/null +++ b/build_system/ubuntu/Dockerfile.libnabo.ci_PR @@ -0,0 +1,56 @@ +ARG PROJECT_HUB=norlabulaval +ARG BASE_IMAGE=libnabo-dependencies +ARG BASE_IMAGE_TAG +FROM ${PROJECT_HUB}/${BASE_IMAGE}:${BASE_IMAGE_TAG:?err} AS libnabo-dependencies + +LABEL org.opencontainers.image.authors="luc.coupal.1@ulaval.ca" + +ARG REPOSITORY_VERSION='latest' +ENV REPOSITORY_VERSION=${REPOSITORY_VERSION} +LABEL libnabo.version="${REPOSITORY_VERSION}" + +ARG NBS_LIB_INSTALL_PATH +ARG NBS_REPOSITORY_NAME +ENV NBS_LIB_INSTALL_PATH=${NBS_LIB_INSTALL_PATH:?'Build argument needs to be set and non-empty.'} +ENV NBS_REPOSITORY_NAME=${NBS_REPOSITORY_NAME:?'Build argument needs to be set and non-empty.'} + +ARG CMAKE_BUILD_TYPE=RelWithDebInfo +ARG INSTALL_SCRIPT_FLAG='--build-system-CI-install --compile-test' +ENV CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} +ENV INSTALL_SCRIPT_FLAG=${INSTALL_SCRIPT_FLAG} + +ARG IS_TEAMCITY_RUN +ENV IS_TEAMCITY_RUN=${IS_TEAMCITY_RUN:-false} + +SHELL ["/bin/bash", "-c"] +ARG DEBIAN_FRONTEND=noninteractive + +# ToDo: validate +ENV TERM=${TERM:-"xterm-256color"} + +# ====Checkout libnabo repository================================================================== +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}" + +# Copy all files from the checkout branch in the repository (except those in the .dockerignore) +COPY . . + + +# ==== Build libnabo checkout branch ============================================================== +WORKDIR ./build_system/ubuntu + +RUN chmod +x nabo_install_libnabo_ubuntu.bash +RUN chmod +x nabo_execute_nabo_unittest.bash +RUN chmod +x entrypoint.bash + + +RUN bash nabo_install_libnabo_ubuntu.bash \ + --repository-version ${REPOSITORY_VERSION} \ + --cmake-build-type ${CMAKE_BUILD_TYPE} \ + ${INSTALL_SCRIPT_FLAG} + +# ==== Execute libnabo unit-test=================================================================== +RUN source nabo_execute_nabo_unittest.bash + +# ====End========================================================================================== +ENTRYPOINT [ "./entrypoint.bash" ] +CMD [ "bash" ] diff --git a/build_system/ubuntu/Dockerfile.libnabo.compilation_test b/build_system/ubuntu/Dockerfile.libnabo.compilation_test new file mode 100644 index 0000000..318c10a --- /dev/null +++ b/build_system/ubuntu/Dockerfile.libnabo.compilation_test @@ -0,0 +1,107 @@ +ARG PROJECT_HUB=norlabulaval +ARG BASE_IMAGE=libnabo-dependencies +ARG BASE_IMAGE_TAG +FROM ${PROJECT_HUB}/${BASE_IMAGE}:${BASE_IMAGE_TAG:?err} AS libnabo-dependencies + +LABEL org.opencontainers.image.authors="luc.coupal.1@ulaval.ca" + +ARG REPOSITORY_VERSION='latest' +ENV REPOSITORY_VERSION=${REPOSITORY_VERSION} +LABEL libnabo.version="${REPOSITORY_VERSION}" + +ARG NBS_LIB_INSTALL_PATH +ARG NBS_REPOSITORY_NAME +ENV NBS_LIB_INSTALL_PATH=${NBS_LIB_INSTALL_PATH:?'Build argument needs to be set and non-empty.'} +ENV NBS_REPOSITORY_NAME=${NBS_REPOSITORY_NAME:?'Build argument needs to be set and non-empty.'} + +ARG CMAKE_BUILD_TYPE=RelWithDebInfo +ARG INSTALL_SCRIPT_FLAG='--build-system-CI-install' +ENV CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} +ENV INSTALL_SCRIPT_FLAG=${INSTALL_SCRIPT_FLAG} + +ARG IS_TEAMCITY_RUN +ENV IS_TEAMCITY_RUN=${IS_TEAMCITY_RUN:-false} + +SHELL ["/bin/bash", "-c"] +ARG DEBIAN_FRONTEND=noninteractive + +# ToDo: validate +ENV TERM=${TERM:-"xterm-256color"} + +# ====Checkout libnabo repository================================================================== +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}" + +# Copy all files from the checkout branch in the repository (except those in the .dockerignore) +COPY . . + +WORKDIR ./build_system/ubuntu + +RUN chmod +x nabo_install_libnabo_ubuntu.bash +RUN chmod +x nabo_execute_nabo_unittest.bash +RUN chmod +x entrypoint.bash + +# ....Install libpointmatcher missing dependecnies................................................. +RUN apt-get update && \ + apt-get install --assume-yes "${APT_FLAGS[@]}" \ + libyaml-cpp-dev && \ + rm -rf /var/lib/apt/lists/* + +# ====Test compilation with automatic path resolution============================================== +FROM libnabo-dependencies AS test-compilation-auto-path-resolution + +#RUN echo && echo ">> nproc=$(nproc)" && echo # ToDo: on task end >> mute this line + +# .... Build libnabo checkout branch .............................................................. +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}/build_system/ubuntu" + +RUN source nabo_install_libnabo_ubuntu.bash \ + --repository-version ${REPOSITORY_VERSION} \ + --cmake-build-type ${CMAKE_BUILD_TYPE} \ + ${INSTALL_SCRIPT_FLAG} + +# .... Compile package dependent on libnabo ....................................................... +WORKDIR "${NBS_LIB_INSTALL_PATH}" +RUN git clone /~https://github.com/norlab-ulaval/libpointmatcher.git \ + && mkdir -p libpointmatcher/build && cd libpointmatcher/build \ + && cmake -DCMAKE_BUILD_TYPE=Release .. \ + && make -j $(nproc) \ + && make install + +ENTRYPOINT [ "./entrypoint.bash" ] +CMD [ "bash" ] + +# ====Test compilation with explicit path resolution=============================================== + +# (Priority) ToDo: implement >> test casse with 'SHARED_LIBS' cmake flag + +FROM libnabo-dependencies AS test-compilation-prefixed-path + +#RUN echo && echo ">> nproc=$(nproc)" && echo # ToDo: on task end >> mute this line + +# .... Build libnabo checkout branch .............................................................. +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}/build_system/ubuntu" + +RUN export APPEND_TO_CMAKE_FLAG=( "-D CMAKE_INSTALL_PREFIX=${NBS_LIB_INSTALL_PATH:?err}" ) \ + && source nabo_install_libnabo_ubuntu.bash \ + --repository-version ${REPOSITORY_VERSION} \ + --cmake-build-type ${CMAKE_BUILD_TYPE} \ + ${INSTALL_SCRIPT_FLAG} + + +# .... Compile package dependent on libnabo ....................................................... +WORKDIR "${NBS_LIB_INSTALL_PATH}" +RUN git clone /~https://github.com/norlab-ulaval/libpointmatcher.git \ + && mkdir -p libpointmatcher/build && cd libpointmatcher/build \ + && cmake -DCMAKE_BUILD_TYPE=Release .. \ + && make -j $(nproc) \ + && make install + +ENTRYPOINT [ "./entrypoint.bash" ] +CMD [ "bash" ] + +# ................................................................................................. +## Alternate version +#RUN chmod +x entrypoint_build_and_test_libnabo_checkout_branch.bash +#RUN chmod +x entrypoint_build_libnabo_checkout_branch.bash +#RUN source entrypoint_build_and_test_libnabo_checkout_branch.bash +#RUN source entrypoint_build_libnabo_checkout_branch.bash diff --git a/build_system/ubuntu/Dockerfile.libnabo.hub_release b/build_system/ubuntu/Dockerfile.libnabo.hub_release new file mode 100644 index 0000000..40cfaba --- /dev/null +++ b/build_system/ubuntu/Dockerfile.libnabo.hub_release @@ -0,0 +1,63 @@ +ARG PROJECT_HUB=norlabulaval +ARG BASE_IMAGE=libnabo-dependencies-doc +ARG BASE_IMAGE_TAG +FROM ${PROJECT_HUB}/${BASE_IMAGE}:${BASE_IMAGE_TAG:?err} AS libnabo-install + +LABEL org.opencontainers.image.authors="luc.coupal.1@ulaval.ca" + +ARG REPOSITORY_VERSION +ENV REPOSITORY_VERSION=${REPOSITORY_VERSION:?'Build argument needs to be set and non-empty.'} +LABEL libnabo.version="${REPOSITORY_VERSION}" + + +ARG NBS_LIB_INSTALL_PATH +ARG NBS_REPOSITORY_NAME +ENV NBS_LIB_INSTALL_PATH=${NBS_LIB_INSTALL_PATH:?'Build argument needs to be set and non-empty.'} +ENV NBS_REPOSITORY_NAME=${NBS_REPOSITORY_NAME:?'Build argument needs to be set and non-empty.'} + +ARG CMAKE_BUILD_TYPE=Release +ARG INSTALL_SCRIPT_FLAG="" +ENV CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} +ENV INSTALL_SCRIPT_FLAG=${INSTALL_SCRIPT_FLAG} + +ARG IS_TEAMCITY_RUN +ENV IS_TEAMCITY_RUN=${IS_TEAMCITY_RUN:-false} + +SHELL ["/bin/bash", "-c"] +ARG DEBIAN_FRONTEND=noninteractive + +# ====Build system related setup=================================================================== +WORKDIR "${NBS_LIB_INSTALL_PATH}/release-prep/" + +# Copy only the build system file for running the install and test scripts +# Note: Logic to copy files from the checkout branch is handle by 'nabo_install_libnabo_ubuntu.bash' script +COPY ./build_system/ ./build_system/ +COPY ./.git/ ./.git/ + +# ==== Build libnabo checkout branch ============================================================== +WORKDIR ./build_system/ubuntu + +RUN chmod +x nabo_install_libnabo_ubuntu.bash + +# Note: Make sure to install in "${NBS_LIB_INSTALL_PATH}//" as the "release-prep/" +# directory is deleted at the end of this install step +RUN bash nabo_install_libnabo_ubuntu.bash \ + --install-path ${NBS_LIB_INSTALL_PATH} \ + --repository-version ${REPOSITORY_VERSION} \ + --cmake-build-type ${CMAKE_BUILD_TYPE} \ + ${INSTALL_SCRIPT_FLAG} + +RUN rm -rf "${NBS_LIB_INSTALL_PATH}/release-prep/" + +# ====End========================================================================================== +FROM libnabo-install AS libnabo-release +WORKDIR "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}" + +COPY ./build_system/ubuntu/entrypoint.bash ./build_system/ubuntu/entrypoint.bash +COPY ./build_system/.env ./build_system/.env + +RUN chmod +x ./build_system/ubuntu/entrypoint.bash +RUN chmod +x ./build_system/.env + +ENTRYPOINT [ "./build_system/ubuntu/entrypoint.bash" ] +CMD [ "bash" ] diff --git a/build_system/ubuntu/entrypoint.bash b/build_system/ubuntu/entrypoint.bash new file mode 100644 index 0000000..460ba3c --- /dev/null +++ b/build_system/ubuntu/entrypoint.bash @@ -0,0 +1,29 @@ +#!/bin/bash +# +# Docker entrypoint for development task +# +# Usage: +# $ bash entrypoint.bash [] +# +# Parameter +# Optional command executed in a subprocess at the end of the entrypoint script. +# + +# ....Load environment variables from file......................................................... +set -o allexport +source "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}/build_system/.env" +set +o allexport + +# ....Helper function.............................................................................. +source "${N2ST_PATH:?err}/import_norlab_shell_script_tools_lib.bash" + +# ====Begin======================================================================================== +clear + +norlab_splash "${NBS_SPLASH_NAME:?err}" "/~https://github.com/${NBS_REPOSITORY_DOMAIN:?err}/${NBS_REPOSITORY_NAME:?err}" + +#ifconfig +pwd && tree -L 1 + +# ====Continue===================================================================================================== +exec "$@" diff --git a/build_system/ubuntu/nabo_execute_nabo_unittest.bash b/build_system/ubuntu/nabo_execute_nabo_unittest.bash new file mode 100644 index 0000000..c55ca90 --- /dev/null +++ b/build_system/ubuntu/nabo_execute_nabo_unittest.bash @@ -0,0 +1,74 @@ +#!/bin/bash +# ================================================================================================= +# +# Run Libnabo unit test +# +# Usage: +# $ bash nabo_execute_nabo_unittest.bash +# +# Notes: +# The script propagate the utest exit code on exit +# ================================================================================================= + +# ....Project root logic........................................................................... +TMP_CWD=$(pwd) + +NABO_PATH=$(git rev-parse --show-toplevel) +cd "${NABO_PATH}/build_system" || exit 1 + +# ....Load environment variables from file......................................................... +set -o allexport +source .env +set +o allexport + +# ....Helper function.............................................................................. +# import shell functions from utilities library +N2ST_PATH=${N2ST_PATH:-"${NABO_PATH}/build_system/utilities/norlab-shell-script-tools"} +source "${N2ST_PATH}/import_norlab_shell_script_tools_lib.bash" + +# ====Begin======================================================================================== +print_formated_script_header 'nabo_execute_nabo_unittest.bash' ':' + +cd "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}/build" + +if [[ ${IS_TEAMCITY_RUN} == true ]] || [[ ${TEAMCITY_VERSION} ]]; then + echo -e "##teamcity[testSuiteStarted name='gtest']" + echo -e "##teamcity[testStarted name='gtest' captureStandardOutput='true']" +else + print_msg "Starting Libnabo GoogleTest unit-test" +fi + +# ................................................................................................. +sudo chmod +x test +make test +NABO_TEST_EXIT_CODE=$? +# ................................................................................................. + +SUCCESS_MSG="Libnabo GoogleTest unit-test completed successfully" +FAILURE_MSG="Libnabo GoogleTest unit-test completed with error" + +if [[ ${IS_TEAMCITY_RUN} == true ]] || [[ ${TEAMCITY_VERSION} ]]; then + echo -e "##teamcity[testFinished name='gtest']" + + # Report message to build log + if [[ ${NABO_TEST_EXIT_CODE} == 0 ]]; then + echo -e "##teamcity[message text='${MSG_BASE_TEAMCITY} ${SUCCESS_MSG}' status='NORMAL']" + else + echo -e "##teamcity[message text='${MSG_BASE_TEAMCITY} ${FAILURE_MSG}' errorDetails='$NABO_TEST_EXIT_CODE' status='ERROR']" 1>&2 + fi + + echo -e "##teamcity[testSuiteFinished name='gtest']" +else + + if [[ ${NABO_TEST_EXIT_CODE} == 0 ]]; then + print_msg_done "${SUCCESS_MSG}" + else + print_msg_error "${FAILURE_MSG}" + fi + +fi + +print_formated_script_footer 'nabo_execute_nabo_unittest.bash' ':' +# ====Teardown===================================================================================== +cd "${TMP_CWD}" +exit $NABO_TEST_EXIT_CODE diff --git a/build_system/ubuntu/nabo_install_dependencies_ubuntu.bash b/build_system/ubuntu/nabo_install_dependencies_ubuntu.bash new file mode 100644 index 0000000..c4491fb --- /dev/null +++ b/build_system/ubuntu/nabo_install_dependencies_ubuntu.bash @@ -0,0 +1,126 @@ +#!/bin/bash -i +# ================================================================================================= +# +# Libnabo dependencies installer +# +# Usage: +# $ source nabo_install_dependencies_ubuntu.bash [--test-run] +# +# ================================================================================================= +set -e # Note: we want the installer to always fail-fast (it wont affect the build system policy) + +declare -a APT_FLAGS + +# skip GUI dialog by setting everything to default +export DEBIAN_FRONTEND=noninteractive + +# ....Project root logic........................................................................... +TMP_CWD=$(pwd) + +NABO_PATH=$(git rev-parse --show-toplevel) +cd "${NABO_PATH}/build_system" || cd "${NABO_PATH}" || exit 1 + +NBS_PATH=${NBS_PATH:-"${NABO_PATH}/build_system/utilities/norlab-build-system"} +N2ST_PATH=${N2ST_PATH:-"${NABO_PATH}/build_system/utilities/norlab-shell-script-tools"} + +# ....Load environment variables from file......................................................... +set -o allexport +source .env +set +o allexport + +# ....Helper function.............................................................................. +# import shell functions from utilities library +source "${N2ST_PATH}/import_norlab_shell_script_tools_lib.bash" + +# Set environment variable IMAGE_ARCH_AND_OS +cd "${N2ST_PATH}"/src/utility_scripts/ && source "which_architecture_and_os.bash" + +# ====Begin======================================================================================== +SHOW_SPLASH_IDU="${SHOW_SPLASH_IDU:-true}" + +if [[ "${SHOW_SPLASH_IDU}" == 'true' ]]; then + norlab_splash "${NBS_SPLASH_NAME}" "/~https://github.com/${NBS_REPOSITORY_DOMAIN:?err}/${NBS_REPOSITORY_NAME:?err}" +fi + +print_formated_script_header "nabo_install_dependencies_ubuntu.bash (${IMAGE_ARCH_AND_OS:?err})" "${MSG_LINE_CHAR_INSTALLER}" + +# ....Script command line flags.................................................................... +while [ $# -gt 0 ]; do + + case $1 in + --test-run) + APT_FLAGS=( --dry-run ) + shift + ;; + --?* | -?*) + echo "$0: $1: unrecognized option" >&2 # Note: '>&2' = print to stderr + shift + ;; + *) # Default case + break + ;; + esac + +done + + +# ................................................................................................. +teamcity_service_msg_blockOpened "Install development utilities" + +sudo apt-get update && + sudo apt-get install --assume-yes \ + lsb-release \ + build-essential \ + ca-certificates \ + curl \ + wget \ + git \ + && sudo apt-get install --assume-yes "${APT_FLAGS[@]}" \ + g++ \ + gcc \ + catch \ + make \ + cmake \ + cmake-gui && + sudo rm -rf /var/lib/apt/lists/* + +##cmake --version + +teamcity_service_msg_blockClosed +# ................................................................................................. + +# (Priority) ToDo: add check to see if executed in a docker container. Current check does not do what its intended +if [[ ${IS_TEAMCITY_RUN} == true ]]; then + print_msg "The install script is run in teamCity >> the python install step was executed earlier in the Dockerfile.dependencies" +else + print_msg "The install script is executed in stand alone mode" + cd "${NBS_PATH:?err}/src/utility_scripts" || exit 1 + bash "./nbs_install_python_dev_tools.bash" +fi + +# ................................................................................................. +teamcity_service_msg_blockOpened "Install Libnabo dependencies › Boost" +# https://www.boost.org/doc/libs/1_79_0/more/getting_started/unix-variants.html + +sudo apt-get update && + sudo apt-get install --assume-yes "${APT_FLAGS[@]}" \ + libboost-all-dev && + sudo rm -rf /var/lib/apt/lists/* + +teamcity_service_msg_blockClosed +# ................................................................................................. +teamcity_service_msg_blockOpened "Install Libnabo dependencies › Eigen" +# https://eigen.tuxfamily.org/index.php + +sudo apt-get update && + sudo apt-get install --assume-yes "${APT_FLAGS[@]}" \ + libeigen3-dev && + sudo rm -rf /var/lib/apt/lists/* + +teamcity_service_msg_blockClosed +## ................................................................................................. + +echo " " && print_msg_done "Libnabo dependencies installed" +print_formated_script_footer "nabo_install_dependencies_ubuntu.bash (${IMAGE_ARCH_AND_OS})" "${MSG_LINE_CHAR_INSTALLER}" +# ====Teardown===================================================================================== +cd "${TMP_CWD}" diff --git a/build_system/ubuntu/nabo_install_doc_dependencies_ubuntu.bash b/build_system/ubuntu/nabo_install_doc_dependencies_ubuntu.bash new file mode 100644 index 0000000..a085dde --- /dev/null +++ b/build_system/ubuntu/nabo_install_doc_dependencies_ubuntu.bash @@ -0,0 +1,83 @@ +#!/bin/bash -i +# ================================================================================================= +# +# Libnabo documentation dependencies installer +# +# Usage: +# $ bash nabo_install_doc_dependencies_ubuntu.bash [--test-run] +# +# ================================================================================================= +set -e # Note: we want the installer to always fail-fast (it wont affect the build system policy) + +declare -a APT_FLAGS + +## skip GUI dialog by setting everything to default +export DEBIAN_FRONTEND=noninteractive + +# ....Project root logic........................................................................... +TMP_CWD=$(pwd) + +NABO_PATH=$(git rev-parse --show-toplevel) +cd "${NABO_PATH}/build_system" || exit 1 + + +# ....Load environment variables from file......................................................... +set -o allexport +source .env +set +o allexport + +# ....Helper function.............................................................................. +# import shell functions from utilities library +N2ST_PATH=${N2ST_PATH:-"${NABO_PATH}/build_system/utilities/norlab-shell-script-tools"} +source "${N2ST_PATH}/import_norlab_shell_script_tools_lib.bash" + +# Set environment variable IMAGE_ARCH_AND_OS +cd "${N2ST_PATH}"/src/utility_scripts/ && source "which_architecture_and_os.bash" + +# ====Begin======================================================================================== +SHOW_SPLASH_IDDU="${SHOW_SPLASH_IDDU:-true}" + +if [[ "${SHOW_SPLASH_IDDU}" == 'true' ]]; then + norlab_splash "${NBS_SPLASH_NAME:?err}" "/~https://github.com/${NBS_REPOSITORY_DOMAIN:?err}/${NBS_REPOSITORY_NAME:?err}" +fi + +print_formated_script_header "nabo_install_doc_dependencies_ubuntu.bash (${IMAGE_ARCH_AND_OS:?err})" "${MSG_LINE_CHAR_INSTALLER}" + +# ....Script command line flags.................................................................... +while [ $# -gt 0 ]; do + + case $1 in + --test-run) + APT_FLAGS=( --dry-run ) + shift + ;; + --?* | -?*) + echo "$0: $1: unrecognized option" >&2 # Note: '>&2' = print to stderr + shift + ;; + *) # Default case + break + ;; + esac + +done + + +# ................................................................................................. +teamcity_service_msg_blockOpened "Install libnabo documentation related dependencies" + +## Package required when LIBNABO_BUILD_DOXYGEN flag is set to true +## Note: 'texlive-full' is ~6GB. 'doxygen-latex' is a slim version tailor made for doxygen code documentation task +sudo apt-get update \ + && sudo apt-get install --assume-yes "${APT_FLAGS[@]}" \ + doxygen \ + doxygen-latex \ + && sudo rm -rf /var/lib/apt/lists/* + +teamcity_service_msg_blockClosed + +echo " " && print_msg_done "Libnabo documentation related dependencies installed" +print_formated_script_footer "nabo_install_doc_dependencies_ubuntu.bash (${IMAGE_ARCH_AND_OS})" "${MSG_LINE_CHAR_INSTALLER}" +# ====Teardown===================================================================================== +cd "${TMP_CWD}" + diff --git a/build_system/ubuntu/nabo_install_libnabo_ubuntu.bash b/build_system/ubuntu/nabo_install_libnabo_ubuntu.bash new file mode 100644 index 0000000..75da3d9 --- /dev/null +++ b/build_system/ubuntu/nabo_install_libnabo_ubuntu.bash @@ -0,0 +1,279 @@ +#!/bin/bash -i +# ================================================================================================= +# +# Install libnabo +# +# Usage: +# $ bash nabo_install_libnabo_ubuntu.bash [] +# +# Arguments: +# --install-path The directory where to install libnabo (absolute path) +# (default location defined in the .env) +# --repository-version 1.0.7 Install libnabo release tag version (default to master branch latest) +# --compile-test Compile the libnabo unit-test +# --generate-doc Generate the libnabo doxygen documentation +# in /usr/local/share/doc/libnabo/api/html/index.html +# --cmake-build-type RelWithDebInfo The type of cmake build: None Debug Release RelWithDebInfo MinSizeRel +# (default to RelWithDebInfo) +# --build-system-CI-install Set special configuration for CI/CD build system: +# skip the git clone install step and assume the repository is already +# pulled and checkout on the desired branch +# --test-run CI/CD build system Test-run mode +# -h, --help Get help +# +# Global +# - Read the array APPEND_TO_CMAKE_FLAG +# +# Usage: +# $ export APPEND_TO_CMAKE_FLAG=( -D CMAKE_INSTALL_PREFIX=/opt ) \ +# && source nabo_install_libnabo_ubuntu.bash +# +# Note: +# - this script required package: g++, make, cmake, build-essential, git and all libnabo dependencies +# - execute `nabo_install_dependencies_ubuntu.bash` first +# +# ================================================================================================= +set -e # Note: we want the installer to always fail-fast (it wont affect the build system policy) + +declare -a CMAKE_FLAGS + +CALLER_NAME="$(basename "$0" )" + +# ....Default...................................................................................... +REPOSITORY_VERSION='latest' +BUILD_TESTS_FLAG=OFF +LIBNABO_BUILD_DOXYGEN_FLAG=OFF +BUILD_SYSTEM_CI_INSTALL=FALSE +CMAKE_BUILD_TYPE=RelWithDebInfo + +# skip GUI dialog by setting everything to default +export DEBIAN_FRONTEND=noninteractive + +# ....Project root logic........................................................................... +TMP_CWD=$(pwd) + +NABO_PATH=$(git rev-parse --show-toplevel) +cd "${NABO_PATH}/build_system" || exit + +# ....Load environment variables from file......................................................... +set -o allexport +source .env +set +o allexport + +# ....Helper function.............................................................................. +# import shell functions from utilities library +N2ST_PATH=${N2ST_PATH:-"${NABO_PATH}/build_system/utilities/norlab-shell-script-tools"} +source "${N2ST_PATH}/import_norlab_shell_script_tools_lib.bash" + +# Set environment variable IMAGE_ARCH_AND_OS +cd "${N2ST_PATH}"/src/utility_scripts/ && source "which_architecture_and_os.bash" + +function print_help_in_terminal() { + echo -e "\$ ${0} [] + + \033[1m:\033[0m + --install-path The directory where to install (absolute path) + (default location ${MSG_DIMMED_FORMAT}${NBS_LIB_INSTALL_PATH:?err}${MSG_END_FORMAT}) + --repository-version 1.0.7 Install release tag version (default to master branch latest) + --compile-test Compile the unit-test + in ${MSG_DIMMED_FORMAT}${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME:?err}/build${MSG_END_FORMAT} + --generate-doc Generate the libnabo doxygen documentation + in ${MSG_DIMMED_FORMAT}/usr/local/share/doc/${NBS_REPOSITORY_NAME}/api/html/index.html${MSG_END_FORMAT} + --cmake-build-type RelWithDebInfo The type of cmake build: None Debug Release RelWithDebInfo MinSizeRel + --build-system-CI-install Set special configuration for CI/CD build system: + skip the git clone install step and assume the repository is already + pulled and checkout on the desired branch + --test-run CI/CD build system Test-run mode + -h, --help Get help + + Global + - Read the array APPEND_TO_CMAKE_FLAG + + Usage: + $ export APPEND_TO_CMAKE_FLAG=( -D CMAKE_INSTALL_PREFIX=/opt ) && source nabo_install_libnabo_ubuntu.bash + + " +} + +# ====Begin======================================================================================== +SHOW_SPLASH_ILU="${SHOW_SPLASH_ILU:-true}" + +if [[ "${SHOW_SPLASH_ILU}" == 'true' ]]; then + norlab_splash "${NBS_SPLASH_NAME:?err}" "/~https://github.com/${NBS_REPOSITORY_DOMAIN:?err}/${NBS_REPOSITORY_NAME:?err}" +fi + +print_formated_script_header "${CALLER_NAME} (${IMAGE_ARCH_AND_OS:?err})" "${MSG_LINE_CHAR_INSTALLER}" + + +# ....Script command line flags.................................................................... +while [ $# -gt 0 ]; do + + case $1 in + --install-path) + unset NBS_LIB_INSTALL_PATH + NBS_LIB_INSTALL_PATH="${2}" + shift # Remove argument (--install-path) + shift # Remove argument value + ;; + --repository-version) + REPOSITORY_VERSION="${2}" + shift # Remove argument (--repository-version) + shift # Remove argument value + ;; + --cmake-build-type) + CMAKE_BUILD_TYPE="${2}" + shift # Remove argument (--cmake-build-type) + shift # Remove argument value + ;; + --compile-test) + BUILD_TESTS_FLAG=ON + shift + ;; + --generate-doc) + LIBNABO_BUILD_DOXYGEN_FLAG=ON + shift + ;; + --build-system-CI-install) + BUILD_SYSTEM_CI_INSTALL=TRUE + shift + ;; + --test-run) + TEST_RUN=true + shift + ;; + -h | --help) + print_help_in_terminal + exit + ;; + --) # no more option + shift + break + ;; + --?* | -?*) + echo "$0: $1: unrecognized option" >&2 # Note: '>&2' = print to stderr + shift + ;; + *) # Default case + break + ;; + esac + +done + + +# ....Cmake flags.................................................................................. +CMAKE_FLAGS=( -D CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}" -D LIBNABO_BUILD_TESTS="${BUILD_TESTS_FLAG}" -D LIBNABO_BUILD_DOXYGEN="${LIBNABO_BUILD_DOXYGEN_FLAG}" "${APPEND_TO_CMAKE_FLAG[@]}" ) + +# (CRITICAL) ToDo: validate >> LIBNABO_BUILD_DOXYGEN install dir + +# Note: +# - Previously use intall flag quick-hack to work around the install issue. +# - Keep it here as futur reference +# -D LIBNABO_INSTALL_DIR="${NBS_LIB_INSTALL_PATH}/libnabo" \ + +# ----Install steps-------------------------------------------------------------------------------- +teamcity_service_msg_blockOpened "Install ${NBS_REPOSITORY_NAME}" + +mkdir -p "${NBS_LIB_INSTALL_PATH}" +print_msg "Directories (pre libnabo install)$(tree -L 2 "${NBS_LIB_INSTALL_PATH}")" +cd "${NBS_LIB_INSTALL_PATH}" + +# ....Repository cloning step...................................................................... +if [[ ${BUILD_SYSTEM_CI_INSTALL} == FALSE ]]; then + + if [[ -d ${NBS_REPOSITORY_NAME}/.git ]]; then + print_msg_error_and_exit "${MSG_DIMMED_FORMAT}${NBS_REPOSITORY_NAME}${MSG_END_FORMAT} source code was already checkout in the specified install directory ${MSG_DIMMED_FORMAT}${NBS_LIB_INSTALL_PATH}/${MSG_END_FORMAT}, specify an other one using ${MSG_DIMMED_FORMAT}--install-path ${MSG_END_FORMAT}." + fi + + git clone /~https://github.com/"${NBS_REPOSITORY_DOMAIN}"/"${NBS_REPOSITORY_NAME}".git + + if [[ "${REPOSITORY_VERSION}" != 'latest' ]]; then + cd "${NBS_REPOSITORY_NAME}" + + git fetch --tags + git tag --list + + # Remove prefix 'v' from version tag + GITHUB_TAG="${REPOSITORY_VERSION/v/}" + + git checkout tags/"${GITHUB_TAG}" + + print_msg "Repository checkout at tag $(git symbolic-ref -q --short HEAD || git describe --tags --exact-match)" + fi +fi + +cd "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}" +mkdir -p build && cd build + +# ....Cmake install step........................................................................... +teamcity_service_msg_compilationStarted "cmake" + +print_msg "Execute ${MSG_DIMMED_FORMAT} +cmake ${CMAKE_FLAGS[*]} ${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME} +${MSG_END_FORMAT}" + +if [[ $TEST_RUN == true ]]; then + print_msg "Test-run mode: Skipping cmake" + BUILD_EXIT_CODE=0 + INSTALL_EXIT_CODE=0 +else + cmake "${CMAKE_FLAGS[@]}" "${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}" + + BUILD_EXIT_CODE=$? + + make -j $(nproc) + sudo make install + + INSTALL_EXIT_CODE=$? + + if [[ ${LIBNABO_BUILD_DOXYGEN_FLAG} = ON ]]; then + make doc + fi + + ## List all CMake build options and their default values + ## ref: https://stackoverflow.com/questions/16851084/how-to-list-all-cmake-build-options-and-their-default-values + #cmake -LAH +fi + +print_msg "Directories (post ${NBS_REPOSITORY_NAME} install)$(tree -L 2 ${NBS_LIB_INSTALL_PATH})" + +teamcity_service_msg_compilationFinished +teamcity_service_msg_blockClosed + +# ....Install/build feedback....................................................................... +SUCCESS_MSG="${NBS_REPOSITORY_NAME} installed successfully at ${MSG_DIMMED_FORMAT}${NBS_LIB_INSTALL_PATH}/${NBS_REPOSITORY_NAME}${MSG_END_FORMAT}" +FAILURE_MSG="${NBS_REPOSITORY_NAME} installer exited with error" + +if [[ ${IS_TEAMCITY_RUN} == true ]]; then + # Report message to build log + if [[ ${BUILD_EXIT_CODE} == 0 ]] && [[ ${INSTALL_EXIT_CODE} == 0 ]]; then + echo -e "##teamcity[message text='${MSG_BASE_TEAMCITY} ${SUCCESS_MSG}' status='NORMAL']" + else + if [[ ${BUILD_EXIT_CODE} != 0 ]]; then + echo -e "##teamcity[message text='${MSG_BASE_TEAMCITY} ${FAILURE_MSG}' errorDetails='$BUILD_EXIT_CODE' status='ERROR']" + print_formated_script_footer "${CALLER_NAME} (${IMAGE_ARCH_AND_OS})" "${MSG_LINE_CHAR_INSTALLER}" + exit $BUILD_EXIT_CODE + else + echo -e "##teamcity[message text='${MSG_BASE_TEAMCITY} ${FAILURE_MSG}' errorDetails='$INSTALL_EXIT_CODE' status='ERROR']" + print_formated_script_footer "${CALLER_NAME} (${IMAGE_ARCH_AND_OS})" "${MSG_LINE_CHAR_INSTALLER}" + exit $INSTALL_EXIT_CODE + fi + fi +else + if [[ ${BUILD_EXIT_CODE} == 0 ]] && [[ ${INSTALL_EXIT_CODE} == 0 ]]; then + echo " " && print_msg_done "${SUCCESS_MSG}" + else + print_msg_error "${FAILURE_MSG}" + print_formated_script_footer "${CALLER_NAME} (${IMAGE_ARCH_AND_OS})" "${MSG_LINE_CHAR_INSTALLER}" + if [[ ${BUILD_EXIT_CODE} != 0 ]]; then + exit $BUILD_EXIT_CODE + else + exit $INSTALL_EXIT_CODE + fi + fi +fi + +print_formated_script_footer "${CALLER_NAME} (${IMAGE_ARCH_AND_OS})" "${MSG_LINE_CHAR_INSTALLER}" + +# ====Teardown===================================================================================== +cd "${TMP_CWD}" diff --git a/commit_msg_reference.md b/contributing/commit_msg_reference.md similarity index 100% rename from commit_msg_reference.md rename to contributing/commit_msg_reference.md diff --git a/contributing/contributing_instructions.md b/contributing/contributing_instructions.md new file mode 100644 index 0000000..4d75537 --- /dev/null +++ b/contributing/contributing_instructions.md @@ -0,0 +1,134 @@ +# Contributing to _libnabo_ + +## Bug Reporting + +Please use our [github's issue tracker](http://github.com/norlab-ulaval/libnabo/issues) to +report bugs. + +## Code Contributions + +Libnabo codebase now +integrate [norlab-build-system (NBS)](/~https://github.com/norlab-ulaval/norlab-build-system) +and [norlab-shell-script-tools (N2ST)](/~https://github.com/norlab-ulaval/norlab-shell-script-tools). +`NBS` is a build-infrastructure-agnostic build system custom-made to meet our needs in robotic +software engineering at NorLab and `N2ST` is a library of shell script functions as well as a shell +testing tools leveraging _**bats-core**_ and _**docker**_ . +`N2ST` purpose is to speed up shell script development and improve reliability. + +`NBS` is deployed on our [TeamCity](https://www.jetbrains.com/teamcity/) continuous +integration/deployment server and oversees protected branches of +the [libnabo](/~https://github.com/norlab-ulaval/libnabo) GitHub repository: + +- The `develop` branch can only be merged through a pull-request from any `` branches. Any + contributor can submit a pull request to the `develop` branch; +- the `release` branch is a revision and preparation branch where we can freeze the codebase in a + given state without stalling to `develop` branch progression; +- The `master` branch can only be merged through a pull-request from the `release` branch. Only + repository admin can submit a PR to the `master` branch. + +In any cases, submitting a pull request to `develop` or `master` will trigger a build/test +configuration on our build system and the pull request will be granted if the build/test run +succeed. + +**Current build matrix:** +`[latest] x [x86, arm64] x [ubuntu] x [bionic, focal] x [Release, RelWithDebInfo, MinSizeRel]` + +### Development Workflow + +To speed up the development process, you can run the build system localy on your workstation and +have access to stacktrace and build log. +It support multi-OS and multi-architecture through docker container. + +#### Install _libnabo-build-system_ Dependencies + +```shell +cd + +# If libnabo is already cloned, fetch the NBS and N2ST submodule +git submodule update --remote --recursive --init + +cd ./build_system/nabo_utility_script + +# Execute docker tools install script i.e. docker daemon, docker compose, docker buildx +bash nabo_install_docker_tools.bash + +# Configure a multi-architecture docker builder +bash nabo_create_multiarch_docker_builder.bash +``` + +#### _libnabo_ Development › To Execute Build/Test Step Locally + +```shell +cd /build_system + +# Run the build matrix as specified in ".env.build_matrix.libnabo" +# on native architecture using "ci_PR" service +bash nabo_crawl_libnabo_build_matrix.bash --fail-fast -- build ci_PR + +# Run a specific case using build flags with multi-architecture +# virtualization using "ci_PR_amd64" and "ci_PR_arm64v8" services +bash nabo_crawl_libnabo_build_matrix.bash \ + --repository-version-build-matrix-override latest \ + --os-name-build-matrix-override ubuntu \ + --cmake-build-type-build-matrix-override RelWithDebInfo \ + --ubuntu-version-build-matrix-override focal \ + --fail-fast \ + -- build ci_PR_amd64 ci_PR_arm64v8 + +# Read the help for details +bash nabo_crawl_libnabo_build_matrix.bash --help +``` + +Note: To assess the state of the codebase, even for cases that are known the break the build, +execute `nabo_crawl_libnabo_build_matrix.bleeding.bash` with build +matrix `.env.build_matrix.libnabo.bleeding`. +The stable build matrix used for release is `.env.build_matrix.libnabo`. + +#### Build System Development + +```shell +cd /build_system/tests/ + +# To execute docker dryrun and configuration tests +bash run_all_docker_dryrun_and_config_tests.bash + +# To execute shell script tests +bash run_bats_core_test_in_n2st.bash + +# To spin a container in interactive mode with the codebase cloned but not compiled +cd ./tests_docker_interactive/ +bash build_and_run_IamBuildSystemTester.bash bash +``` + +#### Build System Notes + +- `nabo_crawl_dependencies_build_matrix.bash` execute the build matrix for the libnabo + dependencies. + It's not required to build them locally as they are pre-build by our TeamCity server periodically + push to dockerhub. + When executing `nabo_crawl_libnabo_build_matrix.bash`, the `libnabo-dependencies` + docker images are pull and used as base image for the `libnabo-[ci_PR_test|release]` + images. +- About `libnabo/.github/workflow/` vs `libnabo/build_system/` logic: Those are + separate build logic. + `.github/workflow/` was community contributed and as the responsibilities of building + python-binding and pushing packages. + For this reason, it run a one-dimension build matrix: multiple python version, single OS version, + single arch (x86) and + single compile flag which GitHub action computing resources can handle just fine. + +## Commit Messages + +This is optional for now but will eventually move our release workflow to semantic-versioning. +See [Commit Message References](commit_msg_reference.md) for details. + +## Note For Repository Admins + +### About Release Branch And Pull Request To Master Branch + +- Only repository admins have the privilege to `push/merge` on the default branch (ie: `master`) + and the `release` branch. +- Keep PR in `draft` mode until all the release reviewers are ready to push the release. +- Once a PR from `release` -> `master` branch is created (not in draft mode), + - it triggers the _build-system_ test + - (in-progress) and it triggers the _semantic release automation_ diff --git a/libnabo_dependencies_installer.bash b/libnabo_dependencies_installer.bash new file mode 100644 index 0000000..d447918 --- /dev/null +++ b/libnabo_dependencies_installer.bash @@ -0,0 +1,74 @@ +#!/bin/bash +# ================================================================================================= +# +# Install all libnabo dependencies +# +# Redirect the execution to libnabo-build-system library +# +# Usage: +# $ bash libnabo_dependencies_installer.bash [--test-run] +# +# ================================================================================================= +PARAMS="$@" + +MSG_DIMMED_FORMAT="\033[1;2m" +MSG_ERROR_FORMAT="\033[1;31m" +MSG_END_FORMAT="\033[0m" + +function nabo::install_libnabo_dependencise(){ + + # ....path resolution logic...................................................................... + NABO_ROOT="$(dirname "$(realpath "$0")")" + + cd "${NABO_ROOT}" || exit 1 + + # ....Load environment variables from file....................................................... + # . . Source NABO environment variables . . . . . . . . . . . . . . . . . . . . . . . . . . . .. + if [[ -f .env.libnabo ]]; then + set -o allexport && source .env.libnabo && set +o allexport + else + echo -e "${MSG_ERROR_FORMAT}[NABO ERROR]${MSG_END_FORMAT} .env.libnabo unreachable. Cwd $(pwd)" 1>&2 + exit 1 + fi + + # . . Source NBS dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + cd "${N2ST_PATH}" || exit 1 + source import_norlab_shell_script_tools_lib.bash + + # . . Source NABO-build-system environment variables . . . . . . . . . . . . . . . . . . . . . .. + cd "${NABO_BUILD_SYSTEM_PATH}" || exit 1 + if [[ -f .env ]]; then + set -o allexport && source .env && set +o allexport + else + echo -e "${MSG_ERROR_FORMAT}[NABO ERROR]${MSG_END_FORMAT} .env unreachable. Cwd $(pwd)" 1>&2 + exit 1 + fi + + + # ====Begin====================================================================================== + norlab_splash "${NBS_SPLASH_NAME}" "/~https://github.com/${NBS_REPOSITORY_DOMAIN:?err}/${NBS_REPOSITORY_NAME:?err}" + export SHOW_SPLASH_IDU=false + export SHOW_SPLASH_IDDU=false + + # ....Install general dependencies............................................................... + cd "${NABO_PATH:?err}"/build_system/ubuntu || exit 1 + # shellcheck disable=SC2086 + source nabo_install_dependencies_ubuntu.bash ${PARAMS[@]} + + # ....Install documentation related dependencies................................................. + cd "${NABO_PATH:?err}"/build_system/ubuntu || exit 1 + # shellcheck disable=SC2086 + source nabo_install_doc_dependencies_ubuntu.bash ${PARAMS[@]} + + print_msg_done "All Libnabo dependencies installed" +} + +# ::::Main::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +if [[ "${BASH_SOURCE[0]}" = "$0" ]]; then + # This script is being run, ie: __name__="__main__" + nabo::install_libnabo_dependencise +else + # This script is being sourced, ie: __name__="__source__" + echo -e "${MSG_ERROR_FORMAT}[NABO ERROR]${MSG_END_FORMAT} Execute this script in a subshell i.e.: $ bash libnabo_dependencies_installer.bash" 1>&2 + exit 1 +fi diff --git a/libnabo_installer.bash b/libnabo_installer.bash new file mode 100644 index 0000000..dfa4728 --- /dev/null +++ b/libnabo_installer.bash @@ -0,0 +1,85 @@ +#!/bin/bash +# ================================================================================================= +# +# Install libnabo +# +# Usage: +# $ bash libnabo_installer.bash [] +# +# Arguments: +# --install-path The directory where to install libnabo (absolute path) +# (default location defined in the .env) +# --repository-version 1.0.7 Install libnabo release tag version (default to master branch latest) +# --compile-test Compile the libnabo unit-test +# --generate-doc Generate the libnabo doxygen documentation +# in /usr/local/share/doc/libnabo/api/html/index.html +# --cmake-build-type RelWithDebInfo The type of cmake build: None Debug Release RelWithDebInfo MinSizeRel +# (default to RelWithDebInfo) +# --build-system-CI-install Set special configuration for CI/CD build system: +# skip the git clone install step and assume the repository is already +# pulled and checkout on the desired branch +# --test-run CI/CD build system Test-run mode +# -h, --help Get help +# +# Note: +# - this script required package: g++, make, cmake, build-essential, git and all libnabo dependencies +# - execute `libnabo_dependencies_installer.bash` first +# +# ================================================================================================= +PARAMS="$@" + +MSG_DIMMED_FORMAT="\033[1;2m" +MSG_ERROR_FORMAT="\033[1;31m" +MSG_END_FORMAT="\033[0m" + +function nabo::install_libnabo(){ + + # ....path resolution logic...................................................................... + NABO_ROOT="$(dirname "$(realpath "$0")")" + + cd "${NABO_ROOT}" || exit 1 + + # ....Load environment variables from file....................................................... + # . . Source NABO environment variables . . . . . . . . . . . . . . . . . . . . . . . . . . . .. + if [[ -f .env.libnabo ]]; then + set -o allexport && source .env.libnabo && set +o allexport + else + echo -e "${MSG_ERROR_FORMAT}[NABO ERROR]${MSG_END_FORMAT} .env.libnabo unreachable. Cwd $(pwd)" 1>&2 + exit 1 + fi + + # . . Source NBS dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + cd "${NBS_PATH}" || exit 1 + source import_norlab_build_system_lib.bash + + # . . Source NABO-build-system environment variables . . . . . . . . . . . . . . . . . . . . . .. + cd "${NABO_BUILD_SYSTEM_PATH}" || exit 1 + if [[ -f .env ]]; then + set -o allexport && source .env && set +o allexport + else + echo -e "${MSG_ERROR_FORMAT}[NABO ERROR]${MSG_END_FORMAT} .env unreachable. Cwd $(pwd)" 1>&2 + exit 1 + fi + + # ====Begin====================================================================================== + norlab_splash "${NBS_SPLASH_NAME}" "/~https://github.com/${NBS_REPOSITORY_DOMAIN:?err}/${NBS_REPOSITORY_NAME:?err}" + export SHOW_SPLASH_ILU=false + + # ....Install general dependencies............................................................... + cd "${NABO_PATH:?err}"/build_system/ubuntu || exit 1 + + # shellcheck disable=SC2068 + source nabo_install_libnabo_ubuntu.bash ${PARAMS[@]} + + print_msg_done "Libnabo install script completed. Have fun" +} + +# ::::Main::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +if [[ "${BASH_SOURCE[0]}" = "$0" ]]; then + # This script is being run, ie: __name__="__main__" + nabo::install_libnabo +else + # This script is being sourced, ie: __name__="__source__" + echo -e "${MSG_ERROR_FORMAT}[NABO ERROR]${MSG_END_FORMAT} Execute this script in a subshell i.e.: $ bash libnabo_installer.bash" 1>&2 + exit 1 +fi From ecfe4c6123310a0a96156be22fd74837bc26fc99 Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Mon, 8 Jan 2024 17:08:36 -0500 Subject: [PATCH 05/17] doc: clean pr comment [skip release] --- .github/pull_request_template.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index f352a90..7d99b7b 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -22,7 +22,6 @@ (Check [contributing/contributing_instructions.md](/~https://github.com/norlab-ulaval/libnabo/tree/develop/contributing/contributing_instructions.md) for local testing procedure using _libnabo-build-system_) -[//]: # ( TODO: NMO-466 docs: write contributiong section in readme or add contributing.md) ### PR creation related From 1dbfc5080443d9f6691783129035577831276ef3 Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Mon, 8 Jan 2024 17:51:50 -0500 Subject: [PATCH 06/17] build: update repo version format --- build_system/.env.build_matrix.dependencies | 2 +- build_system/ubuntu/nabo_install_libnabo_ubuntu.bash | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build_system/.env.build_matrix.dependencies b/build_system/.env.build_matrix.dependencies index 90f4fd4..53179ce 100644 --- a/build_system/.env.build_matrix.dependencies +++ b/build_system/.env.build_matrix.dependencies @@ -11,7 +11,7 @@ NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.dependencies.yaml # Libnabo version # # 'latest' is the latest push to the libnabo master branch -#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' 'v2.0.test' ) +#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' ) NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) # diff --git a/build_system/ubuntu/nabo_install_libnabo_ubuntu.bash b/build_system/ubuntu/nabo_install_libnabo_ubuntu.bash index 75da3d9..1777186 100644 --- a/build_system/ubuntu/nabo_install_libnabo_ubuntu.bash +++ b/build_system/ubuntu/nabo_install_libnabo_ubuntu.bash @@ -194,7 +194,8 @@ if [[ ${BUILD_SYSTEM_CI_INSTALL} == FALSE ]]; then git tag --list # Remove prefix 'v' from version tag - GITHUB_TAG="${REPOSITORY_VERSION/v/}" +# GITHUB_TAG="${REPOSITORY_VERSION/v/}" + GITHUB_TAG="${REPOSITORY_VERSION}" git checkout tags/"${GITHUB_TAG}" From 0d59fb645b851d23a30e205ca9c31c35c5663dde Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Mon, 8 Jan 2024 17:52:20 -0500 Subject: [PATCH 07/17] doc(readme): update header --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d9c00c6..9ce4437 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@
+[//]: # ( ==== Description =========================================== ) +**libnabo is a fast K Nearest Neighbour library for low-dimensional spaces.
+It provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates.** +
+
+ [//]: # (====GitHub badges========================================================================) GitHub Repo stars @@ -11,22 +17,15 @@
-[//]: # ( ==== Description =========================================== ) -**libnabo is a fast K Nearest Neighbour library for low-dimensional spaces.
-It provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates.** -
-Its current CPU implementation is strongly inspired by [ANN], but with more compact data types.
-On the average, libnabo is 5% to 20% faster than [ANN]. -
-
- +Its current CPU implementation is strongly inspired by [ANN], but with more compact data types. +On the average, libnabo is 5% to 20% faster than [ANN]. libnabo depends on [Eigen], a modern C++ matrix and linear-algebra library. libnabo works with either version 2 or 3 of Eigen. libnabo also optionally depends on [Boost], a C++ general library, for Python bindings. -libnabo was developed by [Stéphane Magnenat](http://stephane.magnenat.net) as part of his work at [ASL-ETH](http://www.asl.ethz.ch) and is now maintained by [Simon Lynen](/~https://github.com/simonlynen). +libnabo was developed by [Stéphane Magnenat](http://stephane.magnenat.net) as part of his work at [ASL-ETH](http://www.asl.ethz.ch) and is now maintained by [NorLab](/~https://github.com/norlab-ulaval). If you are interested in a pure-[Rust](https://www.rust-lang.org/) version, check [that repository](/~https://github.com/enlightware/nabo-rs) out. From 0417ceadd5ec7eceb780c72bdb74946714c30a3b Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Mon, 8 Jan 2024 19:19:23 -0500 Subject: [PATCH 08/17] build: add release crawler script and .env file --- build_system/.env.build_matrix.dependencies | 2 +- build_system/.env.build_matrix.libnabo | 2 +- .../.env.build_matrix.libnabo.bleeding | 1 - .../.env.build_matrix.libnabo.release | 39 ++++++++++++++++++ ...bo_crawl_libnabo_build_matrix.release.bash | 40 +++++++++++++++++++ 5 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 build_system/.env.build_matrix.libnabo.release create mode 100644 build_system/nabo_crawl_libnabo_build_matrix.release.bash diff --git a/build_system/.env.build_matrix.dependencies b/build_system/.env.build_matrix.dependencies index 53179ce..e11f111 100644 --- a/build_system/.env.build_matrix.dependencies +++ b/build_system/.env.build_matrix.dependencies @@ -11,7 +11,7 @@ NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.dependencies.yaml # Libnabo version # # 'latest' is the latest push to the libnabo master branch -#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' ) +#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.1.0' 'latest' ) NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) # diff --git a/build_system/.env.build_matrix.libnabo b/build_system/.env.build_matrix.libnabo index 9d3366b..37187ab 100644 --- a/build_system/.env.build_matrix.libnabo +++ b/build_system/.env.build_matrix.libnabo @@ -11,7 +11,7 @@ NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.libnabo.yaml # Libnabo version # # 'latest' is the latest push to the libnabo master branch -#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' ) +#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.1.0' 'latest' ) NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) # diff --git a/build_system/.env.build_matrix.libnabo.bleeding b/build_system/.env.build_matrix.libnabo.bleeding index 1f24c4e..b157ec6 100644 --- a/build_system/.env.build_matrix.libnabo.bleeding +++ b/build_system/.env.build_matrix.libnabo.bleeding @@ -11,7 +11,6 @@ NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.libnabo.yaml # Libnabo version # # 'latest' is the latest push to the libnabo master branch -#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.0.7' 'latest' ) NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) # diff --git a/build_system/.env.build_matrix.libnabo.release b/build_system/.env.build_matrix.libnabo.release new file mode 100644 index 0000000..9df57cc --- /dev/null +++ b/build_system/.env.build_matrix.libnabo.release @@ -0,0 +1,39 @@ +# +# Build matrix variables +# + +# +# The compose file on which the build matrix will be crawled +# +NBS_EXECUTE_BUILD_MATRIX_OVER_COMPOSE_FILE=docker-compose.libnabo.yaml + +# +# Libnabo version +# +# 'latest' is the latest push to the libnabo master branch +#NBS_MATRIX_REPOSITORY_VERSIONS=( '1.1.0' 'latest' ) +NBS_MATRIX_REPOSITORY_VERSIONS=( 'latest' ) + +# +# Libnabo CMAKE_BUILD_TYPE +# +NBS_MATRIX_CMAKE_BUILD_TYPE=( 'Release' ) + +# +# Libnabo supported OS +# +# ToDo: implement OsX support for arm64-Darwin (ref task NMO-213) +#NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' 'l4t' 'osx' ) +NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' ) + +# +# ubuntu supported versions +# +# Ubuntu release: https://ubuntu.com/about/release-cycle +# bionic=18.04 focal=20.04 jammy=22.04 +NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' 'jammy' ) +# +# iceboxed: implement other OS support (ref task NMO-213 OsX arm64-Darwin and NMO-210 OsX x86 CD components) +#NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( 'monterey' 'ventura' ) +NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( ) + diff --git a/build_system/nabo_crawl_libnabo_build_matrix.release.bash b/build_system/nabo_crawl_libnabo_build_matrix.release.bash new file mode 100644 index 0000000..ce2288e --- /dev/null +++ b/build_system/nabo_crawl_libnabo_build_matrix.release.bash @@ -0,0 +1,40 @@ +#!/bin/bash +# ================================================================================================= +# +# Execute build matrix specified in .env.build_matrix.libnabo +# +# Redirect the execution to 'nbs_execute_compose_over_build_matrix.bash' from the norlab-build-system library +# +# Usage: +# $ bash nabo_crawl_libnabo_build_matrix.bash [] [-- ] +# +# $ bash nabo_crawl_libnabo_build_matrix.bash -- build --dry-run +# +# Run script with the '--help' flag for details +# +# ================================================================================================= +PARAMS="${@:-"--fail-fast -- build --push release"}" + +# ....path resolution logic........................................................................ +NABO_ROOT="$(dirname "$(realpath "$0")")/.." +NABO_BUILD_SYSTEM_PATH="${NABO_ROOT}/build_system" +NBS_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-build-system" +N2ST_PATH="${NABO_BUILD_SYSTEM_PATH}/utilities/norlab-shell-script-tools" + +# ....Load environment variables from file......................................................... +cd "${NABO_BUILD_SYSTEM_PATH}" || exit 1 +set -o allexport && source .env && set +o allexport + +# ....Source NBS dependencies...................................................................... +cd "${NBS_PATH}" || exit 1 +source import_norlab_build_system_lib.bash + +# ====begin======================================================================================== +cd "${NBS_PATH}/src/utility_scripts" || exit 1 + +DOTENV_BUILD_MATRIX_REALPATH=${NABO_BUILD_SYSTEM_PATH}/.env.build_matrix.libnabo.release + +# Note: do not double quote PARAMS or threat it as a array otherwise it will cause error +# shellcheck disable=SC2086 +source nbs_execute_compose_over_build_matrix.bash "${DOTENV_BUILD_MATRIX_REALPATH}" $PARAMS + From 127166d35f9fc20525938b424f68e8194d883eaf Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Mon, 8 Jan 2024 19:33:45 -0500 Subject: [PATCH 09/17] test: add release crawler script bats test --- ...bo_crawl_libnabo_build_matrix.release.bats | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.release.bats diff --git a/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.release.bats b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.release.bats new file mode 100644 index 0000000..e71b3e3 --- /dev/null +++ b/build_system/tests/tests_bats/tests_crawler/test_nabo_crawl_libnabo_build_matrix.release.bats @@ -0,0 +1,96 @@ +#!/usr/bin/env bats +# +# Usage in docker container +# $ REPO_ROOT=$(pwd) && RUN_TESTS_IN_DIR='tests' +# $ docker run -it --rm -v "$REPO_ROOT:/code" bats/bats:latest "$RUN_TESTS_IN_DIR" +# +# Note: "/code" is the working directory in the bats official image +# +# bats-core ref: +# - https://bats-core.readthedocs.io/en/stable/tutorial.html +# - https://bats-core.readthedocs.io/en/stable/writing-tests.html +# - https://opensource.com/article/19/2/testing-bash-bats +# ↳ /~https://github.com/dmlond/how_to_bats/blob/master/test/build.bats +# +# Helper library: +# - /~https://github.com/bats-core/bats-assert +# - /~https://github.com/bats-core/bats-support +# - /~https://github.com/bats-core/bats-file +# + +BATS_HELPER_PATH=/usr/lib/bats +if [[ -d ${BATS_HELPER_PATH} ]]; then + load "${BATS_HELPER_PATH}/bats-support/load" + load "${BATS_HELPER_PATH}/bats-assert/load" + load "${BATS_HELPER_PATH}/bats-file/load" + load "${SRC_CODE_PATH}/${N2ST_BATS_TESTING_TOOLS_RELATIVE_PATH}/bats_helper_functions" + load "${SRC_CODE_PATH}/build_system/tests/tests_bats/bats_helper_functions" + #load "${BATS_HELPER_PATH}/bats-detik/load" # << Kubernetes support +else + echo -e "\n[\033[1;31mERROR\033[0m] $0 path to bats-core helper library unreachable at \"${BATS_HELPER_PATH}\"!" 1>&2 + echo '(press any key to exit)' + read -r -n 1 + exit 1 +fi + +# ====Setup======================================================================================== + +TESTED_FILE="nabo_crawl_libnabo_build_matrix.release.bash" +TESTED_FILE_PATH="./build_system/" +COMPOSE_FILE="docker-compose.libnabo.yaml" +DOTENV_BUILD_MATRIX="${SRC_CODE_PATH}"/build_system/.env.build_matrix.libnabo.release +DOTENV_BUILD_MATRIX_NAME=$( basename "${DOTENV_BUILD_MATRIX}" ) + +# executed once before starting the first test (valide for all test in that file) +setup_file() { + BATS_DOCKER_WORKDIR=$(pwd) && export BATS_DOCKER_WORKDIR + + ## Uncomment the following for debug, the ">&3" is for printing bats msg to stdin +# pwd >&3 && tree -L 1 -a -hug >&3 +# printenv >&3 +} + +# executed before each test +setup() { + cd "$TESTED_FILE_PATH" || exit 1 +} + +# ====Teardown===================================================================================== + +# executed after each test +teardown() { + bats_print_run_env_variable_on_error +} + +## executed once after finishing the last test (valide for all test in that file) +#teardown_file() { +#} + +# ====Test casses================================================================================== + + +@test "${TESTED_FILE} › docker image › execute ok › expect pass" { + + run bash "${TESTED_FILE}" "${DOTENV_BUILD_MATRIX}" --fail-fast -- build --push --dry-run release + + assert_success + assert_output --regexp .*"Starting".*"${TESTED_FILE}".*"\[NBS\]".*"Build images specified in".*"'${COMPOSE_FILE}'".*"following".*"${DOTENV_BUILD_MATRIX_NAME}" + assert_output --regexp "Status of tag crawled:".*"Pass".*"› latest".*"Completed".*"${TESTED_FILE}".* +} + + +# ....Test --help flag related logic............................................................... + +@test "${TESTED_FILE} › --help as first argument › execute ok › expect pass" { + run bash "${TESTED_FILE}" --help + test_generic_help_flag_logic +} + +@test "${TESTED_FILE} › second arg: --help › execute ok › expect pass" { + run bash "${TESTED_FILE}" --fail-fast --help + test_generic_help_flag_logic +} + +# ToDo: implement >> test for IS_TEAMCITY_RUN==true casses +# (NICE TO HAVE) ToDo: implement >> test for python intsall casses with regard to distribution + From b8a65ca132aa33344b293e2e0df62aea76c71e40 Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Mon, 8 Jan 2024 20:08:31 -0500 Subject: [PATCH 10/17] doc(readme): add norlab logo to header and improve intro --- README.md | 45 ++++++++++++++++++++++------ visual/norlab_logo_acronym_dark.png | Bin 0 -> 28464 bytes 2 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 visual/norlab_logo_acronym_dark.png diff --git a/README.md b/README.md index 9ce4437..3c2d0cd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,32 @@ +[//]: # ( ==== Logo ================================================== )
+
+
+ + + +
+ +[//]: # ( ==== Title ================================================= ) + +# _libnabo_ + +
+ +[//]: # ( ==== Hyperlink ============================================= ) +
+

+ +NorLab TeamCity GUI +(VPN/intranet access)   •   +norlabulaval +(Docker Hub)   + + +

[//]: # ( ==== Description =========================================== ) -**libnabo is a fast K Nearest Neighbour library for low-dimensional spaces.
-It provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates.** +**libnabo is a fast K Nearest Neighbour library for low-dimensional spaces.**

@@ -15,17 +39,20 @@ It provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templ

+
+libnabo provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates. +Its current CPU implementation is strongly inspired by [ANN], but with more compact data types. On the average, libnabo is 5% to 20% faster than [ANN]. +**Dependencies:** +- libnabo depends on [Eigen], a modern C++ matrix and linear-algebra library. +- libnabo works with either version 2 or 3 of Eigen. +- libnabo also optionally depends on [Boost], a C++ general library, for Python bindings. - -Its current CPU implementation is strongly inspired by [ANN], but with more compact data types. -On the average, libnabo is 5% to 20% faster than [ANN]. -libnabo depends on [Eigen], a modern C++ matrix and linear-algebra library. -libnabo works with either version 2 or 3 of Eigen. -libnabo also optionally depends on [Boost], a C++ general library, for Python bindings. +**Credit:** +- libnabo was developed by [Stéphane Magnenat](http://stephane.magnenat.net) as part of his work at [ASL-ETH](http://www.asl.ethz.ch) +- libnabo is now maintained by [NorLab](/~https://github.com/norlab-ulaval) -libnabo was developed by [Stéphane Magnenat](http://stephane.magnenat.net) as part of his work at [ASL-ETH](http://www.asl.ethz.ch) and is now maintained by [NorLab](/~https://github.com/norlab-ulaval). If you are interested in a pure-[Rust](https://www.rust-lang.org/) version, check [that repository](/~https://github.com/enlightware/nabo-rs) out. diff --git a/visual/norlab_logo_acronym_dark.png b/visual/norlab_logo_acronym_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a60a74603460bb64c19d99300171454bd2f049ac GIT binary patch literal 28464 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 Date: Tue, 9 Jan 2024 11:05:36 -0500 Subject: [PATCH 11/17] doc(pull_request_template.md): fix typo --- .github/pull_request_template.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7d99b7b..1d7307a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -19,8 +19,7 @@ - [ ] I have commented hard-to-understand code - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] All tests pass locally with my changes - (Check [contributing/contributing_instructions.md](/~https://github.com/norlab-ulaval/libnabo/tree/develop/contributing/contributing_instructions.md) - for local testing procedure using _libnabo-build-system_) + (Check [contributing/contributing_instructions.md](/~https://github.com/norlab-ulaval/libnabo/tree/develop/contributing/contributing_instructions.md) for local testing procedure using _libnabo-build-system_) ### PR creation related @@ -35,7 +34,6 @@ - [ ] I have included a quick summary of the changes - [ ] I have indicated the related issue's id with `# ` if changes are of type `fix` - [ ] I have included a high-level list of changes and their corresponding types - (See [contributing/commit_msg_reference.md](/~https://github.com/norlab-ulaval/libnabo/blob/develop/contributing/commit_msg_reference.md) - for details) + (See [contributing/commit_msg_reference.md](/~https://github.com/norlab-ulaval/libnabo/blob/develop/contributing/commit_msg_reference.md) for details) --- From fffbbf0949e015e86dd9baeaffb6c2649eb5f09c Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Tue, 9 Jan 2024 18:02:25 -0500 Subject: [PATCH 12/17] doc: update header with dynamic logo, fix hyperlink, add dockerhub badge and fix relative link --- .github/CODEOWNERS | 1 + .github/pull_request_template.md | 4 ++-- README.md | 25 ++++++++++++++++--------- build_system/README.md | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5562c9d..b843f29 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -21,6 +21,7 @@ /nabo @boxanm @simonpierredeschenes /python @boxanm @simonpierredeschenes /tests @boxanm @simonpierredeschenes +/contributing @RedLeader962 # ....User install tools........................................................................... /.env.libnabo @RedLeader962 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 1d7307a..f62a0c8 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -19,7 +19,7 @@ - [ ] I have commented hard-to-understand code - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] All tests pass locally with my changes - (Check [contributing/contributing_instructions.md](/~https://github.com/norlab-ulaval/libnabo/tree/develop/contributing/contributing_instructions.md) for local testing procedure using _libnabo-build-system_) + (Check [contributing/contributing_instructions.md](/contributing/contributing_instructions.md) for local testing procedure using _libnabo-build-system_) ### PR creation related @@ -34,6 +34,6 @@ - [ ] I have included a quick summary of the changes - [ ] I have indicated the related issue's id with `# ` if changes are of type `fix` - [ ] I have included a high-level list of changes and their corresponding types - (See [contributing/commit_msg_reference.md](/~https://github.com/norlab-ulaval/libnabo/blob/develop/contributing/commit_msg_reference.md) for details) + (See [contributing/commit_msg_reference.md](/contributing/commit_msg_reference.md) for details) --- diff --git a/README.md b/README.md index 3c2d0cd..ad9ab54 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,32 @@ -[//]: # ( ==== Logo ================================================== )
+ +[//]: # ( ==== Logo ================================================== )

- + + + + Shows an the dark NorLab logo in light mode and light NorLab logo in dark mode. +
+
[//]: # ( ==== Title ================================================= ) # _libnabo_ -
[//]: # ( ==== Hyperlink ============================================= ) -
-

-NorLab TeamCity GUI +NorLab TeamCity GUI (VPN/intranet access)   •   norlabulaval (Docker Hub)   - -

+
+
[//]: # ( ==== Description =========================================== ) **libnabo is a fast K Nearest Neighbour library for low-dimensional spaces.** @@ -36,11 +39,15 @@ GitHub forks GitHub License GitHub release (with filter) -
+ + Docker Image Version (latest semver)
+
+
+ libnabo provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates. Its current CPU implementation is strongly inspired by [ANN], but with more compact data types. On the average, libnabo is 5% to 20% faster than [ANN]. diff --git a/build_system/README.md b/build_system/README.md index 64af5cb..aab8334 100644 --- a/build_system/README.md +++ b/build_system/README.md @@ -1 +1 @@ -See [contributing/contributing_instructions.md](/~https://github.com/norlab-ulaval/libnabo/tree/develop/contributing/contributing_instructions.md) for instructions related to bug reporting, code contribution and for setting up the `libnabo-build-system` on your workstation to speed up your local development workflow. +See [contributing/contributing_instructions.md](/contributing/contributing_instructions.md) for instructions related to bug reporting, code contribution and for setting up the `libnabo-build-system` on your workstation to speed up your local development workflow. From 8466194576f04ddc1ff363b5b4bad3773f98986d Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Tue, 9 Jan 2024 18:05:23 -0500 Subject: [PATCH 13/17] doc: add missing norlab light logo --- visual/norlab_logo_acronym_light.png | Bin 0 -> 33780 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 visual/norlab_logo_acronym_light.png diff --git a/visual/norlab_logo_acronym_light.png b/visual/norlab_logo_acronym_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a102f8951956d27f515b08b873a92aa3749c64a5 GIT binary patch literal 33780 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 p|NV07_W%3y|8CF! Date: Tue, 9 Jan 2024 19:45:03 -0500 Subject: [PATCH 14/17] doc: add missing norlab light logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad9ab54..d7bbf7f 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ GitHub release (with filter)
- Docker Image Version (latest semver) + Docker Image Version (latest semver)


From 81171695e640ce71e6766e49bf3c7a79ae544a0e Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Tue, 9 Jan 2024 20:54:33 -0500 Subject: [PATCH 15/17] ci: drop ubuntu jammy from build matrix --- build_system/.env.build_matrix.libnabo | 2 +- build_system/.env.build_matrix.libnabo.release | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build_system/.env.build_matrix.libnabo b/build_system/.env.build_matrix.libnabo index 37187ab..e2236b1 100644 --- a/build_system/.env.build_matrix.libnabo +++ b/build_system/.env.build_matrix.libnabo @@ -32,7 +32,7 @@ NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' ) # # Ubuntu release: https://ubuntu.com/about/release-cycle # bionic=18.04 focal=20.04 jammy=22.04 -NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' 'jammy' ) +NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' ) # # iceboxed: implement other OS support (ref task NMO-213 OsX arm64-Darwin and NMO-210 OsX x86 CD components) #NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( 'monterey' 'ventura' ) diff --git a/build_system/.env.build_matrix.libnabo.release b/build_system/.env.build_matrix.libnabo.release index 9df57cc..7af69d0 100644 --- a/build_system/.env.build_matrix.libnabo.release +++ b/build_system/.env.build_matrix.libnabo.release @@ -31,7 +31,7 @@ NBS_MATRIX_SUPPORTED_OS=( 'ubuntu' ) # # Ubuntu release: https://ubuntu.com/about/release-cycle # bionic=18.04 focal=20.04 jammy=22.04 -NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' 'jammy' ) +NBS_MATRIX_UBUNTU_SUPPORTED_VERSIONS=( 'bionic' 'focal' ) # # iceboxed: implement other OS support (ref task NMO-213 OsX arm64-Darwin and NMO-210 OsX x86 CD components) #NBS_MATRIX_OSX_SUPPORTED_VERSIONS=( 'monterey' 'ventura' ) From 26d760e7372381f807f186b33c62e460f8738fa9 Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Tue, 9 Jan 2024 21:29:56 -0500 Subject: [PATCH 16/17] doc(readme): mute ubuntu jammy from supported OS version until libpointmatcher build pass on jammy [skip CI] --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d7bbf7f..f01aec0 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,9 @@ If you are interested in a pure-[Rust](https://www.rust-lang.org/) version, chec libnabo is tested on our build system under the following architecture and OS: - x86 and arm64/v8 -- Ubuntu bionic (18.04) focal (20.04) and jammy (22.04) +- Ubuntu bionic (18.04) and focal (20.04) + +[//]: # (- jammy (22.04)) Note: From 652d010729f10c9cf86f3076985e405abed6f5c3 Mon Sep 17 00:00:00 2001 From: RedLeaderOne Date: Wed, 10 Jan 2024 16:05:30 -0500 Subject: [PATCH 17/17] style: renamed `.*test_compilation.*` services and target to `.*integration_test.*` for clarity. --- README.md | 3 +-- ...uild test_compilation__ (Release).run.xml" | 6 ++--- ...efixed_path (BUILD MATRIX SUBSET).run.xml" | 6 ++--- build_system/docker-compose.libnabo.yaml | 24 +++++++++---------- ...tmatcher.bats => test_dotenv_libnabo.bats} | 0 ...st => Dockerfile.libnabo.integration_test} | 4 ++-- 6 files changed, 21 insertions(+), 22 deletions(-) rename build_system/tests/tests_bats/{test_dotenv_libpointmatcher.bats => test_dotenv_libnabo.bats} (100%) rename build_system/ubuntu/{Dockerfile.libnabo.compilation_test => Dockerfile.libnabo.integration_test} (96%) diff --git a/README.md b/README.md index f01aec0..8dc9356 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ [//]: # ( ==== Hyperlink ============================================= ) NorLab TeamCity GUI -(VPN/intranet access)   •   +(VPN/intranet access)   •   norlabulaval (Docker Hub)   @@ -39,7 +39,6 @@ GitHub forks GitHub License GitHub release (with filter) -
Docker Image Version (latest semver)
diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" index 2ab8e6f..4f51d20 100644 --- "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation__ (Release).run.xml" @@ -1,6 +1,6 @@ - - + \ No newline at end of file diff --git "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" index a0bec81..ff75047 100644 --- "a/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" +++ "b/build_system/.jetbrains_run_config/bash nabo_crawl_libnabo_build_matrix.bash \342\200\272 build test_compilation_prefixed_path (BUILD MATRIX SUBSET).run.xml" @@ -1,6 +1,6 @@ - - + \ No newline at end of file diff --git a/build_system/docker-compose.libnabo.yaml b/build_system/docker-compose.libnabo.yaml index 463a075..5c953a2 100644 --- a/build_system/docker-compose.libnabo.yaml +++ b/build_system/docker-compose.libnabo.yaml @@ -5,14 +5,14 @@ services: # ====Pull-request related services============================================================== # ....Test logic related to libnabo install casses............................................... - _test_compilation: - image: ${NBS_DOCKERHUB_NAMESPACE:?err}/libnabo-compilation-test:${NBS_IMAGE_TAG:?err} + _integration_test: + image: ${NBS_DOCKERHUB_NAMESPACE:?err}/libnabo-integration-test:${NBS_IMAGE_TAG:?err} pull_policy: build build: context: .. - dockerfile: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR:?err}/ubuntu/Dockerfile.libnabo.compilation_test + dockerfile: ${NBS_SUPERPROJECT_BUILD_SYSTEM_DIR:?err}/ubuntu/Dockerfile.libnabo.integration_test no_cache: true - target: test-compilation-auto-path-resolution + target: integration-test-compile-auto-path-resolution ## Mute 'platforms' while using arch virtualization with C++ build to prevent segmentation fault during nabo cmake install # platforms: # - "linux/amd64" @@ -30,18 +30,18 @@ services: init: true # Propagate exit code (See remark in task NMO-266) depends_on: - dependencies - test_compilation_prefixed_path: - extends: _test_compilation + integration_test_prefixed_path: + extends: _integration_test build: - target: test-compilation-prefixed-path + target: integration-test-compile-prefixed-path depends_on: - - _test_compilation - test_compilation_auto_path_resolution: - extends: _test_compilation + - _integration_test + integration_test_auto_path_resolution: + extends: _integration_test build: - target: test-compilation-auto-path-resolution + target: integration-test-compile-auto-path-resolution depends_on: - - _test_compilation + - _integration_test # ....Test logic related to libnabo codebase unit-test........................................... ci_PR: diff --git a/build_system/tests/tests_bats/test_dotenv_libpointmatcher.bats b/build_system/tests/tests_bats/test_dotenv_libnabo.bats similarity index 100% rename from build_system/tests/tests_bats/test_dotenv_libpointmatcher.bats rename to build_system/tests/tests_bats/test_dotenv_libnabo.bats diff --git a/build_system/ubuntu/Dockerfile.libnabo.compilation_test b/build_system/ubuntu/Dockerfile.libnabo.integration_test similarity index 96% rename from build_system/ubuntu/Dockerfile.libnabo.compilation_test rename to build_system/ubuntu/Dockerfile.libnabo.integration_test index 318c10a..b80d783 100644 --- a/build_system/ubuntu/Dockerfile.libnabo.compilation_test +++ b/build_system/ubuntu/Dockerfile.libnabo.integration_test @@ -47,7 +47,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* # ====Test compilation with automatic path resolution============================================== -FROM libnabo-dependencies AS test-compilation-auto-path-resolution +FROM libnabo-dependencies AS integration-test-compile-auto-path-resolution #RUN echo && echo ">> nproc=$(nproc)" && echo # ToDo: on task end >> mute this line @@ -74,7 +74,7 @@ CMD [ "bash" ] # (Priority) ToDo: implement >> test casse with 'SHARED_LIBS' cmake flag -FROM libnabo-dependencies AS test-compilation-prefixed-path +FROM libnabo-dependencies AS integration-test-compile-prefixed-path #RUN echo && echo ">> nproc=$(nproc)" && echo # ToDo: on task end >> mute this line