diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 51ca7c924c575d4e6fe6976dc5655a245b852381..d8329a8ccb421239c56847621ed1cafca4be86c8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,27 +6,60 @@ workflow:
   rules:
     - if: $CI_PIPELINE_SOURCE == "push"
 
-test:
-  rules:
-    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
+stages:
+  - build
+  - test
+  - publish
+
+build_conda:
+  stage: build
+  script:
+    - mamba env create --force -f environment.yml
+    - echo $CONDA_DEFAULT_ENV
+
+build_docker:
+  stage: build
+  before_script:
+    - export IMAGE="${DOCKER_ORG}/${DOCKER_REPO}"
+    - export BUILD_TAG="build"
+    - echo "IMAGE=$IMAGE" >> build.env
+    - echo "BUILD_TAG=$BUILD_TAG" >> build.env
+  script:
+    - docker build -t ${IMAGE}:${BUILD_TAG} .
+  artifacts:
+    reports:
+      dotenv: build.env
+
+test_conda:
+  stage: test
+  needs:
+    job: build_conda
+  before_script:
+    - conda activate ascii-alignment-pileup
+  script:
+    - tests/test.sh
+
+test_docker:
+  stage: test
+  needs:
+    - job: build_docker
+      artifacts: true
   script:
-    - export IMAGE="${DOCKER_ORG}/${DOCKER_REPO}:latest"
-    - docker build -t $IMAGE .
-    - docker run --rm $IMAGE tests/test.sh
+    - docker run --rm ${IMAGE}:${BUILD_TAG} tests/test.sh
 
-test_and_publish:
+publish_docker:
+  stage: publish
   rules:
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-  script:
+  needs:
+    - job: build_docker
+      artifacts: true
+    - job: test_docker
+  before_script:
     - export VERSION=$(grep 'version <-' ascii_alignment_pileup.R | cut -f2 -d'"')
-    - export IMAGE="${DOCKER_ORG}/${DOCKER_REPO}"
-    - |
-      docker build \
-      -t ${IMAGE}:${VERSION} \
-      --build-arg version=$VERSION \
-      .
-    - docker run --rm ${IMAGE}:${VERSION} tests/test.sh
+  script:
     - echo "${DOCKER_TOKEN}" | docker login -u "${DOCKER_USER}" --password-stdin
-    - docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest
+    - docker tag ${IMAGE}:${BUILD_TAG} ${IMAGE}:${VERSION}
+    - docker tag ${IMAGE}:${BUILD_TAG} ${IMAGE}:latest
     - docker push ${IMAGE}:${VERSION}
     - docker push ${IMAGE}:latest
diff --git a/environment.yml b/environment.yml
index 3452990d3e3ae7a475f63debd191e66c83a857ed..cc5c4d680923e6e41340d02f755e38bd8c11eddb 100644
--- a/environment.yml
+++ b/environment.yml
@@ -1,6 +1,7 @@
 name: ascii-alignment-pileup
 channels:
   - bioconda
+  - conda-forge
 dependencies:
   - r-optparse=1.7.1
   - bioconductor-rtracklayer=1.54.0