Skip to content

Migrate CircleCI to GitHub Actions#5729

Open
eakmanrq wants to merge 27 commits intomainfrom
eakmanrq/circleci-to-gha
Open

Migrate CircleCI to GitHub Actions#5729
eakmanrq wants to merge 27 commits intomainfrom
eakmanrq/circleci-to-gha

Conversation

@eakmanrq
Copy link
Collaborator

Description

Replaces CircleCI configuration with native GitHub Actions workflows. All CI/CD jobs have been migrated, including comprehensive test coverage across Python versions, database engines, UI testing, and release processes.

Key changes:

  • Deleted CircleCI config (.circleci/config.yml and .circleci/continue_config.yml)
  • Moved helper scripts to .github/scripts/ and updated references
  • Created comprehensive pr.yaml with path-based filtering and all test jobs
  • Created release.yaml for automated PyPI publishing and GitHub releases
  • Removed private repo integration

Workflows:

  • pr.yaml: Triggered on pushes to main and pull requests. Includes doc tests, style checks (Python 3.9–3.13), Windows tests, migration tests, UI tests, engine tests (8 local + 8 cloud databases)
  • release.yaml: Triggered on version tags (v*.*.*). Builds UI, publishes Python packages, creates GitHub releases using native GitHub release notes generation

Test Plan

  • The new workflows will execute on the next push to main or PR
  • Docker engine tests run on every PR (duckdb, postgres, mysql, mssql, trino, spark, clickhouse, risingwave)
  • Cloud engine tests run only on main branch (snowflake, databricks, redshift, bigquery, clickhouse-cloud, athena, fabric, gcp-postgres)
  • Release workflow will trigger on version tag pushes

Checklist

  • CircleCI configuration fully migrated to GitHub Actions
  • All jobs properly gated with path-based filtering
  • Secret references configured at repo level
  • Makefile references updated to new script locations

eakmanrq and others added 2 commits March 12, 2026 09:14
Replaces CircleCI configuration with native GitHub Actions workflows:

- Deleted `.circleci/config.yml` and `.circleci/continue_config.yml`
- Moved helper scripts from `.circleci/` to `.github/scripts/`
- Added comprehensive `pr.yaml` with all test jobs (doc tests, style checks, Windows tests, migration tests, UI tests, engine tests for 8 local + 8 cloud databases)
- Created `release.yaml` for PyPI publishing and GitHub releases on version tags
- Removed private repo integration (deleted `private-repo-test.yaml`)
- Updated `Makefile` to reference new script location
- Implemented path-based filtering using `dorny/paths-filter@v3` to replicate CircleCI's conditional job execution

All CircleCI jobs are now running in GitHub Actions with proper dependencies, caching, and secret management.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
- Run prettier on pr.yaml to fix formatting check
- Add UV=1 env var to all Python jobs so Makefile uses `uv pip`
  instead of `pip3`, ensuring packages install into the venv

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
@eakmanrq eakmanrq force-pushed the eakmanrq/circleci-to-gha branch from e81673f to 2e5b5b0 Compare March 12, 2026 16:14
eakmanrq and others added 3 commits March 12, 2026 09:18
- engine-tests-docker "Run tests" step needs venv activated for pytest
- test_migration.sh needs to create and activate venv before make install-dev

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The second uv venv call fails because the venv already exists from
the first call. Adding --clear allows it to recreate the venv.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
- Reduce PYTEST_XDIST_AUTO_NUM_WORKERS from 8 to 4 for style-and-cicd-tests
  to prevent OOM errors with Spark tests on GHA runners
- Add fetch-depth: 0 to style-and-cicd-tests checkout so setuptools_scm
  can resolve the version from git tags (fixes test_version_schema failure)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
eakmanrq and others added 22 commits March 12, 2026 10:29
4 workers still caused OOM on GHA runners (7GB RAM). Reducing to 2
to give Spark tests enough memory headroom.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The Playwright container had slow I/O causing the webServer build to
exceed the 120s timeout. Running directly on ubuntu-latest with
explicit Playwright browser installation avoids container overhead
and enables pnpm caching.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
Using ubuntu-latest with --with-deps downloads hundreds of system
packages. Revert to using the Playwright container which has all
browser dependencies pre-installed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The Playwright webServer command (npm run build && npm run preview)
was timing out in CI because the full TypeScript + Vite build exceeds
the 120s timeout inside the container. Pre-build the UI in a separate
step and set PLAYWRIGHT_SKIP_BUILD so Playwright only starts the
preview server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The Playwright webServer was timing out because vite preview defaulted
to binding on localhost which may resolve to IPv6 ::1 in the container,
while Playwright checks 127.0.0.1:8005. Explicitly bind to 127.0.0.1
and split unit/e2e test steps for better isolation of the env var.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
GitHub Actions sets HOME=/github/home (owned by uid 1001) but the
container runs as root. Firefox refuses to launch when HOME is owned
by a different user. Setting HOME=/root fixes the ownership mismatch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The freeze was causing a mismatch: the in-test yesterday_ds() call was
frozen but the one inside init_example_project() was not (likely a
pytest-xdist interaction). Both sides naturally agree on the date
without the freeze.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
GHA standard runners have ~7GB RAM. Spark's JVM OOMs with the default
worker count. Limiting to 2 workers keeps memory usage in check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The integration test config uses OAuth (databricks-oauth) which
requires these credentials.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
…tests

Newer snowflake-connector-python versions require the authenticator
to be explicitly set to SNOWFLAKE_JWT when using private key auth.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The integration test config expects FABRIC_HOST (not FABRIC_SERVER)
and FABRIC_WORKSPACE_ID which was missing entirely.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The manage-test-db.sh script uses `snow sql --temporary-connection`
which reads SNOWFLAKE_AUTHENTICATOR from the environment. Without it,
the CLI defaults to password auth and fails with private key.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The guard-% macro used shell indirect expansion which breaks when
the variable contains JSON (quotes, newlines). Use printenv instead
which just checks if the variable is set without expanding its value.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The init function runs for both 'up' and 'down'. On teardown, curl
fails writing the binary (exit code 23) because the running proxy
holds it. Skip download if binary exists and skip proxy start if
already running.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The Databricks CLI unified auth requires DATABRICKS_HOST to know which
workspace to authenticate against. Set it from DATABRICKS_SERVER_HOSTNAME.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The Databricks CLI unified auth prioritizes OAuth M2M (client_id +
client_secret) over PAT when both are present. The OAuth credentials
are for the test suite, not the CLI. Unset OAuth vars and set
DATABRICKS_TOKEN from DATABRICKS_ACCESS_TOKEN for CLI commands.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The integration tests use OAuth (client_id + client_secret), not PAT.
Revert the CLI workaround and remove DATABRICKS_ACCESS_TOKEN so the
CLI uses the same OAuth credentials.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
…ions

The external volume doesn't have LIST privileges on the dynamically
generated CI database paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
Both are required by the Athena integration test config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
The Spark JVM defaults to grabbing ~1GB+ of heap memory. With 2 xdist
workers each spawning Spark, this exceeds the 7GB available on GitHub
Actions runners. Capping spark.driver.memory at 512m prevents the
"Cannot allocate memory" failures in test_pyspark_python_model and
the spark db_api tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: eakmanrq <6326532+eakmanrq@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants