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 |
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file portover-0.7.0.tar.gz.
File metadata
- Download URL: portover-0.7.0.tar.gz
- Upload date:
- Size: 184.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b11461dcd845c43aee0f2d431b67f0b3b83684b6566040d50bf9dc34f8884ab
|
|
| MD5 |
f24cf0c23df4f447946872c81b4cc539
|
|
| BLAKE2b-256 |
4e20bef77ea22693195af216e8339f843be0d3f5238e303da74c6815fbda810a
|
Provenance
The following attestation bundles were made for portover-0.7.0.tar.gz:
Publisher:
release.yml on sophie-nguyenthuthuy/portover
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
portover-0.7.0.tar.gz -
Subject digest:
5b11461dcd845c43aee0f2d431b67f0b3b83684b6566040d50bf9dc34f8884ab - Sigstore transparency entry: 2391529692
- Sigstore integration time:
-
Permalink:
sophie-nguyenthuthuy/portover@d6be440a292cc003ac02ec3b95a027172b3bdc1f -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/sophie-nguyenthuthuy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d6be440a292cc003ac02ec3b95a027172b3bdc1f -
Trigger Event:
push
-
Statement type:
File details
Details for the file portover-0.7.0-py3-none-any.whl.
File metadata
- Download URL: portover-0.7.0-py3-none-any.whl
- Upload date:
- Size: 217.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
019c975f8132fe982c12e4f0c2cd22dd1ca7c606d0da777eda3a64b5b1313b6c
|
|
| MD5 |
e68ab67b3f8291e3ab7c608158653388
|
|
| BLAKE2b-256 |
6f87c8fbcfea3d036a0c05fd05e7bc2df67c85e61b45b8738d656fd93a306cd9
|
Provenance
The following attestation bundles were made for portover-0.7.0-py3-none-any.whl:
Publisher:
release.yml on sophie-nguyenthuthuy/portover
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
portover-0.7.0-py3-none-any.whl -
Subject digest:
019c975f8132fe982c12e4f0c2cd22dd1ca7c606d0da777eda3a64b5b1313b6c - Sigstore transparency entry: 2391529801
- Sigstore integration time:
-
Permalink:
sophie-nguyenthuthuy/portover@d6be440a292cc003ac02ec3b95a027172b3bdc1f -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/sophie-nguyenthuthuy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d6be440a292cc003ac02ec3b95a027172b3bdc1f -
Trigger Event:
push
-
Statement type: