diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 6ff61549746a7125a9e2b070156b7a9f4ef758f2..f641071e3b9f03f87e4fa2ad1b11880e4fab93d6 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -631,6 +631,9 @@ jobs:
         run: |
           echo "Failed to restore Python virtual environment from cache"
           exit 1
+      - name: Register pylint problem matcher
+        run: |
+          echo "::add-matcher::.github/workflows/matchers/pylint.json"
       - name: Run pylint
         run: |
           . venv/bin/activate
diff --git a/.github/workflows/matchers/pylint.json b/.github/workflows/matchers/pylint.json
new file mode 100644
index 0000000000000000000000000000000000000000..5624ca695c4e0a117f65054d653d822c17897b25
--- /dev/null
+++ b/.github/workflows/matchers/pylint.json
@@ -0,0 +1,32 @@
+{
+  "problemMatcher": [
+    {
+      "owner": "pylint-error",
+      "severity": "error",
+      "pattern": [
+        {
+          "regexp": "^(.+):(\\d+):(\\d+):\\s(([EF]\\d{4}):\\s.+)$",
+          "file": 1,
+          "line": 2,
+          "column": 3,
+          "message": 4,
+          "code": 5
+        }
+      ]
+    },
+    {
+      "owner": "pylint-warning",
+      "severity": "warning",
+      "pattern": [
+        {
+          "regexp": "^(.+):(\\d+):(\\d+):\\s(([CRW]\\d{4}):\\s.+)$",
+          "file": 1,
+          "line": 2,
+          "column": 3,
+          "message": 4,
+          "code": 5
+        }
+      ]
+    }
+  ]
+}