openflexure-microscope-server/.gitlab-ci.yml
Richard Bowman 35db80121a Update build output location
This now places the static web app in the correct location for the v3 back-end code.
2024-01-03 20:50:33 +00:00

200 lines
5.4 KiB
YAML

stages:
- analysis
- testing
- build
- package
- deploy
# Re-usable block to install (and cache) Poetry and openflexure-microscope-server
.python:
image: balenalib/raspberry-pi:buster
retry: 1
before_script:
- apt-get update
- apt-get install apt-utils curl wget python3 python3-pip python3-venv raspi-gpio libgfortran3 libatlas3-base libffi-dev vim git-lfs libtiff5 libpango-1.0-0 libavcodec58 libgdk-pixbuf2.0-0 libjasper1 libswscale5 libpangocairo-1.0-0 libilmbase23 libatk1.0-0 libgtk-3-0 libwebp6 libcairo2 libavutil56 libcairo-gobject2 libopenexr23 libavformat58 libxslt1.1
- python3 -m venv .venv # NB this does not overwrite an existing cached venv
- source .venv/bin/activate
- pip install pipenv # Should be cached after first run
- pipenv install --dev --deploy # Should be cached after first run - will just check packages are present
cache:
key: "${CI_COMMIT_REF_SLUG}"
paths:
- .cache/pip
- .venv
only:
- branches
- merge_requests
- tags
- web
.javascript:
image: node:15
before_script:
- cd webapp
- npm install
cache:
key: "${CI_COMMIT_REF_SLUG}"
paths:
- webapp/node_modules
only:
- branches
- merge_requests
- tags
- web
# Python static analysis with PyLint
pylint:
stage: analysis
extends: .python
script:
- poe pylint
# Python type checking with Mypy
mypy:
stage: analysis
extends: .python
script:
- poe mypy
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: openflexure_microscope/cobertura.xml
# Python style analysis with Black
black:
stage: analysis
allow_failure: true
extends: .python
script:
- poe black_check
# Python unit tests with PyTest
pytest:
stage: testing
extends: .python
script:
- poe test
artifacts:
when: always
reports:
junit: pytest_report.xml
# Generate and validate OpenAPI description
openapi:
stage: testing
extends: .python
script:
- mkdir -p docs/build/
- ofm-generate-openapi -o docs/build/swagger.yaml --validate
artifacts:
name: "openapi"
expose_as: "OpenAPI Description"
expire_in: 1 week
paths:
- "./docs/build/swagger.yaml"
# JavaScript linting with ESLint (via Vue CLI)
eslint:
stage: analysis
extends: .javascript
script:
# Build JS application for production
- npm run lint
# Build JS app
build:
stage: build
extends: .javascript
script:
# Build JS application for production
- npm run build
artifacts:
name: "dist"
expire_in: 1 week
paths:
- "src/openflexure_microscope/static/"
# Package application into distribution tarball
package:
stage: package
dependencies:
- build
- openapi
image: ubuntu:latest
script:
# Build distribution archive
- mkdir -p dist
- tar -c --exclude-vcs --exclude-from .tarignore -vzf dist/openflexure-microscope-server-${CI_COMMIT_REF_NAME}.tar.gz .
- tar -c --exclude-vcs --exclude-from .tarignore -vzf dist/openflexure-microscope-webapp-${CI_COMMIT_REF_NAME}.tar.gz ./openflexure_microscope_server/static/
- cp docs/build/swagger.yaml dist/openflexure-microscope-api-${CI_COMMIT_REF_NAME}.yaml
- cd dist/
- sha256sum openflexure-microscope-server-${CI_COMMIT_REF_NAME}.tar.gz > openflexure-microscope-server-${CI_COMMIT_REF_NAME}.tar.gz.sha256
- sha256sum openflexure-microscope-webapp-${CI_COMMIT_REF_NAME}.tar.gz > openflexure-microscope-webapp-${CI_COMMIT_REF_NAME}.tar.gz.sha256
- sha256sum openflexure-microscope-api-${CI_COMMIT_REF_NAME}.yaml > openflexure-microscope-api-${CI_COMMIT_REF_NAME}.yaml.sha256
artifacts:
name: "dist"
expire_in: 1 week
paths:
- "./dist/"
only:
- master
- merge_requests
- tags
- web
# Deploy to builds.openflexure.org
deploy:
stage: deploy
dependencies:
- package
image: ubuntu:latest
before_script:
- "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY_BATH_OPENFLEXURE_BASE64" | base64 --decode)
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
# Install rsync if not already installed
- "which rsync || ( apt-get update -y && apt-get install rsync -y )"
# Upload the builds folder to openflexure-microscope builds
- rsync -hrvz -e ssh dist/ ci-user@openflexure.bath.ac.uk:/var/www/build/openflexure-microscope-server
# Run update-latest.py on the build server
- ssh -t ci-user@openflexure.bath.ac.uk "/var/www/build/update-latest.py"
only:
- tags
- web
zenodo:
stage: deploy
image: ubuntu:20.04
before_script:
- apt-get update -qq
- apt-get -y -qq install git python3-pip
- pip3 install -r scripts/zenodo/requirements.txt
variables:
ZENODO_USE_SANDBOX: "false"
script:
- git archive "${CI_COMMIT_REF_NAME}" --format=zip --output="${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-source.zip"
- python3 scripts/zenodo/upload_to_zenodo.py "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-source.zip" dist/*
artifacts:
# this is only a small html link, let's just keep it forever
# gitlab doesn't understand "expire_in: never" yet though
expire_in: 100000 years
name: zenodo-${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-link.html
paths:
- zenodo-link.html
only:
- tags
- web