Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

  • f4e6509
  • /
  • .circleci
  • /
  • config.yml
Raw File Download

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
content badge
swh:1:cnt:3e710e8328b928be60f0d364b04a123f061c89a8
directory badge
swh:1:dir:4ed3d8124532530b0248d6753104a8a0e1ce2a93

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • content
  • directory
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
config.yml
version: 2.1

parameters:
  min_py_ver:
    type: string
    default: "3.7"
  max_py_ver:
    type: string
    default: "3.10"
  min_tf_ver:
    type: string
    default: "2.4"
  max_tf_ver:
    type: string
    default: "2.8"
  min_tfp_ver:
    type: string
    default: "0.12"
  max_tfp_ver:
    type: string
    default: "0.16"

commands:
  setup_venv:
    parameters:
      py_ver:
        type: string
    steps:
      - checkout
      - run:
          name: Setup virtual environment
          command: |
            # Run in a fresh virtual environment, to avoid conflicts with preinstalled packages.
            virtualenv -p python<<parameters.py_ver>> .venv
            source .venv/bin/activate
            pip install --progress-bar=off -U pip
  install_gpflow:
    parameters:
      py_ver:
        type: string
      tf_ver:
        type: string
      tfp_ver:
        type: string
    steps:
      - setup_venv:
          py_ver: <<parameters.py_ver>>
      - run:
          name: Install GPflow
          command: "
            source .venv/bin/activate \n
            # Everything is installed in one pip command, to allow for better dependency version
            # resolution. Explicit tensorflow and tensorflow-probability version, to ensure
            # consistency between them. \n
            pip install --progress-bar=off
              -e .
              -r tests_requirements.txt
              tensorflow==<<parameters.tf_ver>>
              tensorflow-probability==<<parameters.tfp_ver>> \n
          "
  run_tests:
    parameters:
      py_ver:
        type: string
      tf_ver:
        type: string
      tfp_ver:
        type: string
      pytest_filter:
        type: string
    steps:
      - install_gpflow:
          py_ver: <<parameters.py_ver>>
          tf_ver: <<parameters.tf_ver>>
          tfp_ver: <<parameters.tfp_ver>>
      - run:
          name: Run tests
          command: |
            source .venv/bin/activate
            pytest -v -W ignore::UserWarning --durations=10 -m "<<parameters.pytest_filter>>" --cov=./gpflow ./tests
      - run:
          name: Upload coverage report
          command: |
            source .venv/bin/activate
            bash <(curl -s https://codecov.io/bash) -t "${CODECOV_TOKEN}"

jobs:
  verify-install:
    parameters:
      py_ver:
        type: string
      tf_ver:
        type: string
      tfp_ver:
        type: string
    docker:
      - image: cimg/python:<<parameters.py_ver>>
    steps:
      - install_gpflow:
          py_ver: <<parameters.py_ver>>
          tf_ver: <<parameters.tf_ver>>
          tfp_ver: <<parameters.tfp_ver>>
      - run:
          name: Check installed dependencies are compatible
          command: |
            source .venv/bin/activate
            pip check -vvv
            python -c "import gpflow"

  type-check:
    parameters:
      py_ver:
        type: string
      tf_ver:
        type: string
      tfp_ver:
        type: string
    docker:
      - image: cimg/python:<<parameters.py_ver>>
    steps:
      - install_gpflow:
          py_ver: <<parameters.py_ver>>
          tf_ver: <<parameters.tf_ver>>
          tfp_ver: <<parameters.tfp_ver>>
      - run:
          name: Run type check
          command: |
            source .venv/bin/activate
            # Test without flags, as that is what our users are likely to do:
            mypy gpflow tests
            # Test with flags improves coverage:
            mypy $(python -m gpflow.mypy_flags) gpflow tests

  format-check:
    parameters:
      py_ver:
        type: string
      tf_ver:
        type: string
      tfp_ver:
        type: string
    docker:
      - image: cimg/python:<<parameters.py_ver>>
    steps:
      - install_gpflow:
          py_ver: <<parameters.py_ver>>
          tf_ver: <<parameters.tf_ver>>
          tfp_ver: <<parameters.tfp_ver>>
      - run:
          name: Run format check
          command: |
            source .venv/bin/activate
            make format-check

  unit-test:
    parameters:
      py_ver:
        type: string
      tf_ver:
        type: string
      tfp_ver:
        type: string
    docker:
      - image: cimg/python:<<parameters.py_ver>>
    steps:
      - run_tests:
          py_ver: <<parameters.py_ver>>
          tf_ver: <<parameters.tf_ver>>
          tfp_ver: <<parameters.tfp_ver>>
          pytest_filter: not notebooks and not docs

  notebook-test:
    parameters:
      py_ver:
        type: string
      tf_ver:
        type: string
      tfp_ver:
        type: string
    docker:
      - image: cimg/python:<<parameters.py_ver>>
    steps:
      - run_tests:
          py_ver: <<parameters.py_ver>>
          tf_ver: <<parameters.tf_ver>>
          tfp_ver: <<parameters.tfp_ver>>
          pytest_filter: notebooks

  docs-test:
    docker:
      # build-docs below use `max` version, so let's test with the same version we're going to use.
      - image: cimg/python:<<pipeline.parameters.max_py_ver>>
    steps:
      - run_tests:
          py_ver: <<pipeline.parameters.max_py_ver>>
          tf_ver: <<pipeline.parameters.max_tf_ver>>
          tfp_ver: <<pipeline.parameters.max_tfp_ver>>
          pytest_filter: docs

  build-docs:
    docker:
      # At the time of writing we cannot generate documentation for type numpy with older versions,
      # so we need to use `max` versions here.
      - image: cimg/python:<<pipeline.parameters.max_py_ver>>
        environment:
          DOCS: True  # This is used in gpflow/ci_utils.py
    steps:
      - install_gpflow:
          py_ver: <<pipeline.parameters.max_py_ver>>
          tf_ver: <<pipeline.parameters.max_tf_ver>>
          tfp_ver: <<pipeline.parameters.max_tfp_ver>>
      - run:
          name: Install pandoc
          command: |
            sudo apt update
            sudo apt install pandoc
      - run:
          name: Build documentation
          no_output_timeout: 60m
          command: |
            source .venv/bin/activate
            mkdir docs_tmp
            time python doc/build_docs.py <<pipeline.git.branch>> docs_tmp
      - add_ssh_keys:
          fingerprints:  # Add key to give write-access below
            - "b5:9b:f3:74:26:00:b3:c3:de:3a:b3:03:ee:0b:0b:64"
      - run:
          name: Commit documentation
          command: |
            source .venv/bin/activate

            git clone -b gh-pages git@github.com:GPflow/GPflow.git gh-pages

            for version in docs_tmp/*; do
                rm -rf gh-pages/docs/${version}
            done
            cp -r docs_tmp/* gh-pages/docs

            python doc/update_versions.py <<pipeline.git.branch>> gh-pages/docs

            cd gh-pages/docs

            git config user.email "docs.bot@gpflow.com"
            git config user.name "Docs Bot"
            git add .
            git commit -m "Build documentation for <<pipeline.git.branch>> [ci skip]"
            git push origin gh-pages

  deploy:
    docker:
      - image: cimg/python:<<pipeline.parameters.min_py_ver>>
    steps:
      - checkout
      - run:
          name: Verify git tag vs. VERSION
          command: |
            VERSION="v$(cat VERSION | tr -d '\t\r\n ')"
            if [ "$VERSION" != "$CIRCLE_TAG" ]; then
              echo "The package version ($VERSION) and the latest tag version ($CIRCLE_TAG) are different"
              exit 1
            fi
      - run:
          name: Install twine
          command: |
            # Run in a fresh virtual environment, to avoid conflicts with preinstalled packages.
            virtualenv -p python<<pipeline.parameters.min_py_ver>> .venv
            source .venv/bin/activate
            pip install --progress-bar=off -U pip
            pip install --progress-bar=off twine
      - run:
          name: Init .pypirc
          command: |
            echo -e "[pypi]" >> ~/.pypirc
            echo -e "username = artemav" >> ~/.pypirc
            echo -e "password = $PYPI_PASSWORD" >> ~/.pypirc
      - run:
          name: Create pip package
          command: |
            source .venv/bin/activate
            python setup.py bdist_wheel sdist
      - run:
          name: Upload to PyPI
          command: |
            source .venv/bin/activate
            twine upload dist/*

  noop:
    docker:
      - image: cimg/python:<<pipeline.parameters.min_py_ver>>
    steps:
      - run: echo ok


workflows:
  version: 2.1
  build_test_and_deploy:
    jobs:
      - verify-install:
          name: verify-install-min
          py_ver: <<pipeline.parameters.min_py_ver>>
          tf_ver: <<pipeline.parameters.min_tf_ver>>
          tfp_ver: <<pipeline.parameters.min_tfp_ver>>
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - verify-install:
          name: verify-install-max
          py_ver: <<pipeline.parameters.max_py_ver>>
          tf_ver: <<pipeline.parameters.max_tf_ver>>
          tfp_ver: <<pipeline.parameters.max_tfp_ver>>
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - type-check:
          name: type-check-min
          py_ver: <<pipeline.parameters.min_py_ver>>
          tf_ver: <<pipeline.parameters.min_tf_ver>>
          tfp_ver: <<pipeline.parameters.min_tfp_ver>>
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - type-check:
          name: type-check-max
          py_ver: <<pipeline.parameters.max_py_ver>>
          tf_ver: <<pipeline.parameters.max_tf_ver>>
          tfp_ver: <<pipeline.parameters.max_tfp_ver>>
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - format-check:
          name: format-check-min
          py_ver: <<pipeline.parameters.min_py_ver>>
          tf_ver: <<pipeline.parameters.min_tf_ver>>
          tfp_ver: <<pipeline.parameters.min_tfp_ver>>
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - format-check:
          name: format-check-max
          py_ver: <<pipeline.parameters.max_py_ver>>
          tf_ver: <<pipeline.parameters.max_tf_ver>>
          tfp_ver: <<pipeline.parameters.max_tfp_ver>>
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - docs-test:
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - noop:
          name: fast-tests
          requires:
            - verify-install-min
            - verify-install-max
            - type-check-min
            - type-check-max
            - format-check-min
            - format-check-max
            - docs-test
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - unit-test:
          name: unit-test-min
          py_ver: <<pipeline.parameters.min_py_ver>>
          tf_ver: <<pipeline.parameters.min_tf_ver>>
          tfp_ver: <<pipeline.parameters.min_tfp_ver>>
          requires:
            - fast-tests
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - unit-test:
          name: unit-test-max
          py_ver: <<pipeline.parameters.max_py_ver>>
          tf_ver: <<pipeline.parameters.max_tf_ver>>
          tfp_ver: <<pipeline.parameters.max_tfp_ver>>
          requires:
            - fast-tests
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - notebook-test:
          name: notebook-test-min
          py_ver: <<pipeline.parameters.min_py_ver>>
          tf_ver: <<pipeline.parameters.min_tf_ver>>
          tfp_ver: <<pipeline.parameters.min_tfp_ver>>
          requires:
            - fast-tests
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - notebook-test:
          name: notebook-test-max
          py_ver: <<pipeline.parameters.max_py_ver>>
          tf_ver: <<pipeline.parameters.max_tf_ver>>
          tfp_ver: <<pipeline.parameters.max_tfp_ver>>
          requires:
            - fast-tests
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - noop:
          name: all-tests
          requires:
            - fast-tests
            - unit-test-min
            - unit-test-max
            - notebook-test-min
            - notebook-test-max
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
      - build-docs:
          requires:
            - all-tests
          filters:
            branches:
              only:
                - master
                - develop
      - deploy:
          requires:
            - all-tests
          filters:
            tags:
              only: /^v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/
            branches:
              ignore: /.*/

back to top

Software Heritage — Copyright (C) 2015–2026, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Content policy— Contact— JavaScript license information— Web API