diff --git a/bob/devtools/data/gitlab-ci/base-build.yaml b/bob/devtools/data/gitlab-ci/base-build.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ce5d395a3180021136ecc3bd0da1474ce2a43445
--- /dev/null
+++ b/bob/devtools/data/gitlab-ci/base-build.yaml
@@ -0,0 +1,49 @@
+# This YAML file contains descriptions for the CI of most of our Bob/BEAT/BATL
+# packages - do **not** modify it unless you know what you're doing (and up
+# to!)
+
+# Definition of global variables (all stages)
+variables:
+  CONDA_ROOT: "${CI_PROJECT_DIR}/miniconda"
+  BOOTSTRAP: "https://gitlab.idiap.ch/bob/bob.devtools/raw/master/bob/devtools/bootstrap.py"
+
+
+# Definition of our build pipeline order
+stages:
+  - build
+
+
+# Build targets
+.build_template: &build_job
+  stage: build
+  script:
+    - curl --silent "${BOOTSTRAP}" --output "bootstrap.py"
+    - python3 bootstrap.py -vv channel base
+    - source ${CONDA_ROOT}/etc/profile.d/conda.sh
+    - conda activate base
+    - bdt ci base-build -vv order.txt
+    - '[ "${CI_COMMIT_REF_NAME}" = "master" ] && bdt ci base-deploy -vv'
+    - bdt ci clean -vv
+  cache: &build_caches
+    paths:
+      - miniconda.sh
+      - ${CONDA_ROOT}/pkgs/*.tar.bz2
+      - ${CONDA_ROOT}/pkgs/urls.txt
+
+
+build_linux:
+  <<: *build_job
+  tags:
+    - docker
+  image: continuumio/conda-concourse-ci
+  cache:
+    <<: *build_caches
+    key: "linux-cache"
+
+build_macosx:
+  <<: *build_job
+  tags:
+    - macosx
+  cache:
+    <<: *build_caches
+    key: "macosx-cache"
diff --git a/bob/devtools/scripts/ci.py b/bob/devtools/scripts/ci.py
index ced320084cae86ffdb8fb24996747f842e509707..05cd57d5b7a54a7d1d8675f1c99b8a5e84ad9449 100644
--- a/bob/devtools/scripts/ci.py
+++ b/bob/devtools/scripts/ci.py
@@ -300,6 +300,57 @@ def pypi(package, dry_run):
         logger.info('%s: Deployed to PyPI - OK', k)
 
 
+@ci.command(epilog='''
+Examples:
+
+  1. Builds a list of packages (base dependencies) defined in a text file
+
+     $ bdt ci base-build -vv order.txt
+
+''')
+@click.argument('order', required=True, type=click.Path(file_okay=True,
+  dir_okay=False, exists=True), nargs=1)
+@click.option('-d', '--dry-run/--no-dry-run', default=False,
+    help='Only goes through the actions, but does not execute them ' \
+        '(combine with the verbosity flags - e.g. ``-vvv``) to enable ' \
+        'printing to help you understand what will be done')
+@verbosity_option()
+@bdt.raise_on_error
+def base_build(order, dry_run):
+  """Builds base (dependence) packages
+
+  This command builds dependence packages (packages that are not Bob/BEAT
+  packages) in the CI infrastructure.  It is **not** meant to be used outside
+  this context.
+  """
+
+  from ..constants import CONDA_BUILD_CONFIG
+  from ..build import base_build as _build
+
+  condarc = os.path.join(os.environ['CONDA_ROOT'], 'condarc')
+  logger.info('Loading (this build\'s) CONDARC file from %s...', condarc)
+  with open(condarc, 'rb') as f:
+    condarc_options = yaml.load(f)
+
+  # dump packages at conda_root
+  condarc_options['croot'] = os.path.join(os.environ['CONDA_ROOT'],
+      'conda-bld')
+
+  # loads dirnames from order file (accepts # comments and empty lines)
+  recipes = []
+  with open(order, 'rt') as f:
+    for line in f:
+      line = line.partition('#')[0].strip()
+      if line: recipes.append(line)
+
+  for recipe in recipes:
+    if not os.path.exists(os.path.join(recipe, 'meta.yaml')):
+      # ignore - not a conda package
+      continue
+    base_build(SERVER, True, recipe, CONDA_BUILD_CONFIG,
+        os.environ['PYTHON_VERSION'], args.python_version, condarc_options)
+
+
 @ci.command(epilog='''
 Examples:
 
diff --git a/conda/meta.yaml b/conda/meta.yaml
index 255ffca2116474ebf52421215c1826856ecdc9a0..b99a1a9b5095aabf63a3cb2fcd355f482dfdf3e7 100644
--- a/conda/meta.yaml
+++ b/conda/meta.yaml
@@ -58,18 +58,25 @@ test:
     - bdt -?
     - bdt --help
     - bdt lasttag --help
+      #- bdt lasttag -vv bob/bob.devtools
     - bdt changelog --help
+      #- bdt changelog -vv bob/bob.devtools changelog.md
     - bdt release --help
+      #- bdt release -vvd changelog.md
     - bdt visibility --help
+      #- bdt visibility -vv bob/bob.devtools
     - bdt dumpsphinx --help
     - bdt dumpsphinx https://docs.python.org/3/objects.inv > /dev/null
     - bdt create --help
     - bdt build --help
     - bdt getpath --help
+      #- bdt getpath -vv bob/bob.devtools .gitignore
     - bdt caupdate --help
     - bdt new --help
     - bdt new -t "New package" -o bob.foobar bob/bob.foobar "John Doe" "joe.doe@example.com"
+    - bdt new -t "New package" -o beat.foobar beat/beat.foobar "John Doe" "joe.doe@example.com"
     - bdt ci --help
+    - bdt ci base-build --help
     - bdt ci build --help
     - bdt ci base-deploy --help
     - bdt ci deploy --help
diff --git a/setup.py b/setup.py
index f1dd0ff7977904896aa53bacc9eb1446571f8395..3b9dca20482d7cfb712aca91f45e39c8b2a0f596 100644
--- a/setup.py
+++ b/setup.py
@@ -59,6 +59,7 @@ setup(
           ],
 
         'bdt.ci.cli': [
+          'base-build = bob.devtools.scripts.ci:base_build',
           'build = bob.devtools.scripts.ci:build',
           'clean = bob.devtools.scripts.ci:clean',
           'base-deploy = bob.devtools.scripts.ci:base_deploy',