Skip to main content

portover

Migrate one config dialect to another, one directive at a time.

You're mid-migration at 2am, searching "jenkins post always github actions equivalent". portover is the tool — and the doc site — built for exactly that moment.

$ portover detect .
  pip-to-uv: requirements.txt
  jenkins-to-gha: Jenkinsfile

$ portover run jenkins-to-gha .
== jenkins-to-gha: Jenkinsfile (declarative pipeline) -> .github/workflows/*.yml

  + agent        1x
  + stages       4x
  + parallel     1x
  ! triggers     1x

Manual steps:
  ! [environment] API_TOKEN = credentials('api-token')
      create repo secret API_TOKEN with the value of Jenkins credential 'api-token'
  ...

--- .github/workflows/ci.yml (dry run; pass --write to save) ---

Dry run by default. --write saves the output. Nothing is ever silently dropped: every source directive is either mapped, flagged as a manual step with instructions, or listed as unmapped so you know exactly what's left.

Migrations

id from to
pip-to-uv requirements.txt (pip) pyproject.toml (uv)
jenkins-to-gha Jenkinsfile (declarative) .github/workflows/*.yml
travis-to-gha .travis.yml (Travis CI) .github/workflows/*.yml
gitlab-ci-to-gha .gitlab-ci.yml (GitLab CI) .github/workflows/*.yml
circleci-to-gha .circleci/config.yml (CircleCI) .github/workflows/*.yml
azure-pipelines-to-gha azure-pipelines.yml (Azure Pipelines) .github/workflows/*.yml
bitbucket-to-gha bitbucket-pipelines.yml (Bitbucket) .github/workflows/*.yml
buildkite-to-gha Buildkite pipeline.yml .github/workflows/*.yml
drone-to-gha .drone.yml (Drone CI) .github/workflows/*.yml
woodpecker-to-gha .woodpecker.yml (Woodpecker CI) .github/workflows/*.yml
flake8-to-ruff .flake8 / setup.cfg ruff.toml

Browse docs/ — one page per directive, generated from the mappings themselves, so the docs can never drift from the code.

Install

pip install portover   # or: uv tool install portover

Zero dependencies, stdlib only, Python ≥ 3.11.

The design in one paragraph

A migration is a folder. A mapping is one small file in it that handles exactly one source directive — -e, post { failure }, max-line-length — with a matches(), an apply(), and a META block holding a real before/after example. Mappings register themselves by existing (the folder is scanned), the docs are generated from META, and the report the CLI prints is the same data. Fix the mapping and the converter, the docs page, and the report all update together.

Contributing

The contributor unit is one mapping for one directive — a ~40-line file plus a test. If portover printed ? unmapped for something in your migration, that's the file you get to write. See CONTRIBUTING.md.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

portover-0.9.0.tar.gz (226.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

portover-0.9.0-py3-none-any.whl (262.0 kB view details)

Uploaded Python 3

File details

Details for the file portover-0.9.0.tar.gz.

File metadata

  • Download URL: portover-0.9.0.tar.gz
  • Upload date:
  • Size: 226.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for portover-0.9.0.tar.gz
Algorithm Hash digest
SHA256 33e8347f67b9c58599bee3f0c6653c794f341cf5e8c63b9725b23e02d817aa4a
MD5 12d9632fd3027aec39a6a2f7175a9b6d
BLAKE2b-256 5c5f0e245592714fd565ae37baf1893d574328c52265fe44d7945992474e11be

See more details on using hashes here.

Provenance

The following attestation bundles were made for portover-0.9.0.tar.gz:

Publisher: release.yml on sophie-nguyenthuthuy/portover

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file portover-0.9.0-py3-none-any.whl.

File metadata

  • Download URL: portover-0.9.0-py3-none-any.whl
  • Upload date:
  • Size: 262.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for portover-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 541ead9a782a9aec8dd1dcb6946bb7a79242198a175ae5c779d1d827bb8b0aff
MD5 ae411ac23bdedfb777f6aa2a200f0c76
BLAKE2b-256 523e38e9b8aa14787057135ec571afe02899fb8c57056ed3c0c5162f6f82a9fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for portover-0.9.0-py3-none-any.whl:

Publisher: release.yml on sophie-nguyenthuthuy/portover

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page