From 2dc53c569f06f6e445c47391784be11deeda8b4f Mon Sep 17 00:00:00 2001 From: Henry Borchers Date: Tue, 11 Nov 2025 08:13:02 -0600 Subject: [PATCH 1/3] ci: gathering linux tox stages will retry on failure --- vars/runJenkinsPipeline.groovy | 43 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/vars/runJenkinsPipeline.groovy b/vars/runJenkinsPipeline.groovy index 2ad9044..e4f62fe 100644 --- a/vars/runJenkinsPipeline.groovy +++ b/vars/runJenkinsPipeline.groovy @@ -225,24 +225,33 @@ def call(){ steps{ script{ def envs = [] - node('docker && linux'){ - docker.image('python').inside('--mount source=python-tmp-packageValidation,target=/tmp'){ + retry(2){ + node('docker && linux'){ + checkout scm try{ - checkout scm - sh(script: 'python3 -m venv venv && venv/bin/pip install --disable-pip-version-check uv') - envs = sh( - label: 'Get tox environments', - script: './venv/bin/uv run --only-group tox --with tox-uv --isolated --quiet tox list -d --no-desc', - returnStdout: true, - ).trim().split('\n') - } finally{ - cleanWs( - patterns: [ - [pattern: 'venv/', type: 'INCLUDE'], - [pattern: '.tox', type: 'INCLUDE'], - [pattern: '**/__pycache__/', type: 'INCLUDE'], - ] - ) + docker.image('python').inside('--mount source=python-tmp-packageValidation,target=/tmp'){ + retry(2){ + try{ + sh(script: 'python3 -m venv venv && venv/bin/pip install --disable-pip-version-check uv') + envs = sh( + label: 'Get tox environments', + script: './venv/bin/uv run --only-group tox --with tox-uv --isolated --quiet tox list -d --no-desc', + returnStdout: true, + ).trim().split('\n') + } catch (e){ + cleanWs( + patterns: [ + [pattern: 'venv/', type: 'INCLUDE'], + [pattern: '.tox', type: 'INCLUDE'], + [pattern: '**/__pycache__/', type: 'INCLUDE'], + ] + ) + throw e + } + } + } + } finally { + sh "${tool(name: 'Default', type: 'git')} clean -dfx" } } } From b060ca4af181578f872d2107cf32b4a3b9c4cbc4 Mon Sep 17 00:00:00 2001 From: Henry Borchers Date: Fri, 21 Nov 2025 08:23:45 -0600 Subject: [PATCH 2/3] ci: Building Sphinx Documentation stashes inside steps --- vars/runJenkinsPipeline.groovy | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/vars/runJenkinsPipeline.groovy b/vars/runJenkinsPipeline.groovy index e4f62fe..79c8cab 100644 --- a/vars/runJenkinsPipeline.groovy +++ b/vars/runJenkinsPipeline.groovy @@ -65,21 +65,19 @@ def call(){ ./venv/bin/uv run --group docs --no-dev sphinx-build docs/source build/docs/html -d build/docs/.doctrees -v -w logs/build_sphinx.log ''' ) + publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'build/docs/html', reportFiles: 'index.html', reportName: 'Documentation', reportTitles: '']) + script{ + def props = readTOML( file: 'pyproject.toml')['project'] + def DOC_ZIP_FILENAME = "${props.name}-${props.version}.doc.zip" + zip archive: true, dir: 'build/docs/html', glob: '', zipFile: "dist/${DOC_ZIP_FILENAME}" + } + stash includes: 'build/docs/html/**,dist/*.doc.zip', name: 'DOCS_ARCHIVE' } post{ always { recordIssues(tools: [sphinxBuild(name: 'Sphinx Documentation Build', pattern: 'logs/build_sphinx.log', id: 'sphinx_build')]) archiveArtifacts artifacts: 'logs/build_sphinx.log' } - success{ - publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'build/docs/html', reportFiles: 'index.html', reportName: 'Documentation', reportTitles: '']) - script{ - def props = readTOML( file: 'pyproject.toml')['project'] - def DOC_ZIP_FILENAME = "${props.name}-${props.version}.doc.zip" - zip archive: true, dir: 'build/docs/html', glob: '', zipFile: "dist/${DOC_ZIP_FILENAME}" - } - stash includes: 'build/docs/html/**,dist/*.doc.zip', name: 'DOCS_ARCHIVE' - } failure{ echo 'Failed to build Python package' } From 9329f702cf647f1298c8b665ea16b3f3e380ddba Mon Sep 17 00:00:00 2001 From: Henry Borchers Date: Fri, 21 Nov 2025 08:26:49 -0600 Subject: [PATCH 3/3] docs: docs can be built on python 3.10 --- docs/source/conf.py | 8 ++++++-- pyproject.toml | 2 +- uv.lock | 12 ++++++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index f1e2948..c398620 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -19,13 +19,17 @@ # import os import sys -import tomllib +if sys.version_info < (3, 11): + from tomli import load as load_toml +else: + from tomllib import load as load_toml + sys.path.insert(0, os.path.abspath('../..')) def get_project_metadata(): path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../pyproject.toml")) with open(path, "rb") as f: - return tomllib.load(f)['project'] + return load_toml(f)['project'] metadata = get_project_metadata() diff --git a/pyproject.toml b/pyproject.toml index 1a6c15c..f3250cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ classifiers = [ ] [dependency-groups] -docs = ["sphinx"] +docs = ["sphinx", "tomli ; python_full_version < '3.11'"] type_checking = [ "mypy", "lxml", diff --git a/uv.lock b/uv.lock index 05ffffc..c8318f9 100644 --- a/uv.lock +++ b/uv.lock @@ -378,6 +378,7 @@ ci = [ { name = "pytest" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tox" }, { name = "twine" }, ] @@ -389,11 +390,13 @@ dev = [ { name = "pytest" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tox" }, ] docs = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] lint = [ { name = "flake8" }, @@ -425,6 +428,7 @@ ci = [ { name = "mypy" }, { name = "pytest" }, { name = "sphinx" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tox" }, { name = "twine" }, ] @@ -435,9 +439,13 @@ dev = [ { name = "mypy" }, { name = "pytest" }, { name = "sphinx" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tox" }, ] -docs = [{ name = "sphinx" }] +docs = [ + { name = "sphinx" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] lint = [ { name = "flake8" }, { name = "lxml" }, @@ -477,7 +485,7 @@ name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [