You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by tv...@apache.org on 2022/04/21 15:07:47 UTC

[beam] branch master updated: [BEAM-13657] Sunset python 3.6 (#17252)

This is an automated email from the ASF dual-hosted git repository.

tvalentyn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new 378338c1940 [BEAM-13657] Sunset python 3.6 (#17252)
378338c1940 is described below

commit 378338c1940109aba2fa9277d7c4079ed5d6168f
Author: Anand Inguva <34...@users.noreply.github.com>
AuthorDate: Thu Apr 21 15:07:40 2022 +0000

    [BEAM-13657] Sunset python 3.6 (#17252)
---
 .github/workflows/build_wheels.yml                 |   8 +-
 .github/workflows/python_tests.yml                 |   5 +-
 .test-infra/jenkins/PythonTestProperties.groovy    |   1 -
 .test-infra/jenkins/README.md                      |   3 +-
 .../job_PostCommit_PortableJar_Flink.groovy        |   1 -
 .../jenkins/job_PreCommit_Portable_Python.groovy   |   2 +-
 build.gradle.kts                                   |  11 +-
 .../org/apache/beam/gradle/BeamModulePlugin.groovy |   1 -
 sdks/python/container/build.gradle                 |   3 -
 .../container/py36/base_image_requirements.txt     | 159 ---------------------
 sdks/python/container/py36/build.gradle            |  28 ----
 sdks/python/container/run_validatescontainer.sh    |   2 -
 sdks/python/setup.py                               |   3 +-
 sdks/python/test-suites/dataflow/py36/build.gradle |  24 ----
 sdks/python/test-suites/direct/py36/build.gradle   |  24 ----
 sdks/python/test-suites/gradle.properties          |   2 +-
 sdks/python/test-suites/portable/py36/build.gradle |  26 ----
 sdks/python/test-suites/tox/py36/build.gradle      |  32 -----
 sdks/python/tox.ini                                |  14 +-
 settings.gradle.kts                                |   5 -
 20 files changed, 18 insertions(+), 336 deletions(-)

diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml
index a3ff21bb668..f2066b14e18 100644
--- a/.github/workflows/build_wheels.yml
+++ b/.github/workflows/build_wheels.yml
@@ -207,13 +207,13 @@ jobs:
     strategy:
       matrix:
         os_python: [
-          {"os": "ubuntu-latest", "python": "cp36-* cp37-* cp38-* cp39-*"},
-          {"os": "macos-latest", "python": "cp36-* cp37-* cp38-* cp39-*"},
-          {"os": "windows-latest", "python": "cp36-* cp37-* cp38-* cp39-*"},
+          {"os": "ubuntu-latest", "python": "cp37-* cp38-* cp39-*"},
+          {"os": "macos-latest", "python": "cp37-* cp38-* cp39-*"},
+          {"os": "windows-latest", "python": "cp37-* cp38-* cp39-*"},
         ]
         arch: [auto]
         include:
-          - os_python: {"os": "ubuntu-latest", "python": "cp36-* cp37-* cp38-* cp39-*"}
+          - os_python: {"os": "ubuntu-latest", "python": "cp37-* cp38-* cp39-*"}
             arch: aarch64
     steps:
     - name: Download python source distribution from artifacts
diff --git a/.github/workflows/python_tests.yml b/.github/workflows/python_tests.yml
index dc6905e2410..e0eea31b379 100644
--- a/.github/workflows/python_tests.yml
+++ b/.github/workflows/python_tests.yml
@@ -97,7 +97,6 @@ jobs:
       matrix:
         os: [ubuntu-latest, macos-latest, windows-latest]
         params: [
-          {"py_ver": "3.6", "tox_env": "py36"},
           {"py_ver": "3.7", "tox_env": "py37"},
           {"py_ver": "3.8", "tox_env": "py38"},
           {"py_ver": "3.9", "tox_env": "py39"},
@@ -136,7 +135,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ubuntu-latest, macos-latest, windows-latest]
-        python: [3.6, 3.7, 3.8, 3.9]
+        python: [3.7, 3.8, 3.9]
     steps:
       - name: Checkout code
         uses: actions/checkout@v2
@@ -164,7 +163,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ubuntu-latest, macos-latest, windows-latest]
-        python: [3.6, 3.7, 3.8, 3.9]
+        python: [3.7, 3.8, 3.9]
     steps:
       - name: Checkout code
         uses: actions/checkout@v2
diff --git a/.test-infra/jenkins/PythonTestProperties.groovy b/.test-infra/jenkins/PythonTestProperties.groovy
index e61cffad47d..06e32ff4881 100644
--- a/.test-infra/jenkins/PythonTestProperties.groovy
+++ b/.test-infra/jenkins/PythonTestProperties.groovy
@@ -20,7 +20,6 @@ class PythonTestProperties {
   // Indicates all supported Python versions.
   // This must be sorted in ascending order.
   final static List<String> ALL_SUPPORTED_VERSIONS = [
-    '3.6',
     '3.7',
     '3.8',
     '3.9'
diff --git a/.test-infra/jenkins/README.md b/.test-infra/jenkins/README.md
index e878743ba12..ab59c0c34f6 100644
--- a/.test-infra/jenkins/README.md
+++ b/.test-infra/jenkins/README.md
@@ -118,7 +118,6 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/)
 | beam_PostCommit_Python_Chicago_Taxi_Example_Flink | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_Chicago_Taxi_Flink/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_Chicago_Taxi_Flink_PR/) | `Run Chicago Taxi on Flink` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_Chicago_Taxi_Flink/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_Chicago_Taxi_Flink) |
 | beam_PostCommit_Python_MongoDBIO_IT | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_MongoDBIO_IT), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_MongoDBIO_IT_PR/) | `Run Python MongoDBIO_IT` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_MongoDBIO_IT/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_MongoDBIO_IT) |
 | beam_PostCommit_Python_VR_Spark | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark/) | `Run Python Spark ValidatesRunner` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python_VR_Spark) |
-| beam_PostCommit_Python36 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python36), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python36_PR/) | `Run Python 3.6 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python36/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python36) |
 | beam_PostCommit_Python37 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python37), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python37_PR/) | `Run Python 3.7 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python37/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python37) |
 | beam_PostCommit_Python38 | [cron](https://ci-beam.apache.org/job/beam_PostCommit_Python38), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_Python38_PR/) | `Run Python 3.8 PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_Python38/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_Python38) |
 | beam_PostCommit_SQL | [cron](https://ci-beam.apache.org/job/beam_PostCommit_SQL/), [phrase](https://ci-beam.apache.org/job/beam_PostCommit_SQL_PR/) | `Run SQL PostCommit` | [![Build Status](https://ci-beam.apache.org/job/beam_PostCommit_SQL/badge/icon)](https://ci-beam.apache.org/job/beam_PostCommit_SQL) |
@@ -253,4 +252,4 @@ Beam Jenkins overview page: [link](https://ci-beam.apache.org/)
 retest this please
 ```
 
-* Last update (mm/dd/yyyy): 25/01/2022
+* Last update (mm/dd/yyyy): 04/04/2022
diff --git a/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy b/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy
index 856b7bf1e4d..1332b61ccb0 100644
--- a/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy
+++ b/.test-infra/jenkins/job_PostCommit_PortableJar_Flink.groovy
@@ -31,7 +31,6 @@ PostcommitJobBuilder.postCommitJob('beam_PostCommit_PortableJar_Flink',
       steps {
         gradle {
           rootBuildScriptDir(commonJobProperties.checkoutDir)
-          tasks(':sdks:python:test-suites:portable:py36:testPipelineJarFlinkRunner')
           tasks(':sdks:python:test-suites:portable:py37:testPipelineJarFlinkRunner')
           commonJobProperties.setGradleSwitches(delegate)
         }
diff --git a/.test-infra/jenkins/job_PreCommit_Portable_Python.groovy b/.test-infra/jenkins/job_PreCommit_Portable_Python.groovy
index d9fd7dc003e..c11e6848167 100644
--- a/.test-infra/jenkins/job_PreCommit_Portable_Python.groovy
+++ b/.test-infra/jenkins/job_PreCommit_Portable_Python.groovy
@@ -43,7 +43,7 @@ builder.build {
   steps {
     gradle {
       rootBuildScriptDir(commonJobProperties.checkoutDir)
-      tasks(':sdks:python:test-suites:portable:py36:preCommitPy36')
+      tasks(':sdks:python:test-suites:portable:py37:preCommitPy37')
       commonJobProperties.setGradleSwitches(delegate)
     }
     gradle {
diff --git a/build.gradle.kts b/build.gradle.kts
index b874a9f8722..7b31c9db20c 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -269,7 +269,6 @@ tasks.register("playgroundPreCommit") {
 
 tasks.register("pythonPreCommit") {
   dependsOn(":sdks:python:test-suites:tox:pycommon:preCommitPyCommon")
-  dependsOn(":sdks:python:test-suites:tox:py36:preCommitPy36")
   dependsOn(":sdks:python:test-suites:tox:py37:preCommitPy37")
   dependsOn(":sdks:python:test-suites:tox:py38:preCommitPy38")
   dependsOn(":sdks:python:test-suites:tox:py39:preCommitPy39")
@@ -282,7 +281,6 @@ tasks.register("pythonDocsPreCommit") {
 }
 
 tasks.register("pythonDockerBuildPreCommit") {
-  dependsOn(":sdks:python:container:py36:docker")
   dependsOn(":sdks:python:container:py37:docker")
   dependsOn(":sdks:python:container:py38:docker")
   dependsOn(":sdks:python:container:py39:docker")
@@ -297,12 +295,6 @@ tasks.register("pythonFormatterPreCommit") {
   dependsOn("sdks:python:test-suites:tox:py38:formatter")
 }
 
-tasks.register("python36PostCommit") {
-  dependsOn(":sdks:python:test-suites:dataflow:py36:postCommitIT")
-  dependsOn(":sdks:python:test-suites:direct:py36:postCommitIT")
-  dependsOn(":sdks:python:test-suites:portable:py36:postCommitPy36")
-}
-
 tasks.register("python37PostCommit") {
   dependsOn(":sdks:python:test-suites:dataflow:py37:postCommitIT")
   dependsOn(":sdks:python:test-suites:direct:py37:postCommitIT")
@@ -330,12 +322,11 @@ tasks.register("python39PostCommit") {
 }
 
 tasks.register("portablePythonPreCommit") {
-  dependsOn(":sdks:python:test-suites:portable:py36:preCommitPy36")
+  dependsOn(":sdks:python:test-suites:portable:py37:preCommitPy37")
   dependsOn(":sdks:python:test-suites:portable:py39:preCommitPy39")
 }
 
 tasks.register("pythonSparkPostCommit") {
-  dependsOn(":sdks:python:test-suites:portable:py36:sparkValidatesRunner")
   dependsOn(":sdks:python:test-suites:portable:py37:sparkValidatesRunner")
   dependsOn(":sdks:python:test-suites:portable:py38:sparkValidatesRunner")
   dependsOn(":sdks:python:test-suites:portable:py39:sparkValidatesRunner")
diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
index b2fd743f37f..795f15bc227 100644
--- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
+++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
@@ -2628,7 +2628,6 @@ class BeamModulePlugin implements Plugin<Project> {
           mustRunAfter = [
             ":runners:flink:${project.ext.latestFlinkVersion}:job-server:shadowJar",
             ':runners:spark:2:job-server:shadowJar',
-            ':sdks:python:container:py36:docker',
             ':sdks:python:container:py37:docker',
             ':sdks:python:container:py38:docker',
             ':sdks:python:container:py39:docker',
diff --git a/sdks/python/container/build.gradle b/sdks/python/container/build.gradle
index 3d147ab7578..4b7f0300a15 100644
--- a/sdks/python/container/build.gradle
+++ b/sdks/python/container/build.gradle
@@ -36,21 +36,18 @@ goBuild {
 }
 
 tasks.register("buildAll") {
-  dependsOn ':sdks:python:container:py36:docker'
   dependsOn ':sdks:python:container:py37:docker'
   dependsOn ':sdks:python:container:py38:docker'
   dependsOn ':sdks:python:container:py39:docker'
 }
 
 tasks.register("pushAll") {
-  dependsOn ':sdks:python:container:py36:dockerPush'
   dependsOn ':sdks:python:container:py37:dockerPush'
   dependsOn ':sdks:python:container:py38:dockerPush'
   dependsOn ':sdks:python:container:py39:dockerPush'
 }
 
 tasks.register("generatePythonRequirementsAll") {
-  dependsOn ':sdks:python:container:py36:generatePythonRequirements'
   dependsOn ':sdks:python:container:py37:generatePythonRequirements'
   dependsOn ':sdks:python:container:py38:generatePythonRequirements'
   dependsOn ':sdks:python:container:py39:generatePythonRequirements'
diff --git a/sdks/python/container/py36/base_image_requirements.txt b/sdks/python/container/py36/base_image_requirements.txt
deleted file mode 100644
index 6407dfadf9f..00000000000
--- a/sdks/python/container/py36/base_image_requirements.txt
+++ /dev/null
@@ -1,159 +0,0 @@
-#    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.
-
-# Autogenerated requirements file for Apache Beam py36 container image.
-# Run ./gradlew :sdks:python:container:generatePythonRequirementsAll to update.
-# Do not edit manually, adjust ../base_image_requirements_manual.txt or
-# Apache Beam's setup.py instead, and regenerate the list.
-# You will need Python intepreters for all versions supported by Beam, see:
-# https://s.apache.org/beam-python-dev-wiki
-# Reach out to a committer if you need help.
-
-absl-py==0.15.0
-astunparse==1.6.3
-atomicwrites==1.4.0
-attrs==21.4.0
-beautifulsoup4==4.10.0
-bs4==0.0.1
-cached-property==1.5.2
-cachetools==4.2.4
-certifi==2021.10.8
-cffi==1.15.0
-charset-normalizer==2.0.12
-clang==5.0
-click==8.0.4
-cloudpickle==2.0.0
-crcmod==1.7
-cryptography==36.0.2
-Cython==0.29.28
-dataclasses==0.8
-deprecation==2.1.0
-dill==0.3.1.1
-docker==5.0.3
-docopt==0.6.2
-execnet==1.9.0
-fastavro==1.4.7
-fasteners==0.17.3
-flatbuffers==1.12
-freezegun==1.2.1
-future==0.18.2
-gast==0.4.0
-google-api-core==1.31.5
-google-api-python-client==2.41.0
-google-apitools==0.5.31
-google-auth==1.35.0
-google-auth-httplib2==0.1.0
-google-auth-oauthlib==0.4.6
-google-cloud-bigquery==2.34.2
-google-cloud-bigquery-storage==2.13.0
-google-cloud-bigtable==1.7.0
-google-cloud-core==1.7.2
-google-cloud-datastore==1.15.3
-google-cloud-dlp==3.6.2
-google-cloud-language==1.3.0
-google-cloud-profiler==3.0.7
-google-cloud-pubsub==2.11.0
-google-cloud-pubsublite==1.4.1
-google-cloud-recommendations-ai==0.2.0
-google-cloud-spanner==1.19.1
-google-cloud-videointelligence==1.16.1
-google-cloud-vision==1.0.0
-google-crc32c==1.3.0
-google-pasta==0.2.0
-google-python-cloud-debugger==2.18
-google-resumable-media==2.3.2
-googleapis-common-protos==1.56.0
-greenlet==1.1.2
-grpc-google-iam-v1==0.12.3
-grpcio==1.44.0
-grpcio-gcp==0.2.2
-grpcio-status==1.44.0
-guppy3==3.1.2
-h5py==3.1.0
-hdfs==2.6.0
-httplib2==0.19.1
-idna==3.3
-importlib-metadata==4.8.3
-importlib-resources==5.4.0
-joblib==1.1.0
-keras==2.6.0
-Keras-Preprocessing==1.1.2
-Markdown==3.3.6
-mmh3==3.0.0
-mock==2.0.0
-more-itertools==8.12.0
-nltk==3.6.7
-nose==1.3.7
-numpy==1.19.5
-oauth2client==4.1.3
-oauthlib==3.2.0
-opt-einsum==3.3.0
-orjson==3.6.1
-overrides==6.1.0
-packaging==21.3
-pandas==1.1.5
-parameterized==0.7.5
-pbr==5.8.1
-pluggy==0.13.1
-proto-plus==1.20.3
-protobuf==3.19.4
-psycopg2-binary==2.9.3
-py==1.11.0
-pyarrow==6.0.1
-pyasn1==0.4.8
-pyasn1-modules==0.2.8
-pycparser==2.21
-pydot==1.4.2
-PyHamcrest==1.10.1
-pymongo==3.12.3
-PyMySQL==1.0.2
-pyparsing==2.4.7
-pytest==4.6.11
-pytest-forked==1.4.0
-pytest-timeout==1.4.2
-pytest-xdist==1.34.0
-python-dateutil==2.8.2
-python-snappy==0.6.1
-pytz==2022.1
-PyYAML==6.0
-regex==2022.3.15
-requests==2.27.1
-requests-mock==1.9.3
-requests-oauthlib==1.3.1
-rsa==4.8
-scikit-learn==0.24.2
-scipy==1.5.4
-six==1.15.0
-soupsieve==2.3.1
-SQLAlchemy==1.4.32
-tenacity==5.1.5
-tensorboard==2.6.0
-tensorboard-data-server==0.6.1
-tensorboard-plugin-wit==1.8.1
-tensorflow==2.6.2
-tensorflow-estimator==2.6.0
-termcolor==1.1.0
-testcontainers==3.4.2
-threadpoolctl==3.1.0
-tqdm==4.63.0
-typing-extensions==3.7.4.3
-typing-utils==0.1.0
-uritemplate==4.1.1
-urllib3==1.26.9
-wcwidth==0.2.5
-websocket-client==1.3.1
-Werkzeug==2.0.3
-wrapt==1.12.1
-zipp==3.6.0
diff --git a/sdks/python/container/py36/build.gradle b/sdks/python/container/py36/build.gradle
deleted file mode 100644
index 20fe8755bf5..00000000000
--- a/sdks/python/container/py36/build.gradle
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.
- */
-
-plugins {
-  id 'base'
-  id 'org.apache.beam.module'
-}
-applyDockerNature()
-applyPythonNature()
-
-pythonVersion = '3.6'
-
-apply from: "../common.gradle"
diff --git a/sdks/python/container/run_validatescontainer.sh b/sdks/python/container/run_validatescontainer.sh
index 1ab9c569069..9ef9313ec15 100755
--- a/sdks/python/container/run_validatescontainer.sh
+++ b/sdks/python/container/run_validatescontainer.sh
@@ -24,8 +24,6 @@
 # REGION       -> Region name to use for Dataflow
 #
 # Execute from the root of the repository:
-#     test Python3.6 container:
-#         ./gradlew :sdks:python:test-suites:dataflow:py36:validatesContainer
 #     test Python3.7 container:
 #         ./gradlew :sdks:python:test-suites:dataflow:py37:validatesContainer
 #     test Python3.8 container:
diff --git a/sdks/python/setup.py b/sdks/python/setup.py
index 9168f1b0271..f8ecc1c299c 100644
--- a/sdks/python/setup.py
+++ b/sdks/python/setup.py
@@ -255,7 +255,7 @@ def get_portability_package_data():
   return files
 
 
-python_requires = '>=3.6'
+python_requires = '>=3.7'
 
 if sys.version_info.major == 3 and sys.version_info.minor >= 10:
   warnings.warn(
@@ -329,7 +329,6 @@ if __name__ == '__main__':
           'Intended Audience :: End Users/Desktop',
           'License :: OSI Approved :: Apache Software License',
           'Operating System :: POSIX :: Linux',
-          'Programming Language :: Python :: 3.6',
           'Programming Language :: Python :: 3.7',
           'Programming Language :: Python :: 3.8',
           'Programming Language :: Python :: 3.9',
diff --git a/sdks/python/test-suites/dataflow/py36/build.gradle b/sdks/python/test-suites/dataflow/py36/build.gradle
deleted file mode 100644
index 9518e3d22e4..00000000000
--- a/sdks/python/test-suites/dataflow/py36/build.gradle
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-
-apply plugin: org.apache.beam.gradle.BeamModulePlugin
-applyPythonNature()
-
-// Required to setup a Python 3 virtualenv and task names.
-pythonVersion = '3.6'
-apply from : "../common.gradle"
diff --git a/sdks/python/test-suites/direct/py36/build.gradle b/sdks/python/test-suites/direct/py36/build.gradle
deleted file mode 100644
index fa9bc330594..00000000000
--- a/sdks/python/test-suites/direct/py36/build.gradle
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-
-plugins { id 'org.apache.beam.module' }
-applyPythonNature()
-
-// Required to setup a Python 3 virtualenv and task names.
-pythonVersion = '3.6'
-apply from: '../common.gradle'
diff --git a/sdks/python/test-suites/gradle.properties b/sdks/python/test-suites/gradle.properties
index cb0851b9e1a..cf167b22abe 100644
--- a/sdks/python/test-suites/gradle.properties
+++ b/sdks/python/test-suites/gradle.properties
@@ -26,7 +26,7 @@ dataflow_mongodbio_it_task_py_versions=3.7
 dataflow_chicago_taxi_example_task_py_versions=3.7
 dataflow_validates_runner_batch_tests=3.7,3.9
 dataflow_validates_runner_streaming_tests=3.7,3.8,3.9
-dataflow_validates_container_tests=3.6,3.7,3.8,3.9
+dataflow_validates_container_tests=3.7,3.8,3.9
 # TODO: Enable following tests after making sure we have enough capacity.
 dataflow_validates_runner_batch_tests_V2=3.9
 dataflow_validates_runner_streaming_tests_V2=3.9
diff --git a/sdks/python/test-suites/portable/py36/build.gradle b/sdks/python/test-suites/portable/py36/build.gradle
deleted file mode 100644
index 4c7b31eb2cd..00000000000
--- a/sdks/python/test-suites/portable/py36/build.gradle
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.
- */
-
-apply plugin: org.apache.beam.gradle.BeamModulePlugin
-applyPythonNature()
-
-addPortableWordCountTasks()
-
-// Required to setup a Python 3.6 virtualenv and task names.
-pythonVersion = '3.6'
-apply from: "../common.gradle"
diff --git a/sdks/python/test-suites/tox/py36/build.gradle b/sdks/python/test-suites/tox/py36/build.gradle
deleted file mode 100644
index 12ab1dc3aad..00000000000
--- a/sdks/python/test-suites/tox/py36/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * Unit tests for Python 3.6
- */
-
-plugins { id 'org.apache.beam.module' }
-applyPythonNature()
-
-// Required to setup a Python 3 virtualenv and task names.
-pythonVersion = '3.6'
-
-apply from: "../common.gradle"
-
-// TODO(BEAM-8954): Remove this once tox uses isolated builds.
-testPy36Cython.mustRunAfter testPython36, testPy36Cloud
diff --git a/sdks/python/tox.ini b/sdks/python/tox.ini
index 332e766d85b..8db1162d151 100644
--- a/sdks/python/tox.ini
+++ b/sdks/python/tox.ini
@@ -17,7 +17,7 @@
 
 [tox]
 # new environments will be excluded by default unless explicitly added to envlist.
-envlist = py36,py37,py38,py39,py36-{cloud,cython},py37-{cloud,cython,lint,mypy},py38-{cloud,cython,docs,cloudcoverage},py39-{cloud,cython},whitespacelint
+envlist = py37,py38,py39,py37-{cloud,cython,lint,mypy},py38-{cloud,cython,docs,cloudcoverage},py39-{cloud,cython},whitespacelint
 toxworkdir = {toxinidir}/target/{env:ENV_NAME:.tox}
 
 [pycodestyle]
@@ -62,19 +62,19 @@ commands_post =
   bash {toxinidir}/scripts/run_tox_cleanup.sh
 commands = false {envname} is misconfigured
 
-[testenv:py{36,37,38,39}]
+[testenv:py{37,38,39}]
 commands =
   python apache_beam/examples/complete/autocomplete_test.py
   {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}"
 
-[testenv:py{36,37,38,39}-win]
+[testenv:py{37,38,39}-win]
 commands =
   python apache_beam/examples/complete/autocomplete_test.py
   bash {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}"
 install_command = {envbindir}/python.exe {envbindir}/pip.exe install --retries 10 {opts} {packages}
 list_dependencies_command = {envbindir}/python.exe {envbindir}/pip.exe freeze
 
-[testenv:py{36,37,38,39}-cython]
+[testenv:py{37,38,39}-cython]
 # cython tests are only expected to work in linux (2.x and 3.x)
 # If we want to add other platforms in the future, it should be:
 # `platform = linux2|darwin|...`
@@ -87,7 +87,7 @@ commands =
   python apache_beam/examples/complete/autocomplete_test.py
   {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}"
 
-[testenv:py{36,37,38,39}-cloud]
+[testenv:py{37,38,39}-cloud]
 extras = test,gcp,interactive,dataframe,aws,azure
 commands =
   {toxinidir}/scripts/run_pytest.sh {envname} "{posargs}"
@@ -233,7 +233,7 @@ extras = test
 commands =
   {toxinidir}/scripts/pytest_validates_runner.sh {envname} {toxinidir}/apache_beam/runners/portability/spark_runner_test.py {posargs}
 
-[testenv:py{36,37,38,39}-pyarrow-{0,1,2,3,4,5,6,7}]
+[testenv:py{37,38,39}-pyarrow-{0,1,2,3,4,5,6,7}]
 deps =
   0: pyarrow>=0.15.1,<0.18.0
   1: pyarrow>=1,<2
@@ -253,7 +253,7 @@ commands =
   # selecting tests with -m (BEAM-12985)
   pytest -o junit_suite_name={envname} --junitxml=pytest_{envname}.xml -n 6 -m uses_pyarrow {posargs}
 
-[testenv:py{36,37,38,39}-pandas-{11,12,13,14}]
+[testenv:py{37,38,39}-pandas-{11,12,13,14}]
 deps =
   11: pandas>=1.1.0,<1.2.0
   12: pandas>=1.2.0,<1.3.0
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 3827b5c1282..305d0af786f 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -209,27 +209,22 @@ include(":sdks:java:testing:watermarks")
 include(":sdks:python")
 include(":sdks:python:apache_beam:testing:load_tests")
 include(":sdks:python:container")
-include(":sdks:python:container:py36")
 include(":sdks:python:container:py37")
 include(":sdks:python:container:py38")
 include(":sdks:python:container:py39")
 include(":sdks:python:test-suites:dataflow")
-include(":sdks:python:test-suites:dataflow:py36")
 include(":sdks:python:test-suites:dataflow:py37")
 include(":sdks:python:test-suites:dataflow:py38")
 include(":sdks:python:test-suites:dataflow:py39")
 include(":sdks:python:test-suites:direct")
-include(":sdks:python:test-suites:direct:py36")
 include(":sdks:python:test-suites:direct:py37")
 include(":sdks:python:test-suites:direct:py38")
 include(":sdks:python:test-suites:direct:py39")
 include(":sdks:python:test-suites:direct:xlang")
-include(":sdks:python:test-suites:portable:py36")
 include(":sdks:python:test-suites:portable:py37")
 include(":sdks:python:test-suites:portable:py38")
 include(":sdks:python:test-suites:portable:py39")
 include(":sdks:python:test-suites:tox:pycommon")
-include(":sdks:python:test-suites:tox:py36")
 include(":sdks:python:test-suites:tox:py37")
 include(":sdks:python:test-suites:tox:py38")
 include(":sdks:python:test-suites:tox:py39")