Newer
Older
SCRIPTS_DIR: "${CI_PROJECT_DIR}/scripts"
CI_SCRIPTS_DIR: "${CI_PROJECT_DIR}/scripts/ci"
BUILD_PATH: "${CI_PROJECT_DIR}/gkfs/build"
INSTALL_PATH: "${CI_PROJECT_DIR}/gkfs/install"
INTEGRATION_TESTS_BIN_PATH: "${CI_PROJECT_DIR}/gkfs/install/share/gkfs/tests/integration"
COVERAGE_PATH: "${CI_PROJECT_DIR}/gkfs/build/coverage"
PYTEST: "${CI_PROJECT_DIR}/gkfs/install/share/gkfs/tests/integration/pytest-venv/bin/py.test"
BATS: "${CI_PROJECT_DIR}/tests/scripts/bats/bin/bats"
LD_LIBRARY_PATH: "${CI_PROJECT_DIR}/deps/install/lib:${CI_PROJECT_DIR}/deps/install/lib64"
GKFS_LOG_LEVEL: "100"
GKFS_DAEMON_LOG_PATH: "${CI_PROJECT_DIR}/logs/daemon.log"
LIBGKFS_LOG: "all"
LIBGKFS_LOG_OUTPUT: "${CI_PROJECT_DIR}/logs/gkfs_client.log"
GIT_SUBMODULE_STRATEGY: recursive
################################################################################
## Validating
################################################################################
- ${SCRIPTS_DIR}/check_format.sh
-s "${CI_PROJECT_DIR}/src"
-i "${CI_PROJECT_DIR}/include"
-v
################################################################################
## Building
################################################################################
gkfs:
stage: build
# Change config.hpp with sed to enable extra features
- sed -i 's/constexpr auto use_atime = false;/constexpr auto use_atime = true;/g' "${CI_PROJECT_DIR}/include/config.hpp"
- sed -i 's/constexpr auto use_ctime = false;/constexpr auto use_ctime = true;/g' "${CI_PROJECT_DIR}/include/config.hpp"
- sed -i 's/constexpr auto use_mtime = false;/constexpr auto use_mtime = true;/g' "${CI_PROJECT_DIR}/include/config.hpp"
- sed -i 's/constexpr auto use_link_cnt = false;/constexpr auto use_link_cnt = true;/g' "${CI_PROJECT_DIR}/include/config.hpp"
- sed -i 's/constexpr auto use_blocks = false;/constexpr auto use_blocks = true;/g' "${CI_PROJECT_DIR}/include/config.hpp"
- cmake --preset ci-coverage -DCOVERAGE_OUTPUT_DIR=${COVERAGE_PATH}
- cmake --build ${BUILD_PATH} -j $(nproc) --target install
# reduce artifacts size
- ${CI_SCRIPTS_DIR}/trim_build_artifacts.sh ${BUILD_PATH}
- cmake --build ${BUILD_PATH} -j $(nproc) --target install
# reduce artifacts size
- ${CI_SCRIPTS_DIR}/trim_build_artifacts.sh ${BUILD_PATH}
- ${BUILD_PATH}
- ${INSTALL_PATH}
################################################################################
## Testing
################################################################################
## == tests for scripts ====================
scripts:
stage: test
needs: []
script:
- mkdir -p ${BUILD_PATH}/tests/scripts
- cd ${BUILD_PATH}/tests/scripts
- ${BATS} -r ${CI_PROJECT_DIR}/tests/scripts/dl_dep.sh --formatter junit
- ${BATS} -r ${CI_PROJECT_DIR}/tests/scripts/compile_dep.sh --formatter junit
artifacts:
expire_in: 1 week
reports:
junit: ${BUILD_PATH}/tests/scripts/report.xml
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
## == coverage baseline ====================
coverage:zerocount:
stage: test
image: gekkofs/testing:0.9.2
interruptible: true
needs: ['gkfs', 'gkfwd']
script:
## capture initial coverage information to establish a baseline
## and write it to $COVERAGE_PATH/zerocount.info
- cd ${CI_PROJECT_DIR}
- cmake --preset ci-coverage
-DCOVERAGE_OUTPUT_DIR=${COVERAGE_PATH}
-DCOVERAGE_ZEROCOUNT_TRACEFILE=${COVERAGE_PATH}/zerocount.info
## Since the pipeline recreates the source tree, the access times for .gcno
## files are newer than those of .gcda files. This makes gcov emit a
## warning for each file which slows it down. Updating the timestamps
## avoids this
- find ${BUILD_PATH} -name "*.gcno" -exec touch {} \;
- cmake --build ${BUILD_PATH} --target coverage-zerocount
artifacts:
expire_in: 1 week
when: always
paths:
- ${COVERAGE_PATH}/zerocount.info
## == integration tests for gkfs ===========
gkfs:integration:
interruptible: true
needs: ['gkfs']
parallel:
matrix:
- SUBTEST: [ data, status, syscalls, directories, operations, position, shell, rename ]
## capture coverage information for this test and write it to
## $COVERAGE_PATH/$SUBTEST.info
- cd ${CI_PROJECT_DIR}
- cmake --preset ci-coverage
-DCOVERAGE_OUTPUT_DIR=${COVERAGE_PATH}
-DCOVERAGE_CAPTURE_TRACEFILE=${COVERAGE_PATH}/${SUBTEST}.info
## Since the pipeline recreates the source tree, the access times for .gcno
## files are newer than those of .gcda files. This makes gcov emit a
## warning for each file which slows it down. Updating the timestamps
## avoids this
- find ${BUILD_PATH} -name "*.gcno" -exec touch {} \;
- cmake --build ${BUILD_PATH} --target coverage-capture
# fix relative paths so that GitLab can find the correct files
after_script:
- perl -i.orig
-pe 's%file="(.*?)"%file="tests/integration/$1"%;'
-pe 's%(../)+install/share/gkfs/%%g;'
${BUILD_PATH}/tests/integration/report.xml
reports:
junit: ${BUILD_PATH}/tests/integration/report.xml
## == integration tests for gkfwd ==========
gkfwd:integration:
interruptible: true
needs: ['gkfwd']
parallel:
matrix:
- SUBTEST: [ forwarding ]
- cd ${BUILD_PATH}/tests/integration
- ${PYTEST} -v -n $(nproc)
${INTEGRATION_TESTS_BIN_PATH}/${SUBTEST}
## capture coverage information for this test and write it to
## $COVERAGE_PATH/$SUBTEST.info
- cd ${CI_PROJECT_DIR}
- cmake --preset ci-coverage
-DCOVERAGE_OUTPUT_DIR=${COVERAGE_PATH}
-DCOVERAGE_CAPTURE_TRACEFILE=${COVERAGE_PATH}/${SUBTEST}.info
## Since the pipeline recreates the source tree, the access times for .gcno
## files are newer than those of .gcda files. This makes gcov emit a
## warning for each file which slows it down. Updating the timestamps
## avoids this
- find ${BUILD_PATH} -name "*.gcno" -exec touch {} \;
- cmake --build ${BUILD_PATH} --target coverage-capture
# fix relative paths so that GitLab can find the correct files
after_script:
- perl -i.orig
-pe 's%file="(.*?)"%file="tests/integration/$1"%;'
-pe 's%(../)+install/share/gkfs/%%g;'
${BUILD_PATH}/tests/integration/report.xml
- ${BUILD_PATH}
reports:
junit: ${BUILD_PATH}/tests/integration/report.xml
## == unit tests for gkfs ==================
gkfs:unit:
## Add path to mkfs.kreon
- export PATH=${PATH}:/usr/local/bin
- cd ${CI_PROJECT_DIR}
- ctest --test-dir ${BUILD_PATH}
-j $(nproc)
-L unit::all
--output-junit ${BUILD_PATH}/tests/unit/report.xml
## capture coverage information for this test and write it to
## $COVERAGE_PATH/unit.info
- cd ${CI_PROJECT_DIR}
- cmake --preset ci-coverage
-DCOVERAGE_OUTPUT_DIR=${COVERAGE_PATH}
-DCOVERAGE_CAPTURE_TRACEFILE=${COVERAGE_PATH}/unit.info
## Since the pipeline recreates the source tree, the access times for .gcno
## files are newer than those of .gcda files. This makes gcov emit a
## warning for each file which slows it down. Updating the timestamps
## avoids this
- find ${BUILD_PATH} -name "*.gcno" -exec touch {} \;
- cmake --build ${BUILD_PATH} --target coverage-capture
- ${BUILD_PATH}
reports:
junit: ${BUILD_PATH}/tests/unit/report.xml
################################################################################
## Generation of documentation
################################################################################
documentation:
stage: docs
needs: []
rules:
# we only build the documentation automatically if we are on the
# `master` branch, but since we also would like to test the documentation
# against our CI, we allow developers to also build it manually
- if: '$CI_MERGE_REQUEST_EVENT_TYPE == "detached"'
when: never
- if: '$CI_MERGE_REQUEST_ID != ""'
when: manual
allow_failure: true
- if: '$CI_COMMIT_REF_SLUG == "master"'
when: always
script:
- cmake --preset ci-docs
- cmake --build ${BUILD_PATH} --target docs
artifacts:
paths:
- ${BUILD_PATH}/docs
expire_in: 2 weeks
################################################################################
## Generation of code coverage reports
################################################################################
coverage:
stage: report
image: gekkofs/testing:0.9.2
needs: [ 'coverage:zerocount', 'gkfs:integration', 'gkfwd:integration',
'gkfs:unit' ]
- cd ${CI_PROJECT_DIR}
- cmake
--preset ci-coverage
-DCOVERAGE_OUTPUT_DIR=${COVERAGE_PATH}
-DCOVERAGE_UNIFIED_TRACEFILE=${COVERAGE_PATH}/coverage.info
-DCOVERAGE_HTML_REPORT_DIRECTORY=${COVERAGE_PATH}/coverage_html
-DCOVERAGE_XML_REPORT=${COVERAGE_PATH}/coverage-cobertura.xml
- cmake
--build ${BUILD_PATH}
--target coverage-html
--target coverage-cobertura
--target coverage-summary
coverage: '/lines[\.]+\: (\d+\.\d+)\%/'
coverage_report:
coverage_format: cobertura
path: ${COVERAGE_PATH}/coverage-cobertura.xml
################################################################################
## Deployment of documentation and reports
################################################################################
#
## for the deploy stage to work as expected, we need to run rsync with the
## appropriate credentials provided by sysadmins. For that, the specific values
## for DEPLOY_KEY_FILE, DEPLOY_USERNAME, DEPLOY_GROUP, DEPLOY_SERVER and
## DEPLOY_PATH must be defined as protected variables.
deploy:
image: bscstorage/deployer
stage: deploy
needs: [ 'documentation' ]
only:
- master
script:
- chmod 400 ${DEPLOY_KEY_FILE}
- rsync -e "ssh -i ${DEPLOY_KEY_FILE}"
-avzr
--delete
--chown=${DEPLOY_USERNAME}:${DEPLOY_GROUP}
${BUILD_PATH}/docs/sphinx/sphinx_docs/
${DEPLOY_USERNAME}@${DEPLOY_SERVER}:${DEPLOY_PATH}