Skip to content

Commit 4b4e34e

Browse files
authored
Bump version to 1.29.0 (#1607)
1 parent 530777e commit 4b4e34e

6 files changed

Lines changed: 96 additions & 3 deletions

File tree

.github/scripts/release_verify.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,42 @@ def verify_dist(args: argparse.Namespace) -> None:
108108
print(f" {name}")
109109

110110

111+
def changelog_notes(args: argparse.Namespace) -> None:
112+
changelog_path = pathlib.Path(args.changelog)
113+
lines = changelog_path.read_text(encoding="utf-8").splitlines()
114+
heading = re.compile(r"^## \[(?P<version>[^\]]+)\](?:\s+-\s+.*)?\s*$")
115+
116+
start = None
117+
for index, line in enumerate(lines):
118+
match = heading.match(line)
119+
if match and match.group("version") == args.version:
120+
start = index + 1
121+
break
122+
123+
if start is None:
124+
raise RuntimeError(
125+
f"Could not find changelog section for version {args.version!r}"
126+
)
127+
128+
end = len(lines)
129+
for index in range(start, len(lines)):
130+
if lines[index].startswith("## "):
131+
end = index
132+
break
133+
134+
section_lines = lines[start:end]
135+
while section_lines and not section_lines[0].strip():
136+
section_lines.pop(0)
137+
while section_lines and not section_lines[-1].strip():
138+
section_lines.pop()
139+
140+
if not section_lines:
141+
raise RuntimeError(f"Changelog section for {args.version!r} is empty")
142+
143+
notes = "## Changelog\n\n" + "\n".join(section_lines) + "\n"
144+
pathlib.Path(args.output).write_text(notes, encoding="utf-8")
145+
146+
111147
def main(argv: Sequence[str] | None = None) -> None:
112148
parser = argparse.ArgumentParser()
113149
subparsers = parser.add_subparsers(required=True)
@@ -122,6 +158,12 @@ def main(argv: Sequence[str] | None = None) -> None:
122158
verify_parser.add_argument("--dist-dir", default="dist")
123159
verify_parser.set_defaults(func=verify_dist)
124160

161+
changelog_parser = subparsers.add_parser("changelog-notes")
162+
changelog_parser.add_argument("--version", required=True)
163+
changelog_parser.add_argument("--changelog", default="CHANGELOG.md")
164+
changelog_parser.add_argument("--output", required=True)
165+
changelog_parser.set_defaults(func=changelog_notes)
166+
125167
args = parser.parse_args(argv)
126168
args.func(args)
127169

.github/workflows/release-publish.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ jobs:
111111
python .github/scripts/release_verify.py validate-version \
112112
--sha "$(git rev-parse HEAD)" \
113113
--github-output "$GITHUB_OUTPUT"
114+
- name: Validate changelog release notes
115+
run: |
116+
set -euo pipefail
117+
python .github/scripts/release_verify.py changelog-notes \
118+
--version "${{ steps.validate_versions.outputs.version }}" \
119+
--output /tmp/release-notes.md
114120
- name: Download and flatten artifacts
115121
env:
116122
GH_TOKEN: ${{ github.token }}
@@ -249,6 +255,17 @@ jobs:
249255
permissions:
250256
contents: write
251257
steps:
258+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
259+
with:
260+
ref: ${{ needs.verify_artifacts.outputs.release_sha }}
261+
- name: Build changelog release notes
262+
env:
263+
VERSION: ${{ needs.verify_artifacts.outputs.version }}
264+
run: |
265+
set -euo pipefail
266+
python3 .github/scripts/release_verify.py changelog-notes \
267+
--version "$VERSION" \
268+
--output release-notes.md
252269
- name: Create draft release with generated notes
253270
env:
254271
GH_TOKEN: ${{ github.token }}
@@ -261,4 +278,5 @@ jobs:
261278
--target "$RELEASE_SHA" \
262279
--title "$VERSION" \
263280
--draft \
281+
--notes-file release-notes.md \
264282
--generate-notes

CHANGELOG.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,41 @@ to docs, or any other relevant information.
1919

2020
## [Unreleased]
2121

22+
## [1.29.0] - 2026-06-17
23+
24+
### Added
25+
26+
- Added experimental `temporalio.workflow.signal_with_start_workflow`, backed by
27+
generated system Nexus bindings for
28+
`WorkflowService.SignalWithStartWorkflowExecution`.
29+
- Added OpenAI Agents plugin support for `CustomTool` dispatch, including lazy
30+
tool discovery through `defer_loading`.
31+
32+
### Changed
33+
34+
- Client connections now use gzip transport-level gRPC compression by default.
35+
Pass `grpc_compression=GrpcCompression.NONE` to `Client.connect` or
36+
`CloudOperationsClient.connect` to disable it.
37+
38+
### Breaking Changes
39+
40+
- `StartWorkflowUpdateWithStartInput` now owns the authoritative
41+
`rpc_metadata` and `rpc_timeout` fields for
42+
`OutboundInterceptor.start_update_with_start_workflow`. These fields were
43+
removed from the nested update-with-start input objects, so custom
44+
interceptors that accessed them there should read or update the top-level
45+
fields instead.
46+
2247
### Fixed
2348

49+
- Fixed `breakpoint()` and `pdb.set_trace()` inside workflow code when a worker
50+
runs with `debug_mode=True` or `TEMPORAL_DEBUG=1`; sandboxed workflows without
51+
debug mode now get a clearer error pointing to `debug_mode=True`.
52+
- Fixed `start_update_with_start_workflow` interceptor handling so RPC metadata
53+
and timeouts are forwarded to the underlying `execute_multi_operation` call.
54+
- Fixed OpenAI Agents plugin streamed event serialization when pydantic had not
55+
yet built deferred schemas, and fixed terminal sandbox errors retrying
56+
forever.
2457
- Removed the lazy-connect lock from the per-RPC hot path. It was previously
2558
acquired on every RPC, putting an event-loop-bound primitive on the hot path;
2659
it is now skipped once the client is connected. This reduces the client's

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "temporalio"
3-
version = "1.28.0"
3+
version = "1.29.0"
44
description = "Temporal.io Python SDK"
55
authors = [{ name = "Temporal Technologies Inc", email = "sdk@temporal.io" }]
66
requires-python = ">=3.10"

temporalio/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import temporalio.runtime
2525
from temporalio.bridge.client import RPCError as BridgeRPCError
2626

27-
__version__ = "1.28.0"
27+
__version__ = "1.29.0"
2828

2929
ServiceRequest = TypeVar("ServiceRequest", bound=google.protobuf.message.Message)
3030
ServiceResponse = TypeVar("ServiceResponse", bound=google.protobuf.message.Message)

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)