diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index faf78ae4025dad1502d83df9165f5ed99f620e1f..c721f373f78131de8076c37b18cc1cac81a16ee7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,19 +5,26 @@ cache:
     - vendor/ruby
 
 lint:rubocop:
-  image: ruby
+  image: ghcr.io/ruby/ruby
   script:
     - gem install rubocop -N
     - rubocop lib
 
-.test:
+test:unit:
   before_script:
     - sed -e 's/# gem /gem /' -i Gemfile
     - gem install bundler -N
     - bundle install -j $(nproc) --path vendor
   coverage: '/\((\d+(?:.\d+)?)\%\) covered/'
+  image: ghcr.io/ruby/ruby:$RUBY
   script:
     - GENERATE_REPORTS=true CI_REPORTS=reports bundle exec rake test
+  parallel:
+    matrix:
+      - RUBY:
+          - 3.0
+          - 3.1
+          - 3.2
   artifacts:
     expire_in: 1 week
     paths:
@@ -25,20 +32,8 @@ lint:rubocop:
     reports:
       junit: "reports/TEST-*.xml"
 
-test:ruby2.7:
-  extends: .test
-  image: "ruby:2.7"
-
-test:ruby3.0:
-  extends: .test
-  image: "ruby:3.0"
-
-test:ruby3.1:
-  extends: .test
-  image: "ruby:3.1"
-
 pages:
-  image: ruby
+  image: ghcr.io/ruby/ruby
   stage: deploy
   needs: []
   script: