Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
5a5189f
Add release automation script
Joao-Dionisio Apr 3, 2026
a061adc
Add scipoptsuite-deploy integration to release script
Joao-Dionisio Apr 3, 2026
b137b33
Merge branch 'master' into release-automation
Joao-Dionisio Apr 3, 2026
8501bec
Address review: clean dir check, version validation, remote tag check
Joao-Dionisio Apr 3, 2026
73d63cf
Split deploy into upgrade_scip.sh, simplify release.sh
Joao-Dionisio Apr 3, 2026
bbb3e22
Harden release scripts: validate sed replacements, fix dispatch race,…
Joao-Dionisio Apr 9, 2026
e37574b
Merge branch 'master' into release-automation
Joao-Dionisio Apr 9, 2026
0096ff3
Skip deploy build when release already exists
Joao-Dionisio Apr 9, 2026
e43be80
Add PR checklist and update RELEASE.md for automated workflow
Joao-Dionisio Apr 9, 2026
af99db4
Harden release scripts: idempotency check, pyproject sed guard, remot…
Joao-Dionisio Apr 22, 2026
adc1d08
Add --dry-run, pin wheel build to tag via --ref, guard CHANGELOG insert
Joao-Dionisio Apr 22, 2026
f7182d7
Merge branch 'master' into release-automation
Joao-Dionisio Apr 22, 2026
b23395a
Allow --dry-run from any branch (real runs still require master)
Joao-Dionisio Apr 22, 2026
68e61a9
Split release.sh into two phases via release-candidate branch
Joao-Dionisio Apr 22, 2026
a0698bd
Switch release.sh phases to explicit --finalize/--rollback flags
Joao-Dionisio Apr 22, 2026
3d190ee
Document two-phase release flow in RELEASE.md
Joao-Dionisio Apr 22, 2026
e3c2136
Rename staging branch, drop time estimates, add --version override
Joao-Dionisio Apr 22, 2026
6f59439
Use 'release-candidate' instead of 'staging'
Joao-Dionisio Apr 22, 2026
212f89b
Merge branch 'master' into release-automation
Joao-Dionisio Apr 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 67 additions & 14 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,72 @@
# Release Checklist
The following are the steps to follow to make a new PySCIPOpt release. They should mostly be done in order.
- [ ] Check if [scipoptsuite-deploy](https://github.com/scipopt/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](https://pyscipopt.readthedocs.io/en/latest/build.html#building-from-source) needs to be updated.
- [ ] Update version number according to semantic versioning [rules](https://semver.org/) in `src/pyscipopt/_version.py` and `setup.py`
- [ ] Update `CHANGELOG.md`; Change the `Unreleased` to 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

## Upgrading SCIP

Run `./upgrade_scip.sh` from the `master` branch (use `--dry-run` first to preview without side effects). The script will:
1. Prompt for SCIP, SoPlex, GCG, and IPOPT versions
2. Build new binaries via [scipoptsuite-deploy](https://github.com/scipopt/scipoptsuite-deploy) (skipped if a matching release already exists)
3. Create a branch, update `pyproject.toml`, and open a PR

On the PR:
- [ ] Fix any API incompatibilities
- [ ] Get CI green
- [ ] Update the [compatibility table](https://pyscipopt.readthedocs.io/en/latest/build.html#building-from-source) if needed
- [ ] Merge into `master`

## Releasing PySCIPOpt

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.

### Phase 1 — start

```bash
pip install -i https://test.pypi.org/simple/ PySCIPOpt
./release.sh
```
- [ ] 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)

Prompts 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):

```bash
git tag vX.X.X
git push origin vX.X.X
./release.sh --version=X.Y.Z
```
- [ ] Then make a github [release](https://github.com/scipopt/PySCIPOpt/releases/new) from this new tag.
- [ ] Update the documentation: from readthedocs.io -> Builds -> Build version (latest and stable)

### Manual verification

Once the release-candidate workflow finishes, install from test-pypi and smoke-test:

```bash
pip install -i https://test.pypi.org/simple/ PySCIPOpt==X.Y.Z
```

### Phase 2 — finalize or roll back

If the smoke test **passes**:

```bash
./release.sh --finalize
```

Checks 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):

```bash
./release.sh --rollback
```

Deletes 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.

### After finalize

- [ ] Release to production pypi:
```bash
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:
```bash
gh release create vX.Y.Z --repo scipopt/PySCIPOpt --title vX.Y.Z --generate-notes
```
- [ ] Update readthedocs: Builds -> Build version (latest and stable)
Loading
Loading