Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/publish-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:

- name: Check tag matches pyproject version
run: |
VERSION=$(python3 -c "import tomllib; d=tomllib.load(open('pyproject.toml','rb')); print(d['tool']['poetry']['version'])")
VERSION=$(poetry version --short)
TAG="${GITHUB_REF_NAME#v}"

echo "pyproject version: $VERSION"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-testpypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:

- name: Check tag matches pyproject version
run: |
VERSION=$(python3 -c "import tomllib; d=tomllib.load(open('pyproject.toml','rb')); print(d['tool']['poetry']['version'])")
VERSION=$(poetry version --short)
TAG="${GITHUB_REF_NAME#v}"

echo "pyproject version: $VERSION"
Expand Down
82 changes: 47 additions & 35 deletions docs/developer_guide/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,33 @@ The document outlines the steps to build and release the `deeptab` package. At t
'edgeLabelBackground': '#f9fafb'
}}}%%
flowchart TD
A[Create release/vX.Y.Z branch]:::setup --> B[Bump version]:::setup
B --> C[Update CHANGELOG.md]:::setup
C --> D[Commit & push branch]:::setup
D --> E[Open PR: release/vX.Y.Z → main]:::pr
E --> F{Review & approve}:::decision
F --> G[Merge PR into main]:::pr
G --> H[git checkout main && git pull]:::git
H --> I{Release type?}:::decision
I -->|RC| J["git tag vX.Y.ZrcN\ngit push origin vX.Y.ZrcN"]:::git
I -->|Stable| K["git tag vX.Y.Z\ngit push origin vX.Y.Z"]:::git
J --> L[CI: publish-testpypi.yml]:::ci
K --> M[CI: publish-pypi.yml]:::ci
L --> N[TestPyPI + GitHub pre-release]:::rc
M --> O[PyPI + GitHub Release]:::stable

classDef setup fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
classDef pr fill:#ede9fe,stroke:#8b5cf6,color:#3b0764
A[Create release/vX.Y.Z branch]:::setup --> B{Release type?}:::decision
B -->|RC| RC1[Bump version e.g. 1.7.0rc1]:::setup
B -->|Stable| ST1[Bump version e.g. 1.7.0]:::setup
RC1 --> RC2[Update CHANGELOG.md]:::setup
RC2 --> RC3[Commit & push branch]:::setup
RC3 --> RC4["git tag vX.Y.ZrcN<br/>git push origin vX.Y.ZrcN"]:::git
RC4 --> RC5[CI: publish-testpypi.yml]:::ci
RC5 --> RC6[TestPyPI + GitHub pre-release]:::rc
RC6 -->|Issues found| RC1
RC6 -->|RC approved| ST1
ST1 --> ST2[Update CHANGELOG.md]:::setup
ST2 --> ST3[Commit & push branch]:::setup
ST3 --> ST4[Open PR: release/vX.Y.Z → main]:::pr
ST4 --> ST5{Review & approve}:::decision
ST5 --> ST6[Merge PR into main]:::pr
ST6 --> ST7[git checkout main && git pull]:::git
ST7 --> ST8["git tag vX.Y.Z<br/>git push origin vX.Y.Z"]:::git
ST8 --> ST9[CI: publish-pypi.yml]:::ci
ST9 --> ST10[PyPI + GitHub Release]:::stable

classDef setup fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
classDef pr fill:#ede9fe,stroke:#8b5cf6,color:#3b0764
classDef decision fill:#fef9c3,stroke:#ca8a04,color:#713f12
classDef git fill:#f0fdf4,stroke:#22c55e,color:#14532d
classDef ci fill:#fff7ed,stroke:#f97316,color:#7c2d12
classDef rc fill:#fdf4ff,stroke:#d946ef,color:#701a75
classDef stable fill:#ecfdf5,stroke:#10b981,color:#064e3b
classDef git fill:#f0fdf4,stroke:#22c55e,color:#14532d
classDef ci fill:#fff7ed,stroke:#f97316,color:#7c2d12
classDef rc fill:#fdf4ff,stroke:#d946ef,color:#701a75
classDef stable fill:#ecfdf5,stroke:#10b981,color:#064e3b
```

## 1. Test documentation
Expand Down Expand Up @@ -86,37 +91,44 @@ git commit -m "bump: version 1.6.1 → 1.7.0rc1"

The version number follows the format `major.minor.patch` for stable, or `major.minor.patchrcN` for release candidates.

## 3. Release PR
## 3. Tag and publish a release candidate

RC tags are pushed **directly from the release branch** — no PR to `main` required.

```bash
git tag -a vX.Y.ZrcN -m "Release candidate vX.Y.ZrcN"
git push origin vX.Y.ZrcN
```

This triggers `publish-testpypi.yml`, which publishes to **TestPyPI** and creates a GitHub pre-release.

If issues are found, fix them on the release branch, bump to the next RC (`rcN+1`), and repeat.

## 4. Release PR (stable only)

Once all RCs are approved, open a PR from `release/vX.Y.Z` to `main`:

- Open a PR from `release/vX.Y.Z` to `main`
- After review and approval, merge the PR
- **Merging to `main` does NOT trigger a PyPI release**

> **Promoting a model from experimental to stable?** Verify the [Model Promotion Policy](model_promotion_policy.md) checklist is complete before merging a release PR that includes a promotion.

## 4. Create and push the Git tag
## 5. Create and push the stable tag

After the release PR is merged, the maintainer creates the release tag:
After the release PR is merged:

```bash
git checkout main && git pull
git tag -a vX.Y.Z -m "Release vX.Y.Z"
git push origin vX.Y.Z
```

For a release candidate:

```bash
git tag -a vX.Y.Zrc1 -m "Release candidate vX.Y.Zrc1"
git push origin vX.Y.Zrc1
```

## 5. Publish package to PyPI
## 6. Publish package to PyPI

The tag push automatically triggers the appropriate workflow in GitHub Actions:

- Stable tag (`vX.Y.Z`) → `publish-pypi.yml` → publishes to **PyPI** + creates GitHub Release
- RC tag (`vX.Y.Zrc1`) → `publish-testpypi.yml` → publishes to **TestPyPI** + creates GitHub pre-release
- RC tag (`vX.Y.ZrcN`) → `publish-testpypi.yml` → publishes to **TestPyPI** + creates GitHub pre-release

Both workflows:

Expand All @@ -127,6 +139,6 @@ Both workflows:

> **Note:** A `pypi-publish` GitHub Environment (for stable) and `testpypi-publish` environment (for RCs) must be configured with tag-based deployment protection rules.

## 6. GitHub Release
## 7. GitHub Release

The GitHub Release is created automatically by the publish workflow. Verify the release notes are correct and add any manual context if needed.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[tool.poetry]
name = "deeptab"

version = "1.7.0rc1"
version = "1.7.0rc2"


description = "A python package for tabular deep learning."
Expand Down
Loading