diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0ea57c477b9e90e9fac26a23020eb4166945f88b..8dad6176fbcf547677e6613cdcd427bce85e794a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -193,6 +193,7 @@ ci-authorized:
 
 include:
   - .gitlab-ci/lint.yml
+  - .gitlab-ci/shellcheck.yml
   - .gitlab-ci/gce.yml
   - .gitlab-ci/digital-ocean.yml
   - .gitlab-ci/terraform.yml
diff --git a/.gitlab-ci/shellcheck.yml b/.gitlab-ci/shellcheck.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5e3d5e802249c8e1c9a21b1c282e2c5892c56238
--- /dev/null
+++ b/.gitlab-ci/shellcheck.yml
@@ -0,0 +1,14 @@
+# TODO(miouge1): Include
+shellcheck:
+  extends: .job
+  stage: unit-tests
+  variables:
+    SHELLCHECK_VERSION: v0.6.0
+  before_script:
+    - curl --silent "https://storage.googleapis.com/shellcheck/shellcheck-"${SHELLCHECK_VERSION}".linux.x86_64.tar.xz" | tar -xJv
+    - cp shellcheck-"${SHELLCHECK_VERSION}"/shellcheck /usr/bin/
+    - shellcheck --version
+  script:
+    # Run shellcheck for all *.sh except contrib/
+    - find . -name '*.sh' -not -path './contrib/*' | xargs shellcheck --severity error
+  except: ['triggers', 'master']