diff --git a/.test-infra/jenkins/job_PreCommit_Portable_Python.groovy b/.test-infra/jenkins/job_PreCommit_Portable_Python.groovy
new file mode 100644
index 0000000000000000000000000000000000000000..1f268981c2f9771d2d29406687d9e2331f452d26
--- /dev/null
+++ b/.test-infra/jenkins/job_PreCommit_Portable_Python.groovy
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import PrecommitJobBuilder
+
+PrecommitJobBuilder builder = new PrecommitJobBuilder(
+    scope: this,
+    nameBase: 'Portable_Python',
+    gradleTask: ':portablePythonPreCommit',
+    triggerPathPatterns: [
+      '^model/.*$',
+      '^runners/.*$',
+      '^sdks/python/.*$',
+      '^release/.*$',
+    ]
+)
+builder.build {}
diff --git a/build.gradle b/build.gradle
index 269da86f8656a92ed960fb78de7c177cd005ad3a..a74817f70e8d51f083e8bb592b8ab0416da69ec3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -246,6 +246,10 @@ task pythonPostCommit() {
   dependsOn ":beam-sdks-python:postCommit"
 }
 
+task portablePythonPreCommit() {
+  dependsOn ":beam-sdks-python:portablePreCommit"
+}
+
 task websitePreCommit() {
   dependsOn ":beam-website:preCommit"
 }