diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1a5fbf0af68a3f9fd37ba297a58b85291179377b
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,38 @@
+image: hpvm/gitlab-ci
+variables:
+  GIT_SUBMODULE_STRATEGY: recursive
+  # Use a better compressor
+  FF_USE_FASTZIP: "true"
+  # output upload and download progress every 2 seconds
+  TRANSFER_METER_FREQUENCY: "2s"
+  # Use no compression for artifacts
+  CACHE_COMPRESSION_LEVEL: "fastest"
+cache:
+  key: "$CI_COMMIT_REF_SLUG"
+  paths:
+    - hpvm/build/
+    - hpvm/llvm/
+    - hpvm/test/dnn_benchmarks/model_params/
+
+build:
+  stage: build
+  tags:
+    - hpvm
+  script:
+    - pwd
+    - source activate hpvm && cd hpvm
+    - ./install.sh -j32 -t "X86" DCMAKE_BUILD_TYPE=Release
+    - cd ..
+  only:
+    changes:
+      - hpvm/scripts/hpvm_installer.py
+
+tests:
+  stage: test
+  tags:
+    - hpvm
+  script:
+    - pwd
+    - source activate hpvm && cd hpvm
+    - ./install.sh -j32 -t "X86" DCMAKE_BUILD_TYPE=Release
+    - cd build && make -j32 check-hpvm-pass
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..be6d1e0985998a369e994efc434ed3d417b26bc3
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,22 @@
+ARG IMAGE_NAME=nvidia/cuda
+FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
+
+# Install dependencies: python 3.6, curl, git, libboost
+RUN apt-get update && apt-get install -y --no-install-recommends python3 curl git libboost-dev
+
+# Install cmake
+RUN curl -L https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.sh -o cmake.sh && \
+    bash ./cmake.sh --skip-license --prefix=/usr && rm cmake.sh
+
+# Install conda
+RUN curl https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh -o anaconda.sh && \
+    bash anaconda.sh -b && rm anaconda.sh
+
+# Set PATH to include conda
+ENV PATH="/root/anaconda3/bin:${PATH}"
+
+# Send conda env spec into container
+COPY . /root/hpvm/
+
+# Create conda env named hpvm based on spec
+RUN conda env create -n hpvm -f /root/hpvm/hpvm/env.yaml
diff --git a/README.md b/README.md
index 7fb3736d8b631233cdc150a83b716564499f1e7b..ac589bb111e227c214339bb27d479527cc2972b2 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
 # The HPVM Compiler Infrastructure
 
 [![Documentation Status](https://readthedocs.org/projects/hpvm/badge/?version=latest)](https://hpvm.readthedocs.io/en/latest/?badge=latest)
+[![pipeline status](https://gitlab.engr.illinois.edu/llvm/hpvm/badges/approx_hpvm_devops/pipeline.svg)](https://gitlab.engr.illinois.edu/llvm/hpvm/-/commits/approx_hpvm_devops)
 
 This repository contains the source code and documentation for the HPVM Compiler Infrastructure.
 
diff --git a/hpvm/install.sh b/hpvm/install.sh
index dd737034f043e2022710a94982467e60456d2bd4..3676a61972ff32566102d0eebdb490f00eaccb4b 100755
--- a/hpvm/install.sh
+++ b/hpvm/install.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
-# Run installer script
-# Pass on args to installer that can parse them
+# Run installer script and pass on args to installer that can parse them
 scripts/hpvm_installer.py "$@"
-# Set path.
-export PATH=$BUILD_DIR/bin:$PATH
+ret_code=$?
+echo "Installer returned with code $ret_code"
+exit $ret_code
diff --git a/hpvm/scripts/hpvm_installer.py b/hpvm/scripts/hpvm_installer.py
index 26166d6b58443f65deb37b2c5a8370c35b91eeff..215db6e2a43103e893639ee5fdb96af80c33f426 100755
--- a/hpvm/scripts/hpvm_installer.py
+++ b/hpvm/scripts/hpvm_installer.py
@@ -7,7 +7,7 @@ from typing import List
 
 VERSION = "9.0.0"
 URL = "http://releases.llvm.org"
-WGET = "wget"
+DOWNLOADER = "curl"
 CLANG_DIR = f"cfe-{VERSION}.src"
 CLANG_TARBALL = f"{CLANG_DIR}.tar.xz"
 LLVM_DIR = f"llvm-{VERSION}.src"
@@ -181,7 +181,7 @@ def check_download_llvm_clang():
         else:
             print(f"Downloading {LLVM_TARBALL}...")
             print(f"=============================")
-            check_call([WGET, f"{URL}/{VERSION}/{LLVM_TARBALL}"])
+            download(f"{URL}/{VERSION}/{LLVM_TARBALL}", LLVM_TARBALL)
         check_call(["tar", "xf", LLVM_TARBALL])
         check_call(["mv", LLVM_DIR, "llvm"])
     tools = Path("llvm/tools")
@@ -196,7 +196,7 @@ def check_download_llvm_clang():
     chdir(tools)
     print(f"Downloading {CLANG_TARBALL}...")
     print(f"=============================")
-    check_call([WGET, f"{URL}/{VERSION}/{CLANG_TARBALL}"])
+    download(f"{URL}/{VERSION}/{CLANG_TARBALL}", CLANG_TARBALL)
     check_call(["tar", "xf", CLANG_TARBALL])
     check_call(["mv", CLANG_DIR, "clang"])
     assert Path("clang/").is_dir(), "Problem with clang download. Exiting!"
@@ -214,7 +214,7 @@ def check_download_model_params():
     else:
         print(f"Downloading DNN model parameters: {MODEL_PARAMS_TAR}...")
         print(f"=============================")
-        check_call([WGET, MODEL_PARAMS_LINK, "-O", MODEL_PARAMS_TAR])
+        download(MODEL_PARAMS_LINK, MODEL_PARAMS_TAR)
     print(
         f"Extracting DNN model parameters {MODEL_PARAMS_TAR} => {MODEL_PARAMS_DIR}..."
     )
@@ -310,6 +310,10 @@ def input_with_check(prompt: str, parse, prompt_when_invalid: str):
     return value
 
 
+def download(link: str, output: Path):
+    check_call(["curl", "-L", link, "-o", output])
+
+
 def main():
     from sys import argv