Run ./upgrade_scip.sh from the master branch (use --dry-run first to preview without side effects). The script will:
- Prompt for SCIP, SoPlex, GCG, and IPOPT versions
- Build new binaries via scipoptsuite-deploy (skipped if a matching release already exists)
- Create a branch, update
pyproject.toml, and open a PR
On the PR:
- Fix any API incompatibilities
- Get CI green
- Update the compatibility table if needed
- Merge into
master
Releases run in two phases from master, driven by ./release.sh. The tag and master push only happen in phase 2, so an aborted release leaves no semantic public trace — just a deletable release-candidate-vX.Y.Z branch.
Use --dry-run with any command to preview without side effects.
./release.shPrompts for the version bump (patch/minor/major), updates _version.py, setup.py, and CHANGELOG.md, commits locally, pushes the commit to release-candidate-vX.Y.Z on origin, and triggers the build-wheels workflow on that branch (uploads to test-pypi). Master is not pushed, no tag is created. The script exits as soon as the workflow is dispatched.
To skip the bump prompt (e.g., when test-pypi has already burnt the default next version and you need to jump ahead):
./release.sh --version=X.Y.ZOnce the release-candidate workflow finishes, install from test-pypi and smoke-test:
pip install -i https://test.pypi.org/simple/ PySCIPOpt==X.Y.ZIf the smoke test passes:
./release.sh --finalizeChecks the release-candidate workflow succeeded, then tags vX.Y.Z, pushes master, and deletes the release-candidate branch.
If the smoke test fails (or you change your mind):
./release.sh --rollbackDeletes the release-candidate branch and resets the local release commit. test-pypi has already burnt the uploaded version string, so the next attempt must use --version= to pick a different one.
- Release to production pypi:
gh workflow run build_wheels.yml --repo scipopt/PySCIPOpt --ref vX.Y.Z -f upload_to_pypi=true -f test_pypi=false
- Create a GitHub release:
gh release create vX.Y.Z --repo scipopt/PySCIPOpt --title vX.Y.Z --generate-notes
- Update readthedocs: Builds -> Build version (latest and stable)
The following are the steps to follow to make a new PySCIPOpt release. They should mostly be done in order.
- Check if scipoptsuite-deploy needs a new release, if a new SCIP version is released for example, or new dependencies (change symmetry dependency, add support for papilo/ parallelization.. etc). And Update release links in
pyproject.toml - Check if the table in the documentation needs to be updated.
- Update version number according to semantic versioning rules in
src/pyscipopt/_version.pyandsetup.py - Update
CHANGELOG.md; Change theUnreleasedto the new version number and add an empty unreleased section. - Create a release candidate on test-pypi by running the workflow “Build wheels” in Actions->build wheels, with these parameters
upload:true, test-pypi:true - If the pipeline passes, test the released pip package on test-pypi by running and checking that it works
pip install -i https://test.pypi.org/simple/ PySCIPOpt- If it works, release on pypi.org with running the same workflow but with
test-pypi:false. - Then create a tag with the new version (from the master branch)
git tag vX.X.X
git push origin vX.X.X- Then make a github release from this new tag.
- Update the documentation: from readthedocs.io -> Builds -> Build version (latest and stable)