diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fa03e1a3de4bc45483bcca49b09d04b2f78d4dab
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,67 @@
+stages:
+  - style
+  - tests
+  - quality
+  - build
+
+workflow:
+  rules:
+    - changes:
+      - node/**/*
+      - pallets/**/*
+      - runtime/**/*
+      - .gitlab-ci.yml
+      - Cargo.toml
+      - Cargo.lock
+
+.env:
+  image: paritytech/ci-linux:production
+  tags:
+    - elois-tauon
+
+rustfmt:
+  extends: .env
+  stage: style
+  rules:
+    - if: $CI_COMMIT_TAG
+      when: never
+    - if: $CI_MERGE_REQUEST_ID
+  script:
+    - cargo fmt -- --version
+    - cargo fmt -- --check
+
+tests:
+  extends: .env
+  rules:
+    - if: $CI_COMMIT_REF_NAME =~ /^wip*$/
+      when: manual
+    - if: $CI_COMMIT_TAG
+      when: never
+    - if: '$CI_MERGE_REQUEST_ID ||$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH =~ /^release/'
+    - when: manual
+  stage: tests
+  script:
+    - cargo test
+
+clippy:
+  extends: .env
+  rules:
+    - if: $CI_COMMIT_TAG
+      when: never
+    - if: $CI_MERGE_REQUEST_ID
+    - when: on_success
+  stage: quality
+  script:
+    - cargo clippy -- -V
+    - cargo clippy --all --tests -- -D warnings
+
+build:
+  extends: .env
+  rules:
+    - if: $CI_COMMIT_REF_NAME =~ /^wip*$/
+      when: manual
+    - if: '$CI_COMMIT_TAG || $CI_MERGE_REQUEST_ID ||$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH =~ /^release/'
+    - when: manual
+  stage: build
+  script:
+    - cargo build --release