|
| 1 | +# Dataverse Python SDK Release Guide |
| 2 | + |
| 3 | +Step-by-step release process for the PowerPlatform Dataverse Client Python SDK. |
| 4 | + |
| 5 | +**SDK Repository**: [microsoft/PowerPlatform-DataverseClient-Python](https://github.com/microsoft/PowerPlatform-DataverseClient-Python) |
| 6 | +**PyPI Package**: [PowerPlatform-Dataverse-Client](https://pypi.org/project/PowerPlatform-Dataverse-Client/) |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +## Prerequisites |
| 11 | + |
| 12 | +- Write access to the GitHub repository (microsoft/PowerPlatform-DataverseClient-Python) |
| 13 | +- Access to the Azure DevOps CI/CD pipeline for PyPI publishing: https://dev.azure.com/dynamicscrm/OneCRM/_build?definitionId=29949 |
| 14 | +- _(Optional)_ **GitHub CLI (`gh`)** — enables automated PR creation and GitHub releases from the terminal. |
| 15 | + - Install: `winget install GitHub.cli`, then `gh auth login`. |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## Release Checklist |
| 20 | + |
| 21 | +### Step 1: Identify Changes Since Last Release |
| 22 | + |
| 23 | +1. Find the last release version and date in CHANGELOG.md (the current dev version is in `pyproject.toml` under `version`) |
| 24 | +2. List merged PRs since the last release: |
| 25 | + - GitHub UI: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/pulls?q=is%3Apr+is%3Amerged |
| 26 | + - Or via git: `git log --oneline --since="<last-release-date>"` |
| 27 | +3. For each PR, read the full description to understand the user-facing impact |
| 28 | + |
| 29 | +### Step 2: Update CHANGELOG.md |
| 30 | + |
| 31 | +1. Create a branch: `git checkout -b release/v<version>` (e.g., `release/v0.1.0b6`) |
| 32 | +2. Add a new section at the top of CHANGELOG.md (below the header), using today's date: |
| 33 | + |
| 34 | +```markdown |
| 35 | +## [X.Y.Z] - YYYY-MM-DD |
| 36 | + |
| 37 | +### Added |
| 38 | +- Description of new feature (#PR_NUMBER) |
| 39 | + |
| 40 | +### Fixed |
| 41 | +- Description of bug fix (#PR_NUMBER) |
| 42 | +``` |
| 43 | + |
| 44 | +3. Add a version comparison link at the bottom of CHANGELOG.md: |
| 45 | + |
| 46 | +```markdown |
| 47 | +[X.Y.Z]: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/compare/vPREVIOUS...vX.Y.Z |
| 48 | +``` |
| 49 | + |
| 50 | +**Changelog writing rules:** |
| 51 | + |
| 52 | +- Focus on **why it matters to users**, not implementation details |
| 53 | +- Do NOT reference internal function names or implementation choices |
| 54 | +- DO describe the user-visible behavior change or new capability |
| 55 | +- Include PR numbers for reference: `(#123)` |
| 56 | + |
| 57 | +**Category headings:** |
| 58 | +- New features → **Added** |
| 59 | +- Changes to existing functionality → **Changed** |
| 60 | +- Soon-to-be removed features → **Deprecated** |
| 61 | +- Removed features → **Removed** |
| 62 | +- Bug fixes → **Fixed** |
| 63 | +- Security fixes → **Security** |
| 64 | + |
| 65 | +**What to exclude:** |
| 66 | +- Internal refactoring (unless it affects performance/behavior) |
| 67 | +- Test-only changes |
| 68 | +- CI/CD changes |
| 69 | +- Documentation-only updates |
| 70 | + |
| 71 | +### Step 3: Create PR for Changelog |
| 72 | + |
| 73 | +1. Commit: `git add CHANGELOG.md && git commit -m "Update CHANGELOG.md for v<version> release"` |
| 74 | +2. Push: `git push -u origin release/v<version>` |
| 75 | +3. Create a PR on GitHub targeting `main`: |
| 76 | + - **With `gh` CLI:** `gh pr create --base main --title "Update CHANGELOG.md for v<version> release" --body "Release changelog for v<version>"` |
| 77 | +4. Get the PR reviewed and merged |
| 78 | + |
| 79 | +### Step 4: Create Git Tag |
| 80 | + |
| 81 | +After the changelog PR is merged: |
| 82 | + |
| 83 | +1. Pull latest main: |
| 84 | +```bash |
| 85 | +git switch main |
| 86 | +git pull origin main |
| 87 | +``` |
| 88 | + |
| 89 | +2. Create and push the tag: |
| 90 | +```bash |
| 91 | +git tag -a v<version> -m "Release v<version>" |
| 92 | +git push origin v<version> |
| 93 | +``` |
| 94 | + |
| 95 | +> **Important:** The tag must be on the `main` commit that includes the changelog update. |
| 96 | +
|
| 97 | +### Step 5: Publish to PyPI |
| 98 | + |
| 99 | +Trigger the Azure DevOps CI/CD pipeline: |
| 100 | +- Pipeline: https://dev.azure.com/dynamicscrm/OneCRM/_build?definitionId=29949 |
| 101 | + |
| 102 | +**Runtime variables (set when queuing the pipeline):** |
| 103 | + |
| 104 | +| Variable | Description | |
| 105 | +|---|---| |
| 106 | +| `PushToPyPI` | Set to `true` to publish to PyPI. If not set, the pipeline builds, tests, and produces artifacts without publishing. | |
| 107 | +| `PackageVersion` | The version string for the release (e.g., `0.1.0b7`). Leave empty to use the version from `pyproject.toml`. | |
| 108 | + |
| 109 | +**Recommendation:** First run the pipeline **without** setting `PushToPyPI` to `true`. This validates the build, tests, and packaging. Once the dry run succeeds, queue again with `PushToPyPI` set to `true` to publish. |
| 110 | + |
| 111 | +Verify the package appears on PyPI: https://pypi.org/project/PowerPlatform-Dataverse-Client/ |
| 112 | + |
| 113 | +### Step 6: Create GitHub Release |
| 114 | + |
| 115 | +**Before writing release notes:** Review previous releases at https://github.com/microsoft/PowerPlatform-DataverseClient-Python/releases to match the tone, detail level, and formatting conventions. |
| 116 | + |
| 117 | +- **With `gh` CLI:** Extract the release notes from CHANGELOG.md (the Added/Fixed/Changed sections for this version) into a temp file, then run: |
| 118 | + ```bash |
| 119 | + gh release create v<version> --title "v<version>" --notes-file <notes-file> --prerelease |
| 120 | + ``` |
| 121 | + Omit `--prerelease` if the version does **not** contain `a`, `b`, or `rc`. |
| 122 | +- **Without `gh` CLI:** |
| 123 | + 1. Go to: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/releases/new |
| 124 | + 2. Select the tag: `v<version>` |
| 125 | + 3. Title: `v<version>` |
| 126 | + 4. Copy release notes from CHANGELOG.md |
| 127 | + 5. Check **"Set as a pre-release"** if the version contains `a`, `b`, or `rc` (alpha/beta/release candidate) |
| 128 | + 6. Click **Publish release** |
| 129 | + |
| 130 | +### Step 7: Post-Release Version Bump |
| 131 | + |
| 132 | +Immediately after the release, bump the version for the next development cycle: |
| 133 | + |
| 134 | +1. Create a branch: `git checkout -b post-release/bump-<next-version>` |
| 135 | +2. Update `version` in `pyproject.toml` to the next beta (e.g., `0.1.0b6` → `0.1.0b7`) |
| 136 | +3. Stage and commit: |
| 137 | +```bash |
| 138 | +git add pyproject.toml |
| 139 | +git commit -m "Bump version to <next-version> for next development cycle" |
| 140 | +``` |
| 141 | +4. Push: `git push -u origin post-release/bump-<next-version>` |
| 142 | +5. Create a PR on GitHub and merge it: |
| 143 | + - **With `gh` CLI:** `gh pr create --base main --title "Bump version to <next-version> for next development cycle" --body "Post-release version bump"` |
| 144 | + |
| 145 | +--- |
| 146 | + |
| 147 | +## Version Numbering |
| 148 | + |
| 149 | +This project uses Semantic Versioning with PEP 440 pre-release identifiers: |
| 150 | +- Beta releases: `0.1.0b1`, `0.1.0b2`, `0.1.0b3`, ... |
| 151 | +- The version in `pyproject.toml` on `main` should always be one ahead of the latest published release |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +## Key Links |
| 156 | + |
| 157 | +| Resource | URL | |
| 158 | +|---|---| |
| 159 | +| Repository | https://github.com/microsoft/PowerPlatform-DataverseClient-Python | |
| 160 | +| PyPI Package | https://pypi.org/project/PowerPlatform-Dataverse-Client/ | |
| 161 | +| CI/CD Pipeline | https://dev.azure.com/dynamicscrm/OneCRM/_build?definitionId=29949 | |
| 162 | +| Releases | https://github.com/microsoft/PowerPlatform-DataverseClient-Python/releases | |
| 163 | +| Contributing Guide | https://github.com/microsoft/PowerPlatform-DataverseClient-Python/blob/main/CONTRIBUTING.md | |
0 commit comments