diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1021198e9be50c2057231827495329f585cfa90b..24a8a2567ee19cc5bf67b7ba03e6922192f0c486 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -515,3 +515,33 @@ build-npm-cspell:
   extends: .build-with-kaniko
   variables:
     CONTAINER_PATH: npm-cspell
+
+oe-selftest-gcc:
+  # TODO(Chase): move to registry.ostc-eu.org/ostc/oniro/bitbake-builder:latest
+  # once the blocks to patch dockerfile solved.
+  # Tracking here https://gitlab.eclipse.org/eclipse/oniro-core/oniro/-/merge_requests/127
+  image:
+    name: chaseqi/bitbake-builder:latest
+  extends: .oe-selftest
+  variables:
+    CI_ONIRO_BUILD_FLAVOUR: linux
+    CI_ONIRO_OE_SEFLTESTS: gcc
+    MACHINE: qemux86-64
+  # TODO(Chase): discuss and resue the rules.
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "schedule"'
+      variables:
+        CI_ONIRO_MANIFEST_URL: "$CI_PROJECT_URL"
+        CI_ONIRO_MANIFEST_BRANCH: "$CI_COMMIT_REF_NAME"
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE =~ /^(wip|draft):.*/i'
+      when: manual
+      variables:
+        CI_ONIRO_MANIFEST_URL: "$CI_MERGE_REQUEST_SOURCE_PROJECT_URL"
+        CI_ONIRO_MANIFEST_BRANCH: "$CI_COMMIT_REF_NAME"
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+      # TODO(Chase): only trigger the test when manifests changed.
+      # changes:
+      #   - manifests/*.xml
+      variables:
+        CI_ONIRO_MANIFEST_URL: "$CI_MERGE_REQUEST_SOURCE_PROJECT_URL"
+        CI_ONIRO_MANIFEST_BRANCH: "$CI_COMMIT_REF_NAME"
diff --git a/.oniro-ci/build-generic.yaml b/.oniro-ci/build-generic.yaml
index efe0dcabc091323e547b5a28defdafe741d54441..1e2b7d69c6cd1bd31f2be924eacbbf0305e132f4 100644
--- a/.oniro-ci/build-generic.yaml
+++ b/.oniro-ci/build-generic.yaml
@@ -195,6 +195,21 @@
         time devtool finish --remove-work --force "$CI_ONIRO_DEVTOOL_RECIPE_NAME" "$(basename "$CI_ONIRO_DEVTOOL_LAYER_PATH")";
       fi
 
+# TODO(Chase) This job is documented in docs/ci/hidden-jobs/build-linux.rst
+.oe-selftest:
+  extends: .bitbake-workspace
+  variables:
+    CI_ONIRO_BUILD_FLAVOUR: linux
+    CI_ONIRO_OE_SEFLTESTS: ""
+    CI_ONIRO_BB_LOCAL_CONF_SANITY_TESTED_DISTROS: ""
+  script:
+    - test -n "$CI_ONIRO_OE_SEFLTESTS" || (
+        echo "nothing to test - CI_ONIRO_OE_SEFLTESTS is empty"
+        && exit 1 )
+    - !reference [.bitbake-workspace, script]
+    - |
+      time oe-selftest -vvv -r "$CI_ONIRO_OE_SEFLTESTS"
+
 # This job is documented in docs/ci/hidden-jobs/build-linux.rst
 .build-linux:
   extends: .bitbake-workspace