diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..41716b6ba17ff993964ea3c5244d7f8344611bb1
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,68 @@
+stages:
+  - vendor
+  - test
+  - package
+  - publish
+
+.node:
+  tags: [docker]
+  stage: test
+  image: node:10
+  dependencies: [node_modules]
+  variables:
+    NPM_CONFIG_CACHE: "$CI_PROJECT_DIR/.npm"
+  script:
+    - npm run "$CI_JOB_NAME"
+
+node_modules:
+  extends: .node
+  stage: vendor
+  dependencies: []
+  script:
+    - npm install
+  artifacts:
+    name: $CI_JOB_NAME
+    expire_in: 1 day
+    paths:
+      - node_modules/
+  cache:
+    key: "$CI_COMMIT_REF_NAME-$CI_JOB_NAME"
+    paths:
+      - "$NPM_CONFIG_CACHE"
+
+lint:
+  extends: .node
+
+test:
+  extends: .node
+  before_script:
+    - apt-get update -yq
+    - apt-get install -yq --no-install-recommends xvfb firefox-esr xauth
+  script: xvfb-run npm run test
+  coverage: '/Lines.*:.*\d+\.\d+%/'
+  artifacts:
+    name: code-coverage
+    expire_in: 1 month
+    paths:
+      - coverage
+
+package:
+  extends: .node
+  stage: package
+  artifacts:
+    name: package
+    expire_in: 1 day
+    paths:
+      - dist/
+
+publish:
+  extends: .node
+  stage: publish
+  dependencies: [package]
+  only:
+    refs:
+      - tags
+  before_script:
+    - npm config set '//registry.npmjs.org/:_authToken' "$NPM_AUTH_TOKEN"
+  script:
+    - npm publish --access=public dist/ngx-debug