Repository navigation
chore(deps): update dependency gunicorn to v27 - #14781
Open
renovate-bot wants to merge 1 commit into
Open
renovate-bot wants to merge 1 commit into
renovate-bot wants to merge 1 commit into
Conversation
Contributor
There was a problem hiding this comment.
Code Review
This pull request updates the 'gunicorn' dependency version to '27.0.0' across multiple 'requirements.txt' files in various service directories, including App Engine, Cloud SQL, Eventarc, and Cloud Run. There are no review comments, and I have no feedback to provide.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
==23.0.0→==27.0.0==25.1.0→==27.0.0==26.2.0→==27.0.0==22.0.0→==27.0.0Release Notes
benoitc/gunicorn (gunicorn)
v27.0.0: gunicorn 27.0.0Compare Source
Breaking Changes
Transfer-Encodingdoes not end withchunked, such asgziporidentityalone, with or withoutContent-Length(RFC 9112 §6.3). The WSGI workers used to read such a bodyuntil the connection closed and the ASGI worker treated it as empty. Clients
that send
Transfer-Encoding: identitymust stop sending it.Bug Fixes
Transfer-Encodingvalues (RFC 9110 §5.6.3)(#3364).
Content-Lengththat is not plain digits (RFC 9110 §8.6).(#3371).
414 URI Too Longfor a request line overlimit_request_line(RFC 9112 §3)
(#2487).
Content-Length, and closethe connection when the body is shorter (RFC 9112 §6.3).
response (RFC 9112 §6.3).
(RFC 9110 §5.1, §5.5).
valid reason phrase (RFC 9112 §4).
HEADrequest declares instead of serving it as thenext request (RFC 9112 §6.3).
that never ends; the usual request limits now apply before the line
terminator arrives, and trailers count against
limit_request_fields.forwarded_allow_ipsto HTTP/1 requests as WSGI and HTTP/2already do:
secure_scheme_headersset the scheme only from trustedproxies, and header names with underscores follow
header_map.already does (RFC 9112 §2.2).
instead of serving requests or rebooting the worker forever (ASGI
lifespan spec) (#3778).
keepaliveseconds, asthe other workers do (#3734).
one request stores in
scope["state"]is not seen by the next one (ASGIlifespan spec).
websocket.disconnectas soon as the client closes theconnection, instead of after the close timeout (RFC 6455 §5.5.1).
websocket_max_message_sizesetting (default 16 MiB), and with 1002 for acontrol frame over 125 bytes or fragmented (RFC 6455 §5.5, §7.4.1).
until the app catches up.
body was drained, instead of leaving it until the keepalive timeout
(#3770).
shutdown, and the worker keeps reporting to the arbiter while it waits, so
it is not killed during
max_requestsrestarts.it open with the bytes that followed the body lost.
listen()again on a socket that already listens, such as onepassed by systemd socket activation; SELinux can deny that call.
reuse_porton a platform withoutSO_REUSEPORT, workers now use themaster's sockets instead of failing to bind.
statsd_hostis a numeric IPv6address; they used to be dropped silently.
time. Large uploads are much faster, most of all while other threads keep
the worker busy (#2596).
announces (#2596).
(#3243).
worker_classsetting.timeoutwatches each worker's heartbeat, which idleworkers keep updating.
answers; what follows is never served as another request (RFC 9931 §8).
response header, and leave the header value out of the error.
environ; many copies of one header used to take time growing with the
square of their number.
percent-encoded (RFC 9112 §3.2, RFC 3986 §2.1).
0600, and only use it to stop an orphaned arbiter when this user created
it and the process is ours. A file left there by someone else is ignored.
or pipelined data waits for the application, and resume as it reads; uWSGI
request bodies are read as the application asks for them.
than 1000 PING, SETTINGS or empty DATA frames in 10 seconds, as already done
for RST_STREAM floods.
than 10000 frames pile up while a response waits for window credit.
inside a fragmented one, reserved opcodes, lengths not minimally encoded,
malformed close frames (1002), and text or close reasons that are not UTF-8
(1007) (RFC 6455 §5.2, §5.4, §5.5.1, §7.4, §8.1). An empty client close is
answered with 1000 instead of the reserved 1005.
Sec-WebSocket-Version: 13with 426(and the supported version), and one whose key is not 16 bytes of base64
with 400 (RFC 6455 §4.2.1, §4.2.2).
an HTTP 403 (500 if it raised), as ASGI requires, instead of writing a
WebSocket close frame on a connection that never switched protocols.
as HTTP responses already do, so a slow client cannot grow the worker's
write buffer.
send()after the connection closed raises anOSErrorsubclass, as ASGI 2.4 asks; it is still a
RuntimeError, so existinghandlers keep working, and gunicorn no longer logs it as an error. HTTP
sends after a disconnect stay silently ignored.
timeout, and drop the connection when one fires, so a late chunk is never
read by the next call. A sync stream's idle timeout is no longer replaced
by a fixed 5 seconds.
Expect: 100-continuewith100 Continuewhen the app firstreads the body, so clients such as curl no longer wait about a second before
sending an upload (RFC 9110 §10.1.1).
connection; it used to be dropped without a response, with a traceback
logged for each one (RFC 9112 §3, §5.1).
400 Bad Request, and the error text in the body; the text, which can quote therequest, used to be written into the status line (RFC 9112 §4).
foo, chunked, as the WSGI workers do (RFC 9112 §6.1).1 ;a, as the WSGI workers do (RFC 9112 §7.1.1).bytearrayormemoryviewresponse body when sending it; anapp that reused the buffer after
sendreturned could have the changedbytes sent.
a head or trailer section ended that way kept the connection waiting until a
limit or the timeout (RFC 9112 §2.2).
quoted-string value, such as one with a control character or an unclosed
quote (RFC 9112 §7.1.1).
limit_request_linethat follows an empty line, as the Python parser does(RFC 9112 §2.2, §3).
Changes
fastextra. It parses requests faster,reads a chunked body in time proportional to its size, and accepts and
rejects the same requests as gunicorn's Python parsers, whatever way their
bytes are split across reads.
once per connection, a request is built in one pass over its headers, their
text copy is only made when something reads it, and response bodies of 64
KiB or more are sent without being copied. With one worker, small requests
are about a third faster and streamed responses over 50% faster, and large
responses use much less memory under load.
Full changelog: https://github.com/benoitc/gunicorn/blob/master/docs/content/news.md
v26.2.0: gunicorn 26.2.0Compare Source
Cleartext HTTP/2 lands, and an HTTP/2 security fix.
Cleartext HTTP/2 (h2c)
http2_cleartextacceptsprior-knowledge,upgrade,bothoroff(thedefault). Prior knowledge serves a connection that opens with the HTTP/2
preface;
upgradehonours an HTTP/1.1Upgrade: h2crequest. Both work on thegthread, gevent and asgi workers.
This is for deployments where TLS is terminated by a proxy that speaks HTTP/2
upstream, so the hop into gunicorn no longer drops to HTTP/1.1. Only peers in
forwarded_allow_ipsare considered; everyone else is served HTTP/1.x exactlyas if the setting were off. Each mechanism is enabled separately, so turning one
on does not turn the other on.
Do not expose a cleartext HTTP/2 port to the internet.
Security
HTTP2Requestbuilt its headers straight from the stream, so nothing the HTTP/1path enforces applied over HTTP/2: the underscore and
header_mappolicy,duplicate
HostandContent-Type, control characters in values, and theforwarded_allow_ipstrust gate. An untrusted client could setSCRIPT_NAMEand forge
HTTP_*entries in the WSGI environ, and decidewsgi.url_schemethrough
:scheme. Both request classes now share one policy mixin, and thescheme comes from the transport.
If you serve HTTP/2, this is the reason to upgrade.
Other HTTP/2 fixes
WSGI responses were buffered whole before anything was sent; they stream now.
HEAD, 204 and 304 no longer carry a body. Events read while blocked on a
flow-control window were discarded, losing requests and body data outright.
sendfile()is refused on HTTP/2 responses rather than bypassing framing.Request bodies dropped on Upgrade requests
On the ASGI worker with the fast parser, any request carrying an
Upgradeheader reached the application with an empty body, whatever the header's value
and with HTTP/2 switched off entirely. Fixed in
gunicorn_h1c0.6.9, which thefastextra now requires.Full changelog: https://gunicorn.org/news/
v26.1.0: gunicorn 26.1.0Compare Source
New Features
reload_extra_files: entries containing*,?or[are treated as patterns, so
ui/*/config.jsonwatches every view's configwithout listing them one by one. Patterns are re-expanded on every reload
check rather than once at startup, so a file created later starts being
watched without restarting gunicorn, and
**recurses. A pattern matchingnothing warns instead of failing, since with live expansion it may match later
(#1643,
#3662).
Security
checked against the advisory database.
tornado,h2,setuptoolsandpymdown-extensionspermitted vulnerable versions and now require the firstclean release;
pytestandhttpxwere unpinned and now carry floors. Thetornadoexample pinnedtornado<6, which was both the source of severaladvisories and older than the
>=6.5.0the tornado worker needs, so theexample could not run as pinned.
Bug Fixes
SIGHUP did not reload the logger configuration:
Arbiter.reload()re-read the configuration file but kept using the logger built at startup,
calling only
reopen_files()on its existing handlers. Changes tologconfig,logconfig_dict,logconfig_jsonandloglevelwere ignoreduntil a full restart, which in containers meant replacing the pod. The
existing logger now re-runs its setup on reload, so new handlers, formats
and levels take effect while the process identity and its listeners are
preserved, and re-running the setup no longer stacks duplicate syslog
handlers. An invalid log configuration on reload is not fatal either: the
error is reported on stderr, the previous working configuration is restored
and the master keeps running with it
(#3353).
Truncated chunked bodies accepted: RFC 9112 section 7.1.2 ends a chunked
body with
0 CRLF CRLF, the second CRLF being the mandatory empty trailersection.
ChunkedReader.parse_chunk_size()swallowed theNoMoreDataraisedwhile scanning for it, so a body cut short right after the last chunk line was
treated as complete instead of rejected. It now raises
ChunkMissingTerminator(#3382,
#3685).
--spewcrashed on dynamically generated code: the trace hook indexed the2-tuple returned by
inspect.getsourcelines()by line number rather thanindexing the list of lines, so a frame with no
__file__raisedAttributeError: 'int' object has no attribute 'rstrip'on line 1 andIndexErrorbeyond it. The tuple is now unpacked and offset by the source'sstarting line (#3344,
#3495).
Duplicate
HostandContent-Typeheaders accepted: RFC 9110 section 5.3allows only one of each, and a repeat cannot be merged into a list, so the
message means different things to gunicorn and to anything downstream. Both
are now rejected with
InvalidHeader. The check lives in the policy hookshared by both parsers, so the pure-Python and fast parsers agree. Duplicate
Content-Lengthwas already rejected and is unchanged(#3366,
#3548).
Non-worker children reported as failed workers:
reap_workers()reapsevery child through
waitpid(-1), including processes the kernel reparentedonto gunicorn when it runs as PID 1 in a container, but it logged the exit
status before checking whether the pid was ever a worker. An unrelated process
produced
Worker (pid:N) exited with code Mand triggered alerts. Moreseriously, such a process exiting with code 3 or 4 raised
HaltServerand shutthe server down. Ownership is now established first: the dirty arbiter is
reported as itself, unknown children are reaped silently at debug level, and
only real workers can halt the server
(#3220,
#3566).
Dirty arbiter exits were invisible on SIGCHLD:
handle_chld()calledreap_workers()first, whosewaitpid(-1)claimed the dirty arbiter beforereap_dirty_arbiter()could identify it, so the latter always hitECHILDandits reporting never ran. The dirty arbiter is now reaped first, and
reap_workers()recognises it if it exits mid-loop.Dirty arbiter returned stale responses after a worker timeout: when a
request reached
dirty_timeoutthe arbiter answered the client with a timeouterror but kept the worker connection open. The worker's late response was then
the first message waiting on that socket, so the next request routed to the
same worker received the previous request's result, and every request after it
stayed one response behind. The connection is now closed on timeout, so the
late answer is discarded with it
(#3626).
ASGI connection count leaked on server-initiated close:
nr_connswasonly decremented in
connection_lost(), behind a guard keyed on the sameflag
_close_transport()sets first. Every close the server started (aConnection: closeresponse, a keepalive timeout, an error abort) leaked onecount, so
ASGIWorker._shutdown()ran the fullgraceful_timeoutand warnedabout connections that were already gone. The guard now uses its own flag, so
the decrement and the rest of the cleanup run exactly once whichever side
closes first (#3661).
Inotify reloader on cwd-relative extra files:
reload_extra_filesentrieswith no directory part (for example
.env) produced an empty dirname, andwatching it raised
InotifyErrorwithENOENT. The current directory is nowwatched as
.(#3377,#3667).
StatsD zero-valued metrics: gauges, counters, histograms and timers
reporting
0were silently dropped because the value was tested fortruthiness. Only
Noneis skipped now(#3676).
Spurious no-body warning from
sendfile(): a HEAD, 204 or 304 responseserved through
sendfile()warned about dropped body bytes even when thefile was empty and nothing was dropped. It now warns only when there are
bytes to drop, matching
write()(#3684).
Bare
exceptin the gevent websocket example: narrowed toexcept Exception(#3683).ASGI
receive()cancellation: Letasyncio.CancelledErrorpropagatefrom
BodyReceiverinstead of swallowing it and returninghttp.disconnect. Frameworks that cancel their disconnect listener afterthe response completes (Django) no longer see the cancel masked, so
request_finishedfires andclose_old_connections()runs. Fixes idledatabase connections leaking since 25.1.0
(#3627,
#3654).
Control socket leak on SIGHUP reload: The control thread is now marked
ready once its loop and server are live, and the stop paths wait on that
readiness before scheduling shutdown. Reloads no longer leak one thread and
its selector fd plus unix socket per worker, which eventually raised
"too many open files"
(#3648).
WSGI body framing on HEAD/1xx/204/304: Mirror the ASGI strip-and-warn
behavior on the WSGI path.
Content-Lengthis stripped on 1xx/204 perRFC 9110 section 6.4.2, body bytes are dropped for no-body responses in
both
write()andsendfile(), and a single warning is logged per request(#3413).
Refactoring
termination message in
Arbiter.reap_workers()(#3678).
Changes
packagingis no longer a runtime dependency: it was only ever imported bythe gevent worker, to compare gevent's version. It moved to the
geventandtestingextras, so a plainpip install gunicornpulls in nothing(#3643).
Fast HTTP Parser: Require
gunicorn_h1c >= 0.6.6, which rejects duplicateHostandContent-Typeheaders in the C parser itself. Gunicorn alreadyrefuses them on both the WSGI and ASGI paths, so this changes nothing that is
reachable; it moves the rejection to where the bytes are read and lets the
ASGI corpus exercise those cases against the fast parser directly.
Full changelog: https://gunicorn.org/2026-news/
v26.0.0Compare Source
Breaking Changes
eventletworker class has been dropped. Migrate togevent,gthread, ortornado.New Features
Security
authority-formrequest-target outsideCONNECTasterisk-formrequest-target outsideOPTIONSrelative-referencerequest-targetsContent-Lengthlist form (RFC 9112 section 6.3)finish_bodybyte cap_body_receiveralive across the keepalive smuggling gate so pipelined requests cannot re-enter a closed bodyproxy_allow_ipsand tighten v1/v2 parsing in the ASGI callback parser.Bug Fixes
Content-Lengthon HEAD and 304 responses (#3621)_handle_stream_endedto set_body_completein the async HTTP/2 handler so request bodies finalize correctly on stream endInvalidChunkExtensionmapping and fast-parser support in ASGI tests (#3565)Transfer-Encoding: chunkedto 100-Continue interim responses.textkey isNoneearly_hintscallback to matchprocess_headers; pass only the header name toInvalidHeader(#3588).accept())Transfer-Encodingheader for BlackSheep streamingRefactoring
BodyReceiver._closedinto separate transport and body-wait flags for clearer keepalive/EOF semantics.Changes
gunicorn_h1c >= 0.6.5. Drop the lastpython_onlytest markers; the C extension is now used wherever available (CPython only; PyPy continues to use the Python parser).h2anduvloopto thetestingextra; removeeventlet.docker/setup-qemu-action,docker/setup-buildx-action,docker/login-action,docker/build-push-action, anddocker/metadata-actionto current major versions.Full changelog: benoitc/gunicorn@25.3.0...26.0.0
v25.3.0: Gunicorn 25.3.0Compare Source
Bug Fixes
HTTP/2 ASGI Body Duplication: Fix request body being received twice in HTTP/2
ASGI requests, causing JSON parsing errors with "Extra data" messages
(#3558)
ASGI Chunked EOF Handling: Add
finish()method to callback parser to handlechunked encoding edge case where connection closes before final CRLF after zero-chunk
HTTP/2 Documentation: Fix
http_protocolsexamples to use comma-separated stringinstead of list syntax (#3561)
Chunked Encoding: Reject chunk extensions containing bare CR bytes per RFC 9112
(#3556)
Request Line Limit: Fix
--limit-request-line 0to mean unlimited as documented,instead of using default maximum. Works with both Python and fast C parser.
(#3563)
Security
Changes
Fast HTTP Parser: Update to gunicorn_h1c >= 0.6.3 for
asgi_headerspropertyand
InvalidChunkExtensionvalidation for bare CR rejectionASGI PROXY Protocol: Add PROXY protocol v1/v2 support to callback parser
Docker Images: Update to Python 3.14
v25.2.0: Gunicorn 25.2.0Compare Source
New Features
http_parser='fast'automode if version not metBug Fixes
uWSGI Async Workers: Fix
InvalidUWSGIHeader: incomplete headererror when using gevent or gthread workers with uwsgi protocol behind nginx. (#3552, PR #3554)FileWrapper Iterator Protocol: Add
__iter__and__next__methods toFileWrapperfor full PEP 3333 compliance. (#3396, PR #3550)Performance
bytearraybuffer operationsbytearray.find()directly instead of converting to bytes firstlist.pop(0)(O(1) vs O(n))v25.1.0: Gunicorn 25.1.0Compare Source
New Features
Control Interface (gunicornc): Add interactive control interface for managing
running Gunicorn instances, similar to birdc for BIRD routing daemon
(PR #3505)
show all/workers/dirty/config/stats/listenersworker add/remove/kill,dirty add/removereload,reopen,shutdown--control-socket,--control-socket-mode,--no-control-socketgunicorncfor connecting to control socketDirty Stash: Add global shared state between workers via
dirty.stash(PR #3503)
Dirty Binary Protocol: Implement efficient binary protocol for dirty arbiter IPC
using TLV (Type-Length-Value) encoding
(PR #3500)
Dirty TTIN/TTOU Signals: Add dynamic worker scaling for dirty arbiters
(PR #3504)
Changes
Documentation
v25.0.3Compare Source
What's Changed
Bug Fixes
Documentation
Full Changelog: benoitc/gunicorn@25.0.2...25.0.3
v25.0.2Compare Source
What's Changed
Bug Fixes
Other
Full Changelog: benoitc/gunicorn@25.0.1...25.0.2
v25.0.1Compare Source
Bug Fixes
HTTP/1.1 responses without Content-Length header. Without chunked encoding,
clients wait for connection close to determine end-of-response.
Changes
uvloop for async task execution
Testing
WebSocket, streaming, lifespan, framework integration (Starlette, FastAPI),
HTTP/2, and concurrency scenarios
v25.0.0: Gunicorn 25.0.0Compare Source
New Features
Dirty Arbiters: Separate process pool for executing long-running, blocking
operations (AI model loading, heavy computation) without blocking HTTP workers
(PR #3460)
--dirty-app,--dirty-workers,--dirty-timeout,--dirty-threads,--dirty-graceful-timeouton_dirty_starting,dirty_post_fork,dirty_worker_init,dirty_worker_exitPer-App Worker Allocation for Dirty Arbiters: Control how many dirty workers
load each app for memory optimization with heavy models
(PR #3473)
workersclass attribute on DirtyApp (e.g.,workers = 2)module:class:N(e.g.,myapp:HeavyModel:2)DirtyNoWorkersAvailableErrorfor graceful error handlingworkers=2: 20GB (75% savings)HTTP/2 Support (Beta): Native HTTP/2 (RFC 7540) support for improved performance
with modern clients (PR #3468)
--http-protocols,--http2-max-concurrent-streams,--http2-initial-window-size,--http2-max-frame-size,--http2-max-header-list-sizepip install gunicorn[http2]examples/http2_gevent/with Docker and testsHTTP 103 Early Hints: Support for RFC 8297 Early Hints to enable browsers to
preload resources before the final response
(PR #3468)
environ['wsgi.early_hints'](headers)callbackhttp.response.informationalmessage typeuWSGI Protocol for ASGI Worker: The ASGI worker now supports receiving requests
via the uWSGI binary protocol from nginx
(PR #3467)
Bug Fixes
Fix HTTP/2 ALPN negotiation for gevent and eventlet workers when
do_handshake_on_connectis False (the default). The TLS handshake is nowexplicitly performed before checking
selected_alpn_protocol().Fix setproctitle initialization with systemd socket activation
(#3465)
Fix
Expect: 100-continuehandling: ignore the header for HTTP/1.0 requestssince 100-continue is only valid for HTTP/1.1+
(PR #3463)
Fix missing
_expected_100_continueattribute in UWSGIRequestDisable setproctitle on macOS to prevent segfaults during process title updates
Publish full exception traceback when the application fails to load
(#3462)
Fix ASGI: quick shutdown on SIGINT/SIGQUIT, graceful on SIGTERM
Deprecations
eventletworker is deprecated and will be removed inGunicorn 26.0. Eventlet itself is no longer actively maintained.
Please migrate to
gevent,gthread, or another supported worker type.Changes
(PR #3471)
v24.1.1Compare Source
Bug Fixes
forwarded_allow_ipsandproxy_allow_ipsto remain as strings for backwardcompatibility with external tools like uvicorn. Network validation now uses strict
mode to detect invalid CIDR notation (e.g.,
192.168.1.1/24where host bits are set)(#3458,
PR #3459)
Full Changelog: benoitc/gunicorn@24.1.0...24.1.1
v24.1.0: Gunicorn 24.1.0Compare Source
New Features
Official Docker Image: Gunicorn now publishes official Docker images to GitHub Container Registry (PR #3454)
ghcr.io/benoitc/gunicornPROXY Protocol v2 Support: Extended PROXY protocol implementation to support the binary v2 format in addition to the existing text-based v1 format (PR #3451)
--proxy-protocolmodes:off,v1,v2,autoautomode (default when enabled) detects v1 or v2 automaticallyCIDR Network Support:
--forwarded-allow-ipsand--proxy-allow-fromnow accept CIDR notation (e.g.,192.168.0.0/16) for specifying trusted networks (PR #3449)Socket Backlog Metric: New
gunicorn.socket.backloggauge metric reports the current socket backlog size on Linux systems (PR #3450)InotifyReloader Enhancement: The inotify-based reloader now watches newly imported modules, not just those loaded at startup (PR #3447)
Bug Fixes
finish_body()for faster timeout detection on slow or abandoned connections (PR #3453)SSLWantReadErrorinfinish_body()to prevent worker hangs during SSL renegotiation (PR #3448)unreader.unread()to prepend data to buffer instead of appending (PR #3442)RecursionErrorwhen pickling Config objects (PR #3441)raise fromin glogging.py (PR #3440)Installation
Or use the official Docker image:
v24.0.0Compare Source
New Features
ASGI Worker (Beta): Native asyncio-based ASGI support for running async Python frameworks like FastAPI, Starlette, and Quart without external dependencies
uWSGI Binary Protocol: Support for receiving requests from nginx via
uwsgi_passdirectiveDocumentation Migration: Migrated to MkDocs with Material theme
Security
Install
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Never, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.