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: - "openflexure_microscope/api/static/dist/" # 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/api/static/dist/ - 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