diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e7324eeff303f8a0135aeead6a7693b0df11f143
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,105 @@
+stages:
+  - checks
+  - tests
+  - publish
+  - coverage
+
+variables:
+  DOCKER_IMAGE: "registry.duniter.org/docker/python3/poetry"
+
+image: $DOCKER_IMAGE/3.7:latest
+
+.code_changes:
+  only:
+    changes:
+      - bin/silkaj
+      - silkaj/*.py
+      - tests/*.py
+
+.changes:
+  extends: .code_changes
+  only:
+    changes:
+      - .gitlab-ci.yml
+      - pyproject.toml
+      - poetry.lock
+
+build:
+  extends: .changes
+  stage: checks
+  script:
+    - poetry install --no-dev
+    - poetry build
+
+format:
+  extends: .code_changes
+  stage: checks
+  image: $DOCKER_IMAGE/3.8:latest
+  script:
+    - black --check bin silkaj tests
+
+.type:
+  extends: .code_changes
+  stage: checks
+  script:
+    - poetry install
+    - poetry run mypy/pyright
+
+.tests:
+  extends: .changes
+  stage: tests
+  before_script:
+    - poetry install
+
+tests-3.5:
+  extends: .tests
+  image: $DOCKER_IMAGE/3.5:latest
+  script:
+    - poetry run pytest
+
+tests-3.6:
+  extends: .tests
+  image: $DOCKER_IMAGE/3.6:latest
+  script:
+    - poetry run pytest
+
+tests-3.7:
+  extends: .tests
+  image: $DOCKER_IMAGE/3.7:latest
+  script:
+    - poetry run pytest --cov silkaj --cov-report html:cov_html
+  artifacts:
+    paths:
+      - cov_html
+
+tests-3.8:
+  extends: .tests
+  image: $DOCKER_IMAGE/3.8:latest
+  script:
+    - poetry run pytest
+
+pypi_test:
+  stage: publish
+  when: manual
+  script:
+    - poetry install --no-dev
+    - poetry config repositories.pypi_test https://test.pypi.org/legacy/
+    - poetry publish --build --username Silkaj --password $PYPI_TEST_PASSWORD --repository pypi_test
+
+pypi:
+  stage: publish
+  only:
+    - tags
+  when: manual
+  script:
+    - poetry install --no-dev
+    - poetry publish --build --username GitLab --password $PYPI_PASSWORD
+
+pages:
+  extends: .code_changes
+  stage: coverage
+  script: mv cov_html/ public/
+  artifacts:
+    paths:
+      - public
+    expire_in: 2 days