diff --git a/.gitlab-ci.common.yml b/.gitlab-ci.common.yml deleted file mode 100644 index dc9eb857930b5f76fa1693ecb49222ee720213a8..0000000000000000000000000000000000000000 --- a/.gitlab-ci.common.yml +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (C) ASTRON (Netherlands Institute for Radio Astronomy) -# SPDX-License-Identifier: Apache-2.0 - -workflow: - rules: - # Don't create for merge request pipelines, prevents detached pipeline - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - when: never - - when: always - -# Set to 1 to force a rebuild of the Docker image -variables: - BUILD_DOCKER_IMAGE: "0" - APPLICATION_LAST_RELEASE: "0.0.0" - -stages: - - versioning - - prepare - - linting - - build - - test - - pages - - deploy - -# This step determines the SHA1 of the Docker file used. It's stored in -# versions.env artifact. The environment variables are available for all steps -# depending on this step. -versioning: - stage: versioning - image: bitnami/git - script: - - echo BASE_IMAGE=${CI_REGISTRY_IMAGE}/base:$(git log -n 1 --pretty=format:%H -- ci/ubuntu_22_04-base) > versions.env - - cat versions.env - artifacts: - reports: - dotenv: versions.env - -# Builds the Docker image containing the dependencies of the application. -# This image is cached, as long as the Dockerfile isn't modified new jobs reuse -# this image. -build-docker-ubuntu-22.04: - stage: prepare - needs: ["versioning"] - image: docker:latest - before_script: - - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY - script: - - | - if ! docker manifest inspect $BASE_IMAGE > /dev/null || [ "$BUILD_DOCKER_IMAGE" = "1" ]; then - docker build --tag $BASE_IMAGE -f ci/ubuntu_22_04-base . - docker push $BASE_IMAGE - fi diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 32fd692ada99c2efe2cb966b5b0e0f1ec3138960..92f60b2c2497845fdf8f098e4ef8508352b86f3a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,133 +1,27 @@ -# Copyright (C) ASTRON (Netherlands Institute for Radio Astronomy) -# SPDX-License-Identifier: Apache-2.0 - include: - - .gitlab-ci.common.yml - - template: Security/SAST.gitlab-ci.yml - - template: Security/Dependency-Scanning.gitlab-ci.yml - - template: Security/Secret-Detection.gitlab-ci.yml - -format: - stage: linting - needs: ["versioning", "build-docker-ubuntu-22.04"] - image: $BASE_IMAGE - script: - - scripts/format-cpp.sh - - scripts/format-cmake.sh - - git diff > format.patch - # Fail when the patch is not empy (note ! can't be used directly.) - - (! grep -q '^--- a' format.patch) - artifacts: - when: on_failure - paths: - - format.patch - -tidy: - stage: linting - needs: ["versioning", "build-docker-ubuntu-22.04"] - image: $BASE_IMAGE - script: - - mkdir build - - cd build - - cmake -DCMAKE_CXX_CLANG_TIDY=clang-tidy -G Ninja .. - - ninja - -sast: - variables: - SAST_EXCLUDED_ANALYZERS: brakeman, kubesec, nodejs-scan, phpcs-security-audit, - pmd-apex, sobelow, spotbugs - stage: test +- local: "{{cookiecutter.project_slug}}/.gitlab-ci.yml" -dependency_scanning: - # override default before_script, job won't have Python available - before_script: - - uname +trigger_prepare: + stage: prepare + trigger: + strategy: depend + include: "{{cookiecutter.project_slug}}/.prepare.gitlab-ci.yml" -secret_detection: - # override default before_script, job won't have Python available +default: + # Bootstrap Cookiecutter template to test provided ci pipeline template before_script: - - uname + - cookiecutter --no-input --overwrite-if-exists --output-dir . . + - cd my_awesome_app + - git init -test: - stage: test - needs: ["versioning", "build-docker-ubuntu-22.04"] - image: $BASE_IMAGE - script: - - mkdir build - - cd build - - cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DCMAKE_CXX_FLAGS="-coverage" -DCMAKE_EXE_LINKER_FLAGS="-coverage" -G Ninja .. - - ninja - - ctest --output-on-failure |& tee ctest.out - - mkdir coverage - - gcovr -r .. -e ../test/ -e ../src/main.cpp --txt --xml coverage.xml --html-details coverage/coverage.html - - tar cfz coverage.tar.gz coverage/ +# Override artifact path +versioning: artifacts: - paths: - # This will give a warning which is ok - - build/test/unittests.xml - - build/coverage.tar.gz reports: - junit: build/test/unittests.xml - coverage_report: - coverage_format: cobertura - path: build/coverage.xml - -# See https://git.astron.nl/templates/cpp-project/-/wikis/ABI%20checker -abi-test: - stage: test - needs: ["versioning", "build-docker-ubuntu-22.04"] - image: $BASE_IMAGE - script: - # The syntax is described at https://docs.gitlab.com/ee/user/packages/generic_packages/index.html - - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ABI/${APPLICATION_LAST_RELEASE}/abi.dump" -o abi.dump' - - cmake --version - - mkdir build && cd build - - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Og -gdwarf-3" -GNinja .. - - ninja - - cd .. - - abi-dumper build/src/lib/libhello.so -o master.dump -lver master - # ABI failures are not only intended to be informative - - abi-compliance-checker -l hello -old abi.dump -new master.dump || true - artifacts: - paths: - - compat_reports/hello/${APPLICATION_LAST_RELEASE}_to_master + dotenv: my_awesome_app/versions.env -build: - stage: build - needs: ["versioning", "build-docker-ubuntu-22.04"] - image: $BASE_IMAGE - script: - - mkdir build - - cd build - - cmake -DCMAKE_BUILD_TYPE=Release -G Ninja .. - - ninja - -pages: - stage: pages - needs: ["versioning", "test"] - image: $BASE_IMAGE - script: - # Generate documentation. - - cd build - - cmake -DBUILD_DOCUMENTATION=ON -G Ninja .. - - ninja sphinx - # Extract HTML coverage report. - - tar xfz coverage.tar.gz - # TODO: Add an index page with links to the documentation and coverage. +# Override semgrep-sast before script +sast: + before_script: + - python --version # For debugging -abi-deploy: - stage: deploy - needs: ["versioning", "build-docker-ubuntu-22.04"] - image: $BASE_IMAGE - environment: production - script: - - cmake --version - - mkdir build && cd build - - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Og -gdwarf-3" -GNinja .. - - ninja - - cd .. - - abi-dumper build/src/lib/libhello.so -o ${APPLICATION_LAST_RELEASE}.dump -lver ${APPLICATION_LAST_RELEASE} - # The syntax is described at https://docs.gitlab.com/ee/user/packages/generic_packages/index.html - - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${APPLICATION_LAST_RELEASE}.dump "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ABI/${APPLICATION_LAST_RELEASE}/abi.dump"' - rules: - - when: manual diff --git a/README.md b/README.md index 1015fe43378a4cfe682b16f797e84b461080e39f..4ca5706d6538a159d9333c68b054baae61542c01 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,26 @@ -# C++ project +# Example Python Package -An example repository of an CI/CD pipeline for building, testing and deploying a C++ project. + + -## Description +An example repository of an CI/CD pipeline for building, testing and publishing a python package. -The repository can be used as a basis for new projects using C++ within ASTRON. -The code is intended to be copied in a new repository and used as basis for the -new project. After copying the code needs to be adjusted for the specific -project. The template offers: +If you find some missing functionality with regards to CI/CD, testing, linting or something else, feel free to make a merge request with the proposed changes. -- CI jobs for building, testing, and generating documentation +## How to apply this template - - A basic Docker file to be used in the CI - - A CMake project skeleton - - A Doxygen and Sphinx skeleton for documentation, combined with Breathe - - Formatting scripts for the code +This templates uses `cookiecutter` which can be -Note: The project is intended to be used for C++ projects without Fortran code. -At the moment of writing there is no Fortran support for Ninja. This means the -project needs to be changed to use `make`. +```bash +pip install --user cookiecutter +``` -## Getting started +Then you can create an instance of your template with: -- Clone the project in the directory `$repo` -- Install all dependencies as listed in `ci/ubuntu_22_04-base` -- Create build directory: `mkdir build` -- Create the project: `cmake -DBUILD_TESTING=ON -DBUILD_DOCUMENTATION=ON -B ./build -G Ninja` -- Build the project: `ninja -C ./build` - -Specific targets can also be build on a case per case basis use `ninja -C ./build/ -t targets` -to list all of them. - -For instance: -- Build the documentation: `ninja -C ./build/ sphinx` -- Run unit tests: `ninja -C ./build/ test` -- Install the project globally: ``ninja -C ./build/ install`` -- Clean caches: `ninja -C ./build/ clean` - -## Contributing - -To contribute, please create a feature branch and a "Draft" merge request. Upon -completion, the merge request should be marked as ready and a reviewer should be -assigned. +```bash +cookiecutter https://git.astron.nl/templates/python-package.git +# Next follow a set of prompts (such as the name and description of the package) +``` ## License -This project is licensed under the Apache License Version 2.0. +This project is licensed under the Apache License Version 2.0 diff --git a/cookiecutter.json b/cookiecutter.json new file mode 100644 index 0000000000000000000000000000000000000000..c34fe8dcc181c1b2f3cb64c98ea14bc79daf9e1d --- /dev/null +++ b/cookiecutter.json @@ -0,0 +1,6 @@ +{ + "project_name": "My Awesome App", + "project_slug": "{{ cookiecutter.project_name.lower()|replace(' ', '_')|replace('-', '_')|replace('.', '_')|trim() }}", + "project_url": "git.astron.nl/{{ cookiecutter.project_slug }}", + "description": "An example CPP project for CI/CD working group" +} diff --git a/docker/ci-runner/Dockerfile b/docker/ci-runner/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..95b9207ad911cf07eed05065d9a488d771e0fdd6 --- /dev/null +++ b/docker/ci-runner/Dockerfile @@ -0,0 +1,29 @@ +FROM ubuntu:22.04 + +# This Docker image builds the dependencies for the application. +# It lives on the head of its dependencies. + +# Install all build-time dependencies +RUN export DEBIAN_FRONTEND=noninteractive && \ + apt-get update && \ + apt-get install -y \ + abi-compliance-checker \ + abi-dumper \ + build-essential \ + clang-format \ + clang-tidy \ + cmake \ + cmake-format \ + curl \ + doxygen \ + gcovr \ + git \ + graphviz \ + libboost-test-dev \ + ninja-build \ + python3-breathe \ + && \ + rm -rf /var/lib/apt/lists/* + +RUN python3 -m pip install --upgrade pip +RUN pip install --upgrade cookiecutter tox twine \ No newline at end of file diff --git a/.clang-format b/{{cookiecutter.project_slug}}/.clang-format similarity index 100% rename from .clang-format rename to {{cookiecutter.project_slug}}/.clang-format diff --git a/.clang-tidy b/{{cookiecutter.project_slug}}/.clang-tidy similarity index 100% rename from .clang-tidy rename to {{cookiecutter.project_slug}}/.clang-tidy diff --git a/.editorconfig b/{{cookiecutter.project_slug}}/.editorconfig similarity index 100% rename from .editorconfig rename to {{cookiecutter.project_slug}}/.editorconfig diff --git a/.gitignore b/{{cookiecutter.project_slug}}/.gitignore similarity index 100% rename from .gitignore rename to {{cookiecutter.project_slug}}/.gitignore diff --git a/{{cookiecutter.project_slug}}/.gitlab-ci.yml b/{{cookiecutter.project_slug}}/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..706236640d84dfc30fa2ef3b22e2a04dc123f1d4 --- /dev/null +++ b/{{cookiecutter.project_slug}}/.gitlab-ci.yml @@ -0,0 +1,148 @@ +# Copyright (C) ASTRON (Netherlands Institute for Radio Astronomy) +# SPDX-License-Identifier: Apache-2.0 + +default: + image: $CI_REGISTRY_IMAGE/ci-build-runner:$CI_COMMIT_REF_SLUG + +stages: + - prepare + - lint + # check if this needs to be a separate step + # - build_extensions + - test + - package + - integration + - publish # publish instead of deploy + +variables: + APPLICATION_LAST_RELEASE: "0.0.0" + +include: + - template: Security/SAST.gitlab-ci.yml + - template: Security/Dependency-Scanning.gitlab-ci.yml + - template: Security/Secret-Detection.gitlab-ci.yml + +# Prepare image to run ci on +trigger_prepare: + stage: prepare + trigger: + strategy: depend + include: .prepare.gitlab-ci.yml + +format: + stage: linting + needs: ["trigger_prepare"] + script: + - scripts/format-cpp.sh + - scripts/format-cmake.sh + - git diff > format.patch + # Fail when the patch is not empy (note ! can't be used directly.) + - (! grep -q '^--- a' format.patch) + artifacts: + when: on_failure + paths: + - format.patch + +tidy: + stage: linting + needs: ["trigger_prepare"] + script: + - mkdir build + - cd build + - cmake -DCMAKE_CXX_CLANG_TIDY=clang-tidy -G Ninja .. + - ninja + +sast: + variables: + SAST_EXCLUDED_ANALYZERS: brakeman, kubesec, nodejs-scan, phpcs-security-audit, + pmd-apex, sobelow, spotbugs + stage: test + +dependency_scanning: + # override default before_script, job won't have Python available + before_script: + - uname + +secret_detection: + # override default before_script, job won't have Python available + before_script: + - uname + +test: + stage: test + needs: ["trigger_prepare"] + script: + - mkdir build + - cd build + - cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DCMAKE_CXX_FLAGS="-coverage" -DCMAKE_EXE_LINKER_FLAGS="-coverage" -G Ninja .. + - ninja + - ctest --output-on-failure |& tee ctest.out + - mkdir coverage + - gcovr -r .. -e ../test/ -e ../src/main.cpp --txt --xml coverage.xml --html-details coverage/coverage.html + - tar cfz coverage.tar.gz coverage/ + artifacts: + paths: + # This will give a warning which is ok + - build/test/unittests.xml + - build/coverage.tar.gz + reports: + junit: build/test/unittests.xml + coverage_report: + coverage_format: cobertura + path: build/coverage.xml + +# See https://git.astron.nl/templates/cpp-project/-/wikis/ABI%20checker +abi-test: + stage: test + needs: ["trigger_prepare"] + script: + # The syntax is described at https://docs.gitlab.com/ee/user/packages/generic_packages/index.html + - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ABI/${APPLICATION_LAST_RELEASE}/abi.dump" -o abi.dump' + - cmake --version + - mkdir build && cd build + - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Og -gdwarf-3" -GNinja .. + - ninja + - cd .. + - abi-dumper build/src/lib/libhello.so -o master.dump -lver master + # ABI failures are not only intended to be informative + - abi-compliance-checker -l hello -old abi.dump -new master.dump || true + artifacts: + paths: + - compat_reports/hello/${APPLICATION_LAST_RELEASE}_to_master + +build: + stage: build + needs: ["trigger_prepare"] + script: + - mkdir build + - cd build + - cmake -DCMAKE_BUILD_TYPE=Release -G Ninja .. + - ninja + +pages: + stage: pages + needs: ["trigger_prepare"] + script: + # Generate documentation. + - cd build + - cmake -DBUILD_DOCUMENTATION=ON -G Ninja .. + - ninja sphinx + # Extract HTML coverage report. + - tar xfz coverage.tar.gz + # TODO: Add an index page with links to the documentation and coverage. + +abi-deploy: + stage: deploy + needs: ["trigger_prepare"] + environment: production + script: + - cmake --version + - mkdir build && cd build + - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Og -gdwarf-3" -GNinja .. + - ninja + - cd .. + - abi-dumper build/src/lib/libhello.so -o ${APPLICATION_LAST_RELEASE}.dump -lver ${APPLICATION_LAST_RELEASE} + # The syntax is described at https://docs.gitlab.com/ee/user/packages/generic_packages/index.html + - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${APPLICATION_LAST_RELEASE}.dump "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ABI/${APPLICATION_LAST_RELEASE}/abi.dump"' + rules: + - when: manual diff --git a/{{cookiecutter.project_slug}}/.prepare.gitlab-ci.yml b/{{cookiecutter.project_slug}}/.prepare.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..e531b6dfa16369347e85f91c5587fb8ed1607074 --- /dev/null +++ b/{{cookiecutter.project_slug}}/.prepare.gitlab-ci.yml @@ -0,0 +1,23 @@ +stages: + - build + +build_ci_runner_image: + stage: build + image: docker:stable + services: + - docker:dind + script: + - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + - | + if docker pull $CI_REGISTRY_IMAGE/ci-build-runner:$CI_COMMIT_REF_SLUG; then + docker build --cache-from $CI_REGISTRY_IMAGE/ci-build-runner:$CI_COMMIT_REF_SLUG --tag $CI_REGISTRY_IMAGE/ci-build-runner:$CI_COMMIT_REF_SLUG docker/ci-runner + else + docker pull $CI_REGISTRY_IMAGE/ci-build-runner:latest || true + docker build --cache-from $CI_REGISTRY_IMAGE/ci-build-runner:latest --tag $CI_REGISTRY_IMAGE/ci-build-runner:$CI_COMMIT_REF_SLUG docker/ci-runner + fi + - docker push $CI_REGISTRY_IMAGE/ci-build-runner:$CI_COMMIT_REF_SLUG # push the image + - | + if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then + docker image tag $CI_REGISTRY_IMAGE/ci-build-runner:$CI_COMMIT_REF_SLUG $CI_REGISTRY_IMAGE/ci-build-runner:latest + docker push $CI_REGISTRY_IMAGE/ci-build-runner:latest + fi diff --git a/CMakeLists.txt b/{{cookiecutter.project_slug}}/CMakeLists.txt similarity index 100% rename from CMakeLists.txt rename to {{cookiecutter.project_slug}}/CMakeLists.txt diff --git a/{{cookiecutter.project_slug}}/LICENSE b/{{cookiecutter.project_slug}}/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 --- /dev/null +++ b/{{cookiecutter.project_slug}}/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/{{cookiecutter.project_slug}}/README.md b/{{cookiecutter.project_slug}}/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1015fe43378a4cfe682b16f797e84b461080e39f --- /dev/null +++ b/{{cookiecutter.project_slug}}/README.md @@ -0,0 +1,47 @@ +# C++ project + +An example repository of an CI/CD pipeline for building, testing and deploying a C++ project. + +## Description + +The repository can be used as a basis for new projects using C++ within ASTRON. +The code is intended to be copied in a new repository and used as basis for the +new project. After copying the code needs to be adjusted for the specific +project. The template offers: + +- CI jobs for building, testing, and generating documentation + + - A basic Docker file to be used in the CI + - A CMake project skeleton + - A Doxygen and Sphinx skeleton for documentation, combined with Breathe + - Formatting scripts for the code + +Note: The project is intended to be used for C++ projects without Fortran code. +At the moment of writing there is no Fortran support for Ninja. This means the +project needs to be changed to use `make`. + +## Getting started + +- Clone the project in the directory `$repo` +- Install all dependencies as listed in `ci/ubuntu_22_04-base` +- Create build directory: `mkdir build` +- Create the project: `cmake -DBUILD_TESTING=ON -DBUILD_DOCUMENTATION=ON -B ./build -G Ninja` +- Build the project: `ninja -C ./build` + +Specific targets can also be build on a case per case basis use `ninja -C ./build/ -t targets` +to list all of them. + +For instance: +- Build the documentation: `ninja -C ./build/ sphinx` +- Run unit tests: `ninja -C ./build/ test` +- Install the project globally: ``ninja -C ./build/ install`` +- Clean caches: `ninja -C ./build/ clean` + +## Contributing + +To contribute, please create a feature branch and a "Draft" merge request. Upon +completion, the merge request should be marked as ready and a reviewer should be +assigned. + +## License +This project is licensed under the Apache License Version 2.0. diff --git a/cmake/FindSphinx.cmake b/{{cookiecutter.project_slug}}/cmake/FindSphinx.cmake similarity index 100% rename from cmake/FindSphinx.cmake rename to {{cookiecutter.project_slug}}/cmake/FindSphinx.cmake diff --git a/doc/CMakeLists.txt b/{{cookiecutter.project_slug}}/doc/CMakeLists.txt similarity index 100% rename from doc/CMakeLists.txt rename to {{cookiecutter.project_slug}}/doc/CMakeLists.txt diff --git a/doc/Doxyfile.in b/{{cookiecutter.project_slug}}/doc/Doxyfile.in similarity index 100% rename from doc/Doxyfile.in rename to {{cookiecutter.project_slug}}/doc/Doxyfile.in diff --git a/doc/sphinx/conf.py b/{{cookiecutter.project_slug}}/doc/sphinx/conf.py similarity index 100% rename from doc/sphinx/conf.py rename to {{cookiecutter.project_slug}}/doc/sphinx/conf.py diff --git a/doc/sphinx/index.rst b/{{cookiecutter.project_slug}}/doc/sphinx/index.rst similarity index 100% rename from doc/sphinx/index.rst rename to {{cookiecutter.project_slug}}/doc/sphinx/index.rst diff --git a/ci/ubuntu_22_04-base b/{{cookiecutter.project_slug}}/docker/ci-runner/Dockerfile similarity index 100% rename from ci/ubuntu_22_04-base rename to {{cookiecutter.project_slug}}/docker/ci-runner/Dockerfile diff --git a/include/hello.hpp b/{{cookiecutter.project_slug}}/include/hello.hpp similarity index 100% rename from include/hello.hpp rename to {{cookiecutter.project_slug}}/include/hello.hpp diff --git a/scripts/format-cmake.sh b/{{cookiecutter.project_slug}}/scripts/format-cmake.sh similarity index 100% rename from scripts/format-cmake.sh rename to {{cookiecutter.project_slug}}/scripts/format-cmake.sh diff --git a/scripts/format-cpp.sh b/{{cookiecutter.project_slug}}/scripts/format-cpp.sh similarity index 100% rename from scripts/format-cpp.sh rename to {{cookiecutter.project_slug}}/scripts/format-cpp.sh diff --git a/src/CMakeLists.txt b/{{cookiecutter.project_slug}}/src/CMakeLists.txt similarity index 100% rename from src/CMakeLists.txt rename to {{cookiecutter.project_slug}}/src/CMakeLists.txt diff --git a/src/lib/CMakeLists.txt b/{{cookiecutter.project_slug}}/src/lib/CMakeLists.txt similarity index 100% rename from src/lib/CMakeLists.txt rename to {{cookiecutter.project_slug}}/src/lib/CMakeLists.txt diff --git a/src/lib/hello.cpp b/{{cookiecutter.project_slug}}/src/lib/hello.cpp similarity index 100% rename from src/lib/hello.cpp rename to {{cookiecutter.project_slug}}/src/lib/hello.cpp diff --git a/src/main.cpp b/{{cookiecutter.project_slug}}/src/main.cpp similarity index 100% rename from src/main.cpp rename to {{cookiecutter.project_slug}}/src/main.cpp diff --git a/test/CMakeLists.txt b/{{cookiecutter.project_slug}}/test/CMakeLists.txt similarity index 100% rename from test/CMakeLists.txt rename to {{cookiecutter.project_slug}}/test/CMakeLists.txt diff --git a/test/main.cpp b/{{cookiecutter.project_slug}}/test/main.cpp similarity index 100% rename from test/main.cpp rename to {{cookiecutter.project_slug}}/test/main.cpp diff --git a/test/thello.cpp b/{{cookiecutter.project_slug}}/test/thello.cpp similarity index 100% rename from test/thello.cpp rename to {{cookiecutter.project_slug}}/test/thello.cpp