#############################################################################
# This file defines the build process for fslpy, as hosted at:
#
#    https://git.fmrib.ox.ac.uk/fsl/fslpy
#
# The build pipeline comprises the following stages:
#
#    1. test:   Unit tests
#
#    2. style:  Check coding style
#
#    3. doc:    Building API documentation
#
#    4. build:  Building source, wheel and conda distributions
#
#    5. deploy: Uploading the build outputs to pypi/hosting servers, and the
#               documentation to a hosting server.
#
# Custom docker images are used for several jobs - these images are
# available at:
#
#    https://hub.docker.com/u/pauldmccarthy/
#
# The test and style stages are executed on all branches of upstream and fork
# repositories.
#
# The doc stage, and the deploy-doc job, is executed on all branches of the
# upstream repository.
#
# The build stage, and the remaining jobs in the deploy stage, are only
# executed on the upstream repository, and only for release tags.
#
# The deploy stages are manually instantiated.
#
# Most of the logic for each job is defined in shell scripts in the .ci
# sub-directory.
#############################################################################


stages:
 - test
 - style
 - doc
 - build
 - deploy


#################################################################################
# A number of variables must be set for the jobs to work. The following
# variables are implicitly defined in any gitlab CI job:
#
#   - CI_PROJECT_PATH    - gitlab namespace/project
#   - CI_COMMIT_REF_NAME - branch name, provided by gitlab
#   - CI_COMMIT_TAG      - present if build is running on a tag
#
# These variables must be explicitly set as "secret" variables:
#
#   - SSH_PRIVATE_KEY_GIT            - private key for git login to remote host
#                                      (UPSTREAM_URL)
#
#   - SSH_PRIVATE_KEY_FSL_DOWNLOAD   - private key for downloading some FSL
#                                      files from a remote server (FSL_HOST)
#
#   - SSH_PRIVATE_KEY_DOC_DEPLOY     - private key for rsyncing documentation
#                                      to remote host (DOC_HOST)
#
#   - SSH_PRIVATE_KEY_CONDA_DEPLOY   - private key for rsyncing conda builds
#                                      to remote host (CONDA_HOST)
#
#   - SSH_SERVER_HOSTKEYS            - List of trusted SSH hosts
#
#   - DOC_HOST:                      - Username@host to upload documentation to
#                                      (e.g. "paulmc@jalapeno.fmrib.ox.ac.uk")
#
#   - FSL_HOST:                      - Username@host to download FSL data from
#                                      (e.g. "paulmc@jalapeno.fmrib.ox.ac.uk")
#
#   - CONDA_HOST:                    - Username@host to upload conda build to
#                                      (e.g. "paulmc@jalapeno.fmrib.ox.ac.uk")
#
#   - CONDA_CHANNELS                 - List of additional conda channels to
#                                      use for conda build.
#
#   - TWINE_USERNAME:                - Username to use when uploading to pypi
#
#   - TWINE_PASSWORD:                - Password to use when uploading to pypi
#
#   - TWINE_REPOSITORY_URL:          - Pypi repository to upload to
###############################################################################


variables:
  UPSTREAM_PROJECT: "fsl/fslpy"
  UPSTREAM_URL:     "git@git.fmrib.ox.ac.uk"


####################################
# These anchors are used to restrict
# when and where jobs are executed.
####################################


.only_upstream: &only_upstream
  only:
    - branches@fsl/fslpy


.only_master: &only_master
  only:
    - master@fsl/fslpy


.only_releases: &only_releases
  only:
    - tags@fsl/fslpy


.except_releases: &except_releases
  except:
    - tags


.setup_ssh: &setup_ssh
  before_script:
    - bash ./.ci/setup_ssh.sh


###################################################
# The patch_version anchor contains a before_script
# section which is run on release builds, and makes
# sure that the version in the code is up to date
# (i.e. equal to the tag name).
###################################################


.patch_version: &patch_version
  before_script:
    - bash ./.ci/patch_version.sh


############
# Test stage
############


.test: &test_template
  <<: *setup_ssh

  # Releases are just tags on a release
  # branch, so we don't need to test them.
  <<: *except_releases

  tags:
    - docker

  script:
    - bash ./.ci/test_template.sh


test:2.7:
  stage: test
  image: pauldmccarthy/fsleyes-py27-wxpy4-gtk2
  <<: *test_template


test:3.4:
  stage: test
  image: pauldmccarthy/fsleyes-py34-wxpy4-gtk2
  <<: *test_template


test:3.5:
  stage: test
  image: pauldmccarthy/fsleyes-py35-wxpy4-gtk2
  <<: *test_template


test:3.6:
  stage: test
  image: pauldmccarthy/fsleyes-py36-wxpy4-gtk2
  <<: *test_template


#############
# Style stage
#############


style:
  stage: style
  image: pauldmccarthy/fsleyes-py35-wxpy4-gtk2
  <<: *test_template
  variables:
    TEST_STYLE:  "true"


###########
# Doc stage
###########

build-doc:
  <<: *only_upstream
  <<: *patch_version

  tags:
   - docker

  stage: doc
  image: python:3.5

  script:
    - bash ./.ci/build_doc.sh

  artifacts:
    expire_in: 1 day
    paths:
      - doc/$CI_COMMIT_REF_NAME


#############
# Build stage
#############


build-pypi-dist:
  <<: *only_releases
  <<: *patch_version

  stage: build
  image: python:3.5

  tags:
    - docker

  script:
   - bash ./.ci/build_pypi_dist.sh

  artifacts:
    expire_in: 1 day
    paths:
      - dist/*


build-conda-dist:
  <<: *only_releases
  <<: *patch_version

  stage: build
  image: continuumio/miniconda3

  tags:
    - docker

  script:
   - bash ./.ci/build_conda_dist.sh fslpy "$CI_COMMIT_REF_NAME"

  artifacts:
    expire_in: 1 day
    paths:
      - dist/conda-bld


##############
# Deploy stage
##############


deploy-doc:
  <<: *only_upstream
  <<: *setup_ssh
  stage: deploy
  when:  manual
  image: python:3.5

  tags:
    - docker

  dependencies:
    - build-doc

  script:
    - bash ./.ci/deploy_doc.sh


deploy-pypi:
  <<: *only_releases
  <<: *setup_ssh
  stage: deploy
  when:  manual
  image: python:3.5

  tags:
    - docker

  dependencies:
    - build-pypi-dist

  script:
    - bash ./.ci/deploy_pypi.sh



deploy-conda:
  <<: *only_releases
  <<: *setup_ssh
  stage: deploy
  when:  manual
  image: python:3.5

  tags:
    - docker

  dependencies:
    - build-conda-dist

  script:
    - bash ./.ci/deploy_conda.sh