Manually run the Bump version & trigger release workflow and pick the bump type. That is the whole release.
The workflow bumps the version, creates the rel/X.Y.Z branch, merges it to master, and pushes the tag
vX.Y.Z. That tag push triggers two workflows in parallel:
- Build Python Package and Create Release — builds every component,
creates the GitHub release, publishes to PyPI, and posts to
#releases. - Netlify Deploy — builds and publishes the documentation (takes ~15 minutes, so the packages reach PyPI well before the docs go live).
The styling of the documentation is taken from the master branch. For more details see
generate.sh.
Both downstream workflows key off the tag, so a release that stalled can be resumed by hand:
- if the tag was never pushed, check out the
Release X.Y.Zcommit onmaster, tag itvX.Y.Z, and push the tag to the gooddata/gooddata-python-sdk repository (e.g.git push <remote> vX.Y.Z) - if only the documentation failed, dispatch Netlify Deploy manually; it does not need the tag
The tag has to be pushed with a personal access token. GitHub does not trigger workflows from pushes made with
the default GITHUB_TOKEN, so a tag pushed by a workflow using it would silently start nothing.
Use this whenever a release must contain a specific fix and not everything currently on master — whether
that is an old line (1.60 while master is at 1.73) or the newest one.
Do not use the Bump version & trigger release workflow for this. Its
last step is git checkout master && git merge, which would drag the old code and version numbers onto
master. Its patch bump type means "release master as a patch", not "patch the released line".
Only the tagging is automated; the rest is manual by nature.
Prerequisite: the fix is already merged to master. The patch branch is never merged back, so this is what
keeps the fix from being lost in the next release.
-
Pick the base and the new version. List what the line already has with
git branch -rl '<remote>/rel/1.60.*'. The base is the newest of them, and the new version increments the patch component of that base — sorel/1.60.0gives1.60.1, but if the line was already patched torel/1.60.2the next one is1.60.3. The steps below use1.60.1; substitute your version throughout. -
Create the release branch first, so the fix has somewhere to be reviewed into:
git fetch <remote> # Branch from the base chosen in step 1, not blindly from X.Y.0 -- on an already-patched # line that would be rel/1.60.2, and starting from 1.60.0 would drop the earlier fixes. git checkout -b rel/1.60.1 <remote>/rel/1.60.0 git push <remote> rel/1.60.1
-
Cherry-pick the fix through a pull request:
git checkout -b fix/backport-1.60 rel/1.60.1 git cherry-pick <sha-on-master> git push <remote> fix/backport-1.60
Open the PR against
rel/1.60.1. The pre-merge pipeline runs because it triggers onrel/**. Merge once it is green. -
Bump the version on the release branch. These commands mirror the Install dependencies through Bump version in codebase steps of bump-version.yaml — if that workflow gains or reorders a step, update this block with it:
git checkout rel/1.60.1 && git pull uv sync --only-group release --locked uv run python ./scripts/bump_doc_dependencies.py 1.60.1 make release-ci VERSION=1.60.1 git add -A && git commit -m "Release 1.60.1" git push <remote> rel/1.60.1
git add -Arather thancommit -am, matching the workflow, so a newly created file is not dropped. On an older lineuv sync --lockedcan fail if the lock file predates the current uv; re-lock if so. -
Tag it. This is the only trigger; everything after it is automatic:
git tag v1.60.1 git push <remote> v1.60.1
The release is then built and published exactly like any other. Two things differ, and release-tag-checks handles both: the GitHub release does not take the "Latest" badge from the newest version, and the documentation is not rebuilt — the docs build checks out the triggering tag, so publishing from one would put an outdated site live.
A tag runs the workflows as they exist at that tag, not on master. Release lines branched before the release automation was added therefore run their own older copies, in which
make_latestis hardcoded totrue. Before tagging such a line, cherry-pick.github/workflows/build-release.yamland.github/actions/release-tag-checks/ontorel/X.Y.Z— otherwise the patch takes the "Latest" badge, which also changes whatGET /releases/latestreturns. If you only notice afterwards, untick "Set as the latest release" on the GitHub release by hand. Those older copies have no tag trigger on the docs workflow, so the documentation is safe either way.
The docs site keeps the four newest release branches, sorted by major.minor, and a section is named after the
major.minor only. Consequences worth knowing before someone goes looking:
- A patch never publishes its own documentation — the deploy is gated on the tag being on master.
rel/1.72.1does take over the1.72section fromrel/1.72.0, but only at the next deploy from master: the following release, or a manual dispatch of Netlify Deploy if you need it sooner. - Both branches still occupy a slot of the four, so one patch inside the window drops the site from four displayed versions to three.
- Patching an old line (
rel/1.60.1whilemasteris at 1.73) falls outside the window entirely and never appears in the docs.
To publish current master as a dev release version, use Dev release from master GitHub workflow.
- Github release could not be created as the same release already exists.
Possible Solutions:
- Delete the release and retry.
- It's highly probable that also Pypi release exists, so it's easier to bump version and try with higher version tag
- Pypi upload failed with file already exists.
The file with the same name ever existed, it does not matter that it no longer exists
(see the linkded document)
Possible solutions:
- It's desirable to have a release in consistent state (all packages of the given version updoaded in pypi), so in case there was partial success, please upload rest of packages manually as described in packaging documentation Credentials were distributed though LastPass
- Another solution is to bump version and create new release
Repository is integrated with readthedocs pages. Currently, we have set up three separate documentation projects:
- gooddata-sdk
- gooddata-pandas
- gooddata-fdw
The setup requires special configuration in project advanced settings:
- Field requirements file - set to
<project>/docs/requirements.txt - Field Python configuration file - set to
<project>/docs/conf.py
Project environment variable CWD_TO_ROOT_RELATIVE must be set to . with public access.
User used to create project integration must have admin rights to the repository and OAuth to organization must be permitted. If any of it is missing, readthedocs will not be able to set up webhooks in the repository. Once webhooks are created, user admin rights to repository can and should be revoked.
Even if webhooks are currently in use, they could be replaced with github action https://github.com/dfm/rtds-action. Github action together with github-vault integration would make possible to maintain readthedocs setup without help of other teams.