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

absurdfarce pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra-python-driver.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 7cbb3fb8 Update Jenkins build to work with pyproject.toml
7cbb3fb8 is described below

commit 7cbb3fb857e0c8c641dd86e9eab017266c205ec8
Author: absurdfarce <[email protected]>
AuthorDate: Tue Feb 10 15:22:04 2026 -0600

    Update Jenkins build to work with pyproject.toml
    
    patch by Bret McGuire; reviewed by Bret McGuire and Brad Schoening
    
    reference: https://github.com/apache/cassandra-python-driver/pull/1271
---
 Jenkinsfile              |  95 +++++++++++++++++++++++++++++---------------
 fix-jenkinsfile-libev.py |   9 +++++
 pyproject.toml           |   4 +-
 setup.py                 | 101 +++++++++++++++++++++++------------------------
 4 files changed, 124 insertions(+), 85 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index dc70acc6..498e0158 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -34,7 +34,7 @@ slack = new Slack()
 DEFAULT_CASSANDRA = ['3.11', '4.0', '4.1', '5.0']
 DEFAULT_DSE = ['dse-5.1.35', 'dse-6.8.30', 'dse-6.9.0']
 DEFAULT_HCD = ['hcd-1.0.0']
-DEFAULT_RUNTIME = ['3.9.23', '3.10.18', '3.11.13', '3.12.11', '3.13.5']
+DEFAULT_RUNTIME = ['3.10.18', '3.11.13', '3.12.11', '3.13.5']
 DEFAULT_CYTHON = ["True", "False"]
 matrices = [
   "FULL": [
@@ -119,7 +119,7 @@ def getBuildContext() {
 
 def buildAndTest(context) {
   initializeEnvironment()
-  installDriverAndCompileExtensions()
+  installDriver()
 
   try {
       executeTests()
@@ -165,15 +165,18 @@ def getMatrixBuilds(buildContext) {
 
 def initializeEnvironment() {
   sh label: 'Initialize the environment', script: '''#!/bin/bash -lex
-    pyenv global ${PYTHON_VERSION}
-    sudo apt-get install socat
-    pip install --upgrade pip
-    pip install -U setuptools
 
-    # install a version of pyyaml<6.0 compatible with ccm-3.1.5 as of Aug 2023
+    # One of the integration tests relies on socat so let's install that here
+    sudo apt-get install -y socat moreutils
+
+    pyenv shell ${PYTHON_VERSION}
+    python -m venv jenkins-venv
+    . ./jenkins-venv/bin/activate
+    pip install --upgrade pip setuptools wheel
+
+    # Install a version of pyyaml<6.0 compatible with ccm-3.1.5 as of Aug 2023
     # this works around the python-3.10+ compatibility problem as described in 
DSP-23524
-    pip install wheel
-    pip install "Cython<3.0" "pyyaml<6.0" --no-build-isolation
+    pip install "pyyaml<6.0" --no-build-isolation
     pip install ${HOME}/ccm
   '''
 
@@ -182,35 +185,28 @@ def initializeEnvironment() {
     if (env.PYTHON_VERSION =~ /3\.12\.\d+/) {
       echo "Cannot install DSE dependencies for Python 3.12.x; installing 
Apache CassandraⓇ requirements only.  See PYTHON-1368 for more detail."
       sh label: 'Install Apache CassandraⓇ requirements', script: 
'''#!/bin/bash -lex
+        . ./jenkins-venv/bin/activate
         pip install -r test-requirements.txt
       '''
     }
     else {
       sh label: 'Install DataStax Enterprise requirements', script: 
'''#!/bin/bash -lex
+        . ./jenkins-venv/bin/activate
         pip install -r test-datastax-requirements.txt
       '''
     }
   } else {
     sh label: 'Install Apache CassandraⓇ requirements', script: '''#!/bin/bash 
-lex
+      . ./jenkins-venv/bin/activate
       pip install -r test-requirements.txt
     '''
 
     sh label: 'Uninstall the geomet dependency since it is not required for 
Cassandra', script: '''#!/bin/bash -lex
+      . ./jenkins-venv/bin/activate
       pip uninstall -y geomet
     '''
   }
 
-  sh label: 'Install unit test modules', script: '''#!/bin/bash -lex
-    pip install --no-deps nose-ignore-docstring nose-exclude
-    pip install service_identity
-  '''
-
-  if (env.CYTHON_ENABLED  == 'True') {
-    sh label: 'Install cython modules', script: '''#!/bin/bash -lex
-      pip install cython numpy
-    '''
-  }
-
   sh label: 'Download Apache CassandraⓇ or DataStax Enterprise', script: 
'''#!/bin/bash -lex
     . ${CCM_ENVIRONMENT_SHELL} ${CASSANDRA_VERSION}
   '''
@@ -244,6 +240,8 @@ ENVIRONMENT_EOF
   }
 
   sh label: 'Display Python and environment information', script: 
'''#!/bin/bash -le
+    . ./jenkins-venv/bin/activate
+
     # Load CCM environment variables
     set -o allexport
     . ${HOME}/environment.txt
@@ -251,27 +249,46 @@ ENVIRONMENT_EOF
 
     python --version
     pip --version
-    pip freeze
     printenv | sort
   '''
 }
 
-def installDriverAndCompileExtensions() {
-  if (env.CYTHON_ENABLED  == 'True') {
-    sh label: 'Install the driver and compile with C extensions with Cython', 
script: '''#!/bin/bash -lex
-      python setup.py build_ext --inplace
-    '''
-  } else {
-    sh label: 'Install the driver and compile with C extensions without 
Cython', script: '''#!/bin/bash -lex
-      python setup.py build_ext --inplace --no-cython
-    '''
-  }
+def installDriver() {
+  sh label: 'Install the driver and compile with C extensions with Cython', 
script: '''#!/bin/bash -lex
+    # Update libev includes and libs to point to the right spot for this 
install
+    pyenv shell ${PYTHON_VERSION}
+    python -m venv libev-venv
+    . ./libev-venv/bin/activate
+    pip install toml
+    python fix-jenkinsfile-libev.py ./pyproject.toml "/usr/include" 
"/usr/lib/x86_64-linux-gnu" | sponge ./pyproject.toml
+    deactivate
+
+    ls /usr/include/ev.h
+    ls /usr/lib/x86_64-linux-gnu/libev*
+
+    # Now that we've made relevant mods to our local pyproject.toml we're 
ready to build the driver
+    . ./jenkins-venv/bin/activate
+
+    # Load CCM environment variables
+    set -o allexport
+    . ${HOME}/environment.txt
+    set +o allexport
+
+    cat ./pyproject.toml
+    pip install --verbose --editable .
+
+    # After install display a list of packages in the venv for auditing
+    pip list
+  '''
 }
 
+
 def executeStandardTests() {
 
   try {
     sh label: 'Execute unit tests', script: '''#!/bin/bash -lex
+      . ./jenkins-venv/bin/activate
+
       # Load CCM environment variables
       set -o allexport
       . ${HOME}/environment.txt
@@ -289,6 +306,8 @@ def executeStandardTests() {
 
   try {
     sh label: 'Execute Simulacron integration tests', script: '''#!/bin/bash 
-lex
+      . ./jenkins-venv/bin/activate
+
       # Load CCM environment variables
       set -o allexport
       . ${HOME}/environment.txt
@@ -314,6 +333,8 @@ def executeStandardTests() {
 
   try {
     sh label: 'Execute CQL engine integration tests', script: '''#!/bin/bash 
-lex
+      . ./jenkins-venv/bin/activate
+
       # Load CCM environment variables
       set -o allexport
       . ${HOME}/environment.txt
@@ -330,6 +351,8 @@ def executeStandardTests() {
 
   try {
     sh label: 'Execute Apache CassandraⓇ integration tests', script: 
'''#!/bin/bash -lex
+      . ./jenkins-venv/bin/activate
+
       # Load CCM environment variables
       set -o allexport
       . ${HOME}/environment.txt
@@ -351,6 +374,8 @@ def executeStandardTests() {
     else {
       try {
         sh label: 'Execute DataStax Enterprise integration tests', script: 
'''#!/bin/bash -lex
+          . ./jenkins-venv/bin/activate
+
           # Load CCM environment variable
           set -o allexport
           . ${HOME}/environment.txt
@@ -369,6 +394,8 @@ def executeStandardTests() {
 
   try {
     sh label: 'Execute DataStax Astra integration tests', script: 
'''#!/bin/bash -lex
+      . ./jenkins-venv/bin/activate
+
       # Load CCM environment variable
       set -o allexport
       . ${HOME}/environment.txt
@@ -386,6 +413,8 @@ def executeStandardTests() {
   if (env.PROFILE == 'FULL') {
     try {
       sh label: 'Execute long running integration tests', script: 
'''#!/bin/bash -lex
+        . ./jenkins-venv/bin/activate
+
         # Load CCM environment variable
         set -o allexport
         . ${HOME}/environment.txt
@@ -404,6 +433,8 @@ def executeStandardTests() {
 
 def executeDseSmokeTests() {
   sh label: 'Execute profile DataStax Enterprise smoke test integration 
tests', script: '''#!/bin/bash -lex
+    . ./jenkins-venv/bin/activate
+
     # Load CCM environment variable
     set -o allexport
     . ${HOME}/environment.txt
@@ -418,6 +449,8 @@ def executeDseSmokeTests() {
 
 def executeEventLoopTests() {
   sh label: 'Execute profile event loop manager integration tests', script: 
'''#!/bin/bash -lex
+    . ./jenkins-venv/bin/activate
+
     # Load CCM environment variable
     set -o allexport
     . ${HOME}/environment.txt
diff --git a/fix-jenkinsfile-libev.py b/fix-jenkinsfile-libev.py
new file mode 100644
index 00000000..80bd4cb1
--- /dev/null
+++ b/fix-jenkinsfile-libev.py
@@ -0,0 +1,9 @@
+import sys
+import toml
+
+pyproject = toml.load(sys.argv[1])
+base = pyproject["tool"]["cassandra-driver"]
+base["libev-includes"] = [sys.argv[2]]
+base["libev-libs"] = [sys.argv[3]]
+
+print(toml.dumps(pyproject))
diff --git a/pyproject.toml b/pyproject.toml
index 170d96df..0a3fb577 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -51,6 +51,6 @@ include = ['cassandra', 'cassandra.io', 
'cassandra.cqlengine', 'cassandra.graph'
 build-murmur3-extension = true
 build-libev-extension = true
 build-cython-extensions = true
-libev-includes = []
-libev-libs = []
+libev-includes = ["/usr/include/libev", "/usr/local/include", 
"/opt/local/include", "/usr/include"]
+libev-libs = ["/usr/local/lib", "/opt/local/lib", "/usr/lib64"]
 build-concurrency = 0
\ No newline at end of file
diff --git a/setup.py b/setup.py
index a3f067c8..07ea3844 100644
--- a/setup.py
+++ b/setup.py
@@ -30,6 +30,7 @@ is_macos = sys.platform.startswith('darwin')
 is_pypy = "PyPy" in sys.version
 is_supported_platform = sys.platform != "cli" and not 
sys.platform.startswith("java")
 is_supported_arch = sys.byteorder != "big"
+is_supported = is_supported_platform and is_supported_arch
 
 # ========================== A few upfront checks ==========================
 platform_unsupported_msg = \
@@ -66,62 +67,58 @@ with open(pyproject_toml,"rb") as f:
     pyproject_data = toml.load(f)
 driver_project_data = pyproject_data["tool"]["cassandra-driver"]
 
-murmur3_ext = Extension('cassandra.cmurmur3', sources=['cassandra/cmurmur3.c'])
-
-DEFAULT_LIBEV_INCLUDES = ['/usr/include/libev', '/usr/local/include', 
'/opt/local/include', '/usr/include']
-DEFAULT_LIBEV_LIBS = ['/usr/local/lib', '/opt/local/lib', '/usr/lib64']
-libev_includes = driver_project_data["libev-includes"] or 
DEFAULT_LIBEV_INCLUDES
-libev_libs = driver_project_data["libev-libs"] or DEFAULT_LIBEV_LIBS
-if is_macos:
-    libev_includes.extend(['/opt/homebrew/include', 
os.path.expanduser('~/homebrew/include')])
-    libev_libs.extend(['/opt/homebrew/lib'])
-libev_ext = Extension('cassandra.io.libevwrapper',
-                      sources=['cassandra/io/libevwrapper.c'],
-                      include_dirs=libev_includes,
-                      libraries=['ev'],
-                      library_dirs=libev_libs)
-
-try_murmur3 = driver_project_data["build-murmur3-extension"] and 
is_supported_platform and is_supported_arch
-try_libev = driver_project_data["build-libev-extension"] and 
is_supported_platform and is_supported_arch
-try_cython = driver_project_data["build-cython-extensions"] and 
is_supported_platform and is_supported_arch and not is_pypy
+def key_or_false(k):
+    return driver_project_data[k] if k in driver_project_data else False
+
+try_murmur3 = key_or_false("build-murmur3-extension") and is_supported
+try_libev = key_or_false("build-libev-extension") and is_supported
+try_cython = key_or_false("build-cython-extensions") and is_supported and not 
is_pypy
 
 build_concurrency = driver_project_data["build-concurrency"]
 
-def build_extension_list():
-
-    rv = []
-
-    if try_murmur3:
-        sys.stderr.write("Appending murmur extension %s\n" % murmur3_ext)
-        rv.append(murmur3_ext)
-
-    if try_libev:
-        sys.stderr.write("Appending libev extension %s\n" % libev_ext)
-        rv.append(libev_ext)
-
-    if try_cython:
-        sys.stderr.write("Trying Cython builds in order to append Cython 
extensions\n")
-        try:
-            from Cython.Build import cythonize
-            cython_candidates = ['cluster', 'concurrent', 'connection', 
'cqltypes', 'metadata',
-                                 'pool', 'protocol', 'query', 'util']
-            compile_args = [] if is_windows else ['-Wno-unused-function']
-            rv.extend(cythonize(
-                    [Extension('cassandra.%s' % m, ['cassandra/%s.py' % m],
-                                extra_compile_args=compile_args)
-                        for m in cython_candidates],
-                    nthreads=build_concurrency,
-                    exclude_failures=True))
-
-            rv.extend(cythonize(Extension("*", ["cassandra/*.pyx"], 
extra_compile_args=compile_args),
-                                          nthreads=build_concurrency))
-        except Exception as exc:
-            sys.stderr.write("Failed to cythonize one or more modules. These 
will not be compiled as extensions (optional).\n")
-            sys.stderr.write("Cython error: %s\n" % exc)
-    
-    return rv
+exts = []
+if try_murmur3:
+    murmur3_ext = Extension('cassandra.cmurmur3', 
sources=['cassandra/cmurmur3.c'])
+    sys.stderr.write("Appending murmur extension %s\n" % murmur3_ext)
+    exts.append(murmur3_ext)
+
+if try_libev:
+    libev_includes = driver_project_data["libev-includes"]
+    libev_libs = driver_project_data["libev-libs"]
+    if is_macos:
+        libev_includes.extend(['/opt/homebrew/include', 
os.path.expanduser('~/homebrew/include')])
+        libev_libs.extend(['/opt/homebrew/lib'])
+    libev_ext = Extension('cassandra.io.libevwrapper',
+                          sources=['cassandra/io/libevwrapper.c'],
+                          include_dirs=libev_includes,
+                          libraries=['ev'],
+                          library_dirs=libev_libs)
+    sys.stderr.write("Appending libev extension %s\n" % libev_ext)
+    exts.append(libev_ext)
+
+if try_cython:
+    sys.stderr.write("Trying Cython builds in order to append Cython 
extensions\n")
+    try:
+        from Cython.Build import cythonize
+        cython_candidates = ['cluster', 'concurrent', 'connection', 
'cqltypes', 'metadata',
+                             'pool', 'protocol', 'query', 'util']
+        compile_args = [] if is_windows else ['-Wno-unused-function']
+        exts.extend(cythonize(
+            [Extension('cassandra.%s' % m, ['cassandra/%s.py' % m],
+                       extra_compile_args=compile_args)
+                       for m in cython_candidates],
+                       nthreads=build_concurrency,
+                       exclude_failures=True))
+
+        exts.extend(cythonize(
+            Extension("*", ["cassandra/*.pyx"],
+                      extra_compile_args=compile_args),
+                      nthreads=build_concurrency))
+    except Exception as exc:
+        sys.stderr.write("Failed to cythonize one or more modules. These will 
not be compiled as extensions (optional).\n")
+        sys.stderr.write("Cython error: %s\n" % exc)
 
 # ========================== And finally setup() itself 
==========================
 setup(
-    ext_modules = build_extension_list()
+    ext_modules = exts
 )
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to