The production Jenkins org folder scans preset-io with orgScanIncludes='*',
so this repository is already crawled; a multibranch job is only materialised
once a root Jenkinsfile exists. This adds one.
The pipeline is validation-only and publishes nothing: it installs the package,
runs the offline unit suite (64 tests) with JUnit reporting, and asserts that
the exa.websocket dialect entry point resolves to a real Dialect class.
test/integration is excluded because it drives a real Exasol database. The bare
`exa` alias is not asserted: upstream declares it as `sqlalchemy_exasol:base`,
which resolves to a module rather than a Dialect class, and that is tracked
separately as part of the 7.1.3 entry-point fix.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Why this, and not an argocd change
The ask was to make this repo's multibranch PR jobs run on production Jenkins. I traced the declarative onboarding path end to end; no argocd or Helm change is required, so this PR is in the repo that actually gates job creation.
Evidence chain:
preset-io/helm→charts/jenkins/values.yaml, JCasCseed-jobsscriptorganizationFolder('preset-io')with aGitHubSCMNavigatorforrepoOwner('preset-io')WildcardSCMSourceFilterTrait.includes('{{ .Values.orgScanIncludes }}')preset-io/argocd→environments/devops/aws/regions/us-west-2/devops-aws-production/jenkins/values.yaml:6orgScanIncludes: "*"— already matches this repopreset-io/helmcharts/jenkins/values.yaml(hardcoded, not env-overridable)excludes('archived/* charts incubator-superset Flask-AppBuilder pyhelm superset-private redis-py-cluster terraform-aws-rds fab_multitenant helm-secrets s3werkzeugcache')— this repo is not listedcredentialsId('gh-preset-machine')— a machine user, not a GitHub App, so there is no per-repository installation allowlist to extend. This repo is public, so it is readablepreset-io/PyHiveandpreset-io/snowflake-connector-pythonare forks with root Jenkinsfiles and live jobsSo the org scan already visits this repository. What it does not do is create a job, because an
OrganizationFolderonly materialises a multibranch project when the marker file — a rootJenkinsfile— is found on a discovered branch. This repo had none. Adding it is the smallest change that actually alters behaviour; editingorgScanIncludeswould have been a no-op.Rollout — fully automated, no manual Jenkins setup
Once this merges to
master, the job appears via any of three existing triggers, whichever fires first:gitHubPluginConfig.hookUrlin the argocd values routes GitHub events through webhookrelay to Jenkins, re-indexing the org folder on push.PeriodicFolderTriggerwithspec('H H * * *')/interval(86400000).trigger-org-scanGroovy init script in the chart kicks anpreset-ioorg folder build on boot.No one needs to click anything in Jenkins.
Branch/PR coverage comes from the traits already on the navigator:
BranchDiscoveryTrait(strategyId 1)(all branches) andOriginPullRequestDiscoveryTrait(strategyId 2)(all origin PRs). This repo's PR branches are origin branches, so they are covered.What the pipeline does
Validation only. It publishes nothing: no sdist, no wheel, no registry upload, no git tag, no credentials block, no internal hostnames.
pip install -e .pluspytestpytest test/unit --junitxml=junit-py.xml, with the JUnit report published to Jenkinsexa.websocketdialect entry point resolves to a realDialectclasstest/integrationis excluded: it drives a real Exasol database viaexasol-integration-test-docker-environment. The existing GitHub Actions workflows are unchanged.One thing worth flagging for 6.1
The smoke check deliberately asserts only
exa.websocket, not the bareexaalias. Onmastertoday (7.1.2),pyproject.toml:54declares:That resolves to the module
sqlalchemy_exasol.base, not aDialectclass — I reproduced it locally under SQLAlchemy 2.0.54. This is the same malformed-alias behaviour already documented inpreset-io/superset-shell(docker/pip-cleanup.json), which notes that 7.1.3 must own both Exasol aliases and both must load the websocket dialect class. Assertingexahere would land a red job on day one for a defect this PR is not fixing, so it stays out and is tracked with the 7.1.3 entry-point work. Once 7.1.3 lands,exashould be added toEXPECTEDin the Jenkinsfile.Validation performed
Clean venv, Python 3.11.2, replaying the exact pipeline commands:
Phases.CONVERSION—PARSE OKpip install -e .— OKpytest test/unit --junitxml=junit-py.xml— 64 passed in 0.34s, JUnit XML writtenexa.websocketresolves tosqlalchemy_exasol.websocket.EXADialect_websocket— OKRollback
Revert this commit, or delete the file. The next org re-index (webhook or the daily scan) removes the multibranch project;
orphanedItemStrategy { pruneDeadBranches(true) }on the org folder cleans it up. Nothing outside this repo changes, and no shared Jenkins state is mutated — so rollback is a single-repo revert with no coordination.Explicitly out of scope
No artifacts published, nothing merged, no public PyPI workflow enabled, no internal hostnames added, no secrets introduced.
🤖 Generated with Claude Code