From e987533067c6335cfcf16b9520f05a37c6cce259 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Mon, 7 Jun 2021 00:43:03 +0200 Subject: [PATCH] WIP: pipeline --- .docker/Dockerfile | 8 ++- .gitlab-ci.yml | 161 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 156 insertions(+), 13 deletions(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 16eda49..3230ad0 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,6 +1,9 @@ ARG CI_REGISTRY_IMAGE FROM $CI_REGISTRY_IMAGE +COPY .docker/wait-for-it.sh /wait-for-it.sh + +# build and install caosdb-cpplib WORKDIR /libcaosdb/ RUN mkdir build WORKDIR /libcaosdb/build @@ -8,4 +11,7 @@ RUN cmake .. RUN cmake --build . RUN cmake --install . --prefix /usr/local/ -CMD /bin/bash + +CMD /wait-for-it.sh caosdb-server:10443 -t 500 -- \ + # ... and run tests + ctest diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8d3c6bc..15daf2e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,17 +20,51 @@ # along with this program. If not, see <https://www.gnu.org/licenses/>. variables: - CI_REGISTRY_IMAGE_CPPLIB: $CI_REGISTRY/caosdb/src/caosdb-cpplib/testenv:latest - CI_REGISTRY_IMAGE: $CI_REGISTRY/caosdb/src/caosdb-cppinttest/testenv:latest + # this is the image where cpplib repo is present (artifact from pipeline in + # caosdb-cpplib) + CI_REGISTRY_IMAGE_CPPLIB: $CI_REGISTRY/caosdb/src/caosdb-cpplib/testenv:$CPP + # this is the image where all the docker containers (server, mysql and test + # suite) are started + CI_REGISTRY_IMAGE_BASE: $CI_REGISTRY/caosdb/src/caosdb-pyinttest/base:latest + + CPPINTTEST_TESTENV_IMAGE_SUFFIX: $CI_COMMIT_REF_NAME + CPPINTTEST_REPO_PATH: caosdb/src/caosdb-cppinttest + CPPINTTEST_TESTENV_IMAGE_TAG: ${CPPINTTEST_REPO_PATH}/testenv:${CPPINTTEST_IMAGE_SUFFIX} + # this is the image where the cpplib is installed and where the testsuite runs + CPPINTTEST_REGISTRY_IMAGE: ${CI_REGISTRY}/${CPPINTTEST_IMAGE_TAG} + # this is the name of the image in the /image-cache/ directory + CPPINTTEST_IMAGE_CACHE: ${CPPINTTEST_IMAGE_TAG}.tar + + + ## FOR DEBUGGING TRIGGERED_BY_REPO: CPPINTTEST TRIGGERED_BY_REF: $CI_COMMIT_REF_NAME TRIGGERED_BY_HASH: $CI_COMMIT_SHORT_SHA + + ## Run tests against this cpplib version CPPLIB_VERSION: 0.0.1 + + # This is the caosdb-deploy branch which build the images for caosdb-server and caosdb-mysql + # TODO change to dev after merge of f-grpc to dev + DEPLOY_REF: f-grpc + stages: + - info - setup + - build - test +info: + tags: [cached-dind] + image: docker:20.10 + stage: setup_tests + timeout: 1 minutes + needs: [] + script: + - echo "Pipeline triggered by $TRIGGERED_BY_REPO@$TRIGGERED_BY_REF ($TRIGGERED_BY_HASH)" + + # Build a docker image in which tests for this repository can run build-testenv: tags: [cached-dind] @@ -39,28 +73,131 @@ build-testenv: timeout: 2h needs: [] script: - - echo "Pipeline triggered by $TRIGGERED_BY_REPO@$TRIGGERED_BY_REF ($TRIGGERED_BY_HASH)" - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - - docker pull $CI_REGISTRY_IMAGE_CPPLIB|| true + + ## Determine the cppinttest branch... + # ... use an f-branch if posible... + - if echo "$CI_COMMIT_REF_NAME" | grep -c "^f-" ; then + # this is an f-branch + CPPINT_REF=$CI_COMMIT_REF_NAME ; + fi; + # ... or use main if possible... + - if [[ "$CI_COMMIT_REF_NAME" == "main" ]] ; then + CPPINT_REF=main ; + fi + # ... and fall-back to dev + - CPPINT_REF=${CPPINT_REF:-dev} + + #build testenv image + - docker pull $CI_REGISTRY_IMAGE_CPPLIB || true # remove??? docker build --pull??? - docker build --build-arg CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE_CPPLIB --file .docker/Dockerfile --pull - --cache-from $CI_REGISTRY_IMAGE - --tag $CI_REGISTRY_IMAGE . - - docker push $CI_REGISTRY_IMAGE + --cache-from $CPPINTTEST_REGISTRY_IMAGE + --tag $CPPINTTEST_REGISTRY_IMAGE . + - docker push $CPPINTTEST_REGISTRY_IMAGE + - docker save $CPPINTTEST_REGISTRY_IMAGE > /image-cache/${CPPINTTEST_IMAGE_CACHE} -# run integration tests -test: - image: $CI_REGISTRY_IMAGE +# build integration tests +build-test: + image: $CPPINTTEST_REGISTRY_IMAGE dependencies: - build-testenv tags: [ docker ] - stage: test + stage: build script: - mkdir build - cd build - cmake -D CMAKE_PREFIX_PATH=/usr/local/lib/libcaosdb-${CPPLIB_VERSION} .. - cmake --build . - - ctest + artifacts: + path: + - build/ + expire_in: 1 week + + +test: + tags: [docker] + services: + - docker:20.10.3-dind + variables: + # This is a workaround for the gitlab-runner health check mechanism when + # using docker-dind service. The runner will otherwise guess the port + # wrong and the health check will timeout. + SERVICE_PORT_2376_TCP_PORT: 2375 + stage: test + image: $CI_REGISTRY_IMAGE_BASE + needs: + - job: build-test + artifacts: true + script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY + + - if [[ "$CAOSDB_TAG" == "" ]]; then + # the CAOSDB_TAG has to be guessed... + if echo "$F_BRANCH" | grep -c "^f-" ; then + CAOSDB_TAG=${DEPLOY_REF}_F_${F_BRANCH}-latest; + echo "Load deploy images with tag: $CAOSDB_TAG ..." + if ! docker pull $CI_REGISTRY/caosdb/src/caosdb-deploy:$CAOSDB_TAG ; then + echo "Load deploy images with tag: $CAOSDB_TAG ... error. Try another:" ; + CAOSDB_TAG=${DEPLOY_REF}-latest ; + echo "Load deploy images with tag: $CAOSDB_TAG ..." + docker pull $CI_REGISTRY/caosdb/src/caosdb-deploy:$CAOSDB_TAG ; + echo "Load deploy images with tag: $CAOSDB_TAG ... success" + fi + + else + # no F_BRANCH -> use default DEPLOY_REF branch + CAOSDB_TAG=${DEPLOY_REF}-latest ; + echo "Load deploy images with tag: $CAOSDB_TAG ..." + docker pull $CI_REGISTRY/caosdb/src/caosdb-deploy:$CAOSDB_TAG ; + echo "Load deploy images with tag: $CAOSDB_TAG ... success" + fi; + else + # If the CAOSDB_TAG was given + echo "Load deploy images with tag: $CAOSDB_TAG ..." + docker pull $CI_REGISTRY/caosdb/src/caosdb-deploy:$CAOSDB_TAG ; + echo "Load deploy images with tag: $CAOSDB_TAG ... success" + fi + + - docker load < /image-cache/${CPPINTTEST_IMAGE_CACHE} || true + - docker pull $CPPINTTEST_REGISTRY_IMAGE + + # load any(!!!) mariab image + - docker load < /image-cache/mariadb.tar || true + - cd .docker + + # here the server and the mysql backend docker are being started + - CAOSDB_TAG=$CAOSDB_TAG docker-compose up -d + + # the pyinttest docker writes the return value of the tests into the + # file result + - /bin/sh ./run.sh + + # collect log files + - cd .. + - docker logs docker_caosdb-server_1 &> ../caosdb_log.txt + - docker logs docker_sqldb_1 &> ../mariadb_log.txt + + # shut down + - docker-compose -f .docker/docker-compose.yml down + + # collect results + - rc=`cat .docker/result` + + # renew mariadb image in the cache (why? to renew the timestamp???) + - echo mariadb:$(docker image ls mariadb | grep mariadb | awk '{print $2}') + - docker save mariadb:$(docker image ls mariadb | grep mariadb | awk '{print $2}') > /image-cache/mariadb.tar || true + + # exit with fail when errors exist + - exit $rc + dependencies: [cert] + timeout: 3h + artifacts: + paths: + - caosdb_log.txt + - mariadb_log.txt + - .docker/hash_* + expire_in: 1 week -- GitLab