| image: metacpan/metacpan-api |
| |
| variables: |
| # Set `CCACHE_BASEDIR` and `CCACHE_DIR` to point `ccache` towards the cached |
| # path on the gitlab-runner. This enables to cache the output of `ccache` |
| # between various runs. |
| CCACHE_BASEDIR: "${CI_PROJECT_DIR}" |
| CCACHE_DIR: "${CI_PROJECT_DIR}/ccache" |
| # Set `ccache` to `content` to prevent rebuilding of the CI/CD containers to |
| # trigger a recreate of the cache. By using `content` the compiler's `mtime` |
| # is not considered as part of the hash. |
| CCACHE_COMPILERCHECK: "content" |
| # Enable caching for `apt-get`. |
| APT_CACHE_DIR: "${CI_PROJECT_DIR}/apt-cache" |
| # Export `noninteractive` frontend to prevent requesting user input. |
| DEBIAN_FRONTEND: "noninteractive" |
| PERL_LOCAL_LIB_ROOT: ./perl5 |
| PERL5LIB: ./perl5/lib/perl5 |
| |
| build-and-test: |
| stage: build |
| cache: |
| # Cache is shared between branches, but has a unique cache per job. |
| key: derekovecs |
| paths: |
| # Note: directories should align with `$APT_CACHE_DIR` and `$CCACHE_DIR`. |
| - apt-cache/ |
| - ccache/ |
| - perl5/ |
| before_script: |
| - pwd |
| - source `find .. -name section_helper.sh` |
| |
| - start_section install_linux_packages "Installing missing Linux packages" |
| - mkdir -pv $APT_CACHE_DIR ccache |
| - apt-get update && apt-get -o dir::cache::archives="$APT_CACHE_DIR" -y install ccache cmake librocksdb-dev libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev libomp-dev |
| # ccache only makes the build faster, it must never be able to make it fail, |
| # so everything that uses it is guarded and CCACHE_OPTS stays empty without it |
| - if CCACHE=$(command -v ccache); then ln -sf "$CCACHE" /usr/local/sbin/gcc && ln -sf "$CCACHE" /usr/local/sbin/g++ && CCACHE_OPTS="-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"; else echo "ccache is not available - building without it"; CCACHE_OPTS=""; fi |
| - end_section install_linux_packages |
| |
| - start_section install_collocatordb "Building and installing collocatordb" |
| - git clone "https://korap.ids-mannheim.de/gerrit/ids-kl/collocatordb" |
| - cd collocatordb |
| - mkdir -p build |
| - cd build |
| - cmake $CCACHE_OPTS .. |
| - make |
| - command -v ccache > /dev/null && ccache --show-stats || true |
| - make install # && ctest --extra-verbose |
| - ldconfig |
| - end_section install_collocatordb |
| - cd ../.. |
| |
| script: |
| - start_section build_perl_dependencies "Installing Perl dependencies" |
| - cpanm -n -l $PERL_LOCAL_LIB_ROOT https://github.com/Akron/Mojolicious-Plugin-Localize.git |
| # Devel::CheckLib, which Makefile.PL needs to find libcollocatordb before it |
| # can tell anybody about the dependencies, comes bundled in inc/ |
| - cpanm -n -l $PERL_LOCAL_LIB_ROOT --installdeps . |
| - end_section build_perl_dependencies |
| |
| - start_section build_derekovecs-server "Building DeReKoVecs server" |
| - perl Makefile.PL |
| - make |
| - make install |
| - end_section build_derekovecs-server |
| |
| - start_section run_derekovecs-server "Testing DeReKoVecs server" |
| - prove --verbose t |
| - end_section run_derekovecs-server |
| |
| deploy: |
| rules: |
| - if: $CI_COMMIT_TAG =~ /.+/ |
| variables: |
| VID: $CI_COMMIT_TAG |
| - when: manual |
| variables: |
| VID: $CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA |
| stage: deploy |
| before_script: |
| - source `find .. -name section_helper.sh` |
| - start_section install_linux_packages "Installing missing Linux packages" |
| - 'command -v ssh-agent >/dev/null || apt-get install openssh-client -y' |
| - mkdir -p ~/.ssh |
| - chmod 700 ~/.ssh |
| - eval $(ssh-agent -s) |
| - chmod 400 "$SSH_PRIVATE_KEY" |
| - ssh-add "$SSH_PRIVATE_KEY" |
| - end_section install_linux_packages |
| script: |
| - echo "This is a manual job which doesn't start automatically, and the pipeline can complete without it starting." |
| - ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $DEPLOY_HOST "cd /opt/korap/derekovecs && git stash && git pull && cpanm --installdeps . && cpanm . && rm -rf _Inline && sudo systemctl restart derekovecs" |
| |
| build-docker: |
| image: docker:latest |
| variables: |
| # the mint container has to reach the container it probes |
| FF_NETWORK_PER_BUILD: "true" |
| services: |
| - name: docker:dind |
| command: [--dns=127.0.0.11] |
| rules: |
| - if: $CI_COMMIT_TAG =~ /.+/ |
| variables: |
| VID: $CI_COMMIT_TAG |
| - when: manual |
| variables: |
| VID: $CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA |
| stage: build |
| before_script: |
| - apk update |
| - apk add --no-cache git |
| script: |
| # the http probe needs a model to serve, so keep the example models in the |
| # large image and remove them further down with Dockerfile.remove-example-data |
| - sed -i -e "s/RUN rm -rf example-models//" Dockerfile |
| - docker build -f Dockerfile -t idscorpuslinguistics/derekovecs:$VID-large . |
| - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock mintoolkit/mint --crt-api-version 1.46 build --http-probe=true --http-probe-start-wait 60 --include-workdir=true --include-path=/usr/local --env MOJO_CONFIG=/derekovecs/example-models/example-docker.conf --tag idscorpuslinguistics/derekovecs:tmp idscorpuslinguistics/derekovecs:$VID-large || true |
| - docker build -f Dockerfile.remove-example-data --tag idscorpuslinguistics/derekovecs:latest --tag idscorpuslinguistics/derekovecs:$VID . |
| - ARTIFACT=derekovecs-${VID}.tar.xz |
| - docker save idscorpuslinguistics/derekovecs:$VID | xz -T0 -M16G -9 > "$ARTIFACT" |
| artifacts: |
| paths: |
| - derekovecs-*.tar.xz |
| |
| upload-docker: |
| stage: deploy |
| image: docker:latest |
| services: |
| - name: docker:dind |
| command: [--dns=127.0.0.11] |
| needs: |
| - job: build-docker |
| artifacts: true |
| dependencies: |
| - build-docker |
| rules: |
| - if: $CI_COMMIT_TAG =~ /^v.+/ |
| when: manual |
| - when: never |
| script: |
| - apk update |
| - apk add --no-cache xz |
| - ARTIFACT=derekovecs-${CI_COMMIT_TAG}.tar.xz |
| - xz -d -c "$ARTIFACT" | docker load |
| - echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_USERNAME" --password-stdin |
| - docker tag idscorpuslinguistics/derekovecs:$CI_COMMIT_TAG idscorpuslinguistics/derekovecs:latest |
| - docker push idscorpuslinguistics/derekovecs:$CI_COMMIT_TAG |
| - docker push idscorpuslinguistics/derekovecs:latest |
| environment: |
| name: production |