This is an automated email from the ASF dual-hosted git repository.
shreemaan-abhishek pushed a commit to branch release/3.18
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/release/3.18 by this push:
new f140bd161d chore: release 3.18.0
f140bd161d is described below
commit f140bd161d882c0c408a65ae9175ce83abd91426
Author: Abhishek Choudhary <[email protected]>
AuthorDate: Tue Aug 18 13:59:25 2026 +0545
chore: release 3.18.0
Signed-off-by: Abhishek Choudhary <[email protected]>
---
CHANGELOG.md | 178 +++++++++++++++++++++++++++++++++++++++++++++
apisix/core/version.lua | 2 +-
ci/check_changelog_prs.ts | 5 ++
docs/en/latest/config.json | 2 +-
docs/zh/latest/config.json | 2 +-
5 files changed, 186 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1e0e1e60ce..d22a41b66a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,7 @@ title: Changelog
## Table of Contents
+- [3.18.0](#3180)
- [3.17.0](#3170)
- [3.16.0](#3160)
- [3.15.0](#3150)
@@ -85,6 +86,183 @@ title: Changelog
- [0.7.0](#070)
- [0.6.0](#060)
+## 3.18.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: change(debug): report executed plugins with phase in execution
order. The `Apisix-Plugins` debug header now carries `name#phase` entries in
execution order instead of a de-duplicated plugin-name list
[#13710](https://github.com/apache/apisix/pull/13710)
+- :warning: feat: bound request and response body buffering in plugins.
`max_req_body_size` / `max_resp_body_size` (default 64 MiB) added to ~19
plugins; larger bodies are now rejected or truncated instead of being buffered
without limit [#13705](https://github.com/apache/apisix/pull/13705)
+- :warning: fix(batch-processor): bound the pending entries backlog by
default. Every batch-processor logger now defaults `max_pending_entries` to
8192 and discards entries above it
[#13826](https://github.com/apache/apisix/pull/13826)
+- :warning: refactor(ai-aws-content-moderation): moderate decoded LLM content
in the access phase. Priority moved from 1050 to 1031, the plugin now requires
ai-proxy/ai-proxy-multi, moderates the extracted prompt instead of the raw
body, and denies with `deny_code` (default 200) instead of 400
[#13647](https://github.com/apache/apisix/pull/13647)
+- :warning: feat(ai-aliyun-content-moderation): role-aware
`request_check_mode` and O(n) content chunking. Request moderation now covers
the user role of the latest turn by default instead of every message in the
body [#13598](https://github.com/apache/apisix/pull/13598)
+- :warning: fix(sls-logger): verify the TLS certificate of the log server. New
`ssl_verify` option, default `true`
[#13785](https://github.com/apache/apisix/pull/13785)
+- :warning: fix(openid-connect): enforce audience, issuer and required scopes.
Bearer introspection fails closed when the discovery document is unavailable,
`claim_validator.audience.match_with_client_id` now implies `required`, and
`required_scopes` is enforced on session (authorization code) flows
[#13829](https://github.com/apache/apisix/pull/13829)
+- :warning: fix(admin): reject duplicate consumer authentication keys instead
of silently accepting them [#13529](https://github.com/apache/apisix/pull/13529)
+- :warning: perf(core): sanitize the `X-Forwarded-*` headers in the NGINX
config. The `$var_x_forwarded_proto/host/port` variables are gone, and a
trusted peer that sends no `X-Forwarded-Host`/`X-Forwarded-Port` now receives
the APISIX-observed values instead of falling through to `$host`/`$server_port`
[#13803](https://github.com/apache/apisix/pull/13803)
+
+### Core
+
+- feat: raise default sizes for non-evictable shared dicts:
`prometheus-metrics` 15m/10m→128m, `nacos` 10m→64m, consul and kubernetes
discovery `shared_size` 1m→64m, `tracing_buffer` 10m→32m
[#13688](https://github.com/apache/apisix/pull/13688)
+- chore(core): remove the dead `clean_handlers` mechanism.
`core.config_util.add_clean_handler`, `cancel_clean_handler` and
`fire_all_clean_handlers` no longer exist
[#13761](https://github.com/apache/apisix/pull/13761)
+- feat(ai-proxy): send LLM requests through `ngx_http_ffi_client`. New
`plugin_attr.ai-proxy.http_client`, defaulting to the FFI client, which
requires an APISIX-Runtime that ships `ngx_http_ffi_client` (set
`lua-resty-http` to opt out)
[#13778](https://github.com/apache/apisix/pull/13778)
+- feat: support per-port PROXY protocol for stream TCP proxy
[#13561](https://github.com/apache/apisix/pull/13561)
+- feat(stream): support `set_real_ip_from` to trust an inbound PROXY protocol
header [#13700](https://github.com/apache/apisix/pull/13700)
+- feat(stream): support upstream client certificate (mTLS) in the L4 proxy
[#13596](https://github.com/apache/apisix/pull/13596)
+- feat(router): add `match_uri_encoded_slash` to keep `%2F` in path parameters
[#13626](https://github.com/apache/apisix/pull/13626)
+- feat: add `max_post_args_readable_size` to bound `post_arg.*` body reads
[#13601](https://github.com/apache/apisix/pull/13601)
+- feat: support `http_method` and `http_req_body` in active health checks
[#13726](https://github.com/apache/apisix/pull/13726)
+- feat(data_encryption): support AES-256 keys in the encryption keyring
[#13756](https://github.com/apache/apisix/pull/13756)
+- refactor: decouple generic data encryption from `ssl.lua`
[#13564](https://github.com/apache/apisix/pull/13564)
+- perf(plugin): reuse the filtered global-rule plugin set across phases
[#13779](https://github.com/apache/apisix/pull/13779)
+- fix: keep the chash ring stable during health changes
[#13532](https://github.com/apache/apisix/pull/13532)
+- fix(balancer): keep least_conn load state across upstream scaling
[#13666](https://github.com/apache/apisix/pull/13666)
+- fix(balancer): separate the keepalive pool by referenced client cert
[#13587](https://github.com/apache/apisix/pull/13587)
+- fix(healthcheck): reuse the checker on node-only upstream changes instead of
destroy-and-rebuild [#13629](https://github.com/apache/apisix/pull/13629)
+- fix(healthcheck): probe domain nodes by the node domain, not the resolved IP
[#13743](https://github.com/apache/apisix/pull/13743)
+- fix(healthcheck): purge stale targets and release the periodic lock
[#13627](https://github.com/apache/apisix/pull/13627)
+- fix(healthcheck): guard `construct_upstream` in healthcheck timers
[#13592](https://github.com/apache/apisix/pull/13592)
+- fix(stream): initialize env and secret for TLS cert resolution
[#12935](https://github.com/apache/apisix/pull/12935)
+- fix: fetch secrets from the upstream ssl config
[#13062](https://github.com/apache/apisix/pull/13062)
+- fix: invalidate the secret LRU cache on `/secrets` changes
[#13668](https://github.com/apache/apisix/pull/13668)
+- fix(secret): log an error when a secret reference cannot be resolved
[#13737](https://github.com/apache/apisix/pull/13737)
+- fix: reject consumer auth when a secret reference fails to resolve
[#13667](https://github.com/apache/apisix/pull/13667)
+- fix: encode control characters in `$upstream_uri` to prevent CRLF injection
[#13787](https://github.com/apache/apisix/pull/13787)
+- fix: reset `X-Forwarded-For` only for untrusted sources under
`trusted_addresses` [#13611](https://github.com/apache/apisix/pull/13611)
+- fix: normalize the case of hosts carried on a service
[#13781](https://github.com/apache/apisix/pull/13781)
+- fix(plugin): preserve plugin-conf state across the consumer route merge
[#13757](https://github.com/apache/apisix/pull/13757)
+- fix(resource): support all plugin-bearing resource types in
`fetch_latest_conf` [#13663](https://github.com/apache/apisix/pull/13663)
+- fix(config_etcd): keep the previous value when a full reload gets invalid
data [#13717](https://github.com/apache/apisix/pull/13717)
+- fix(etcd): do not advance the watch revision on a timeout, and make the
recovery reload cheap [#13721](https://github.com/apache/apisix/pull/13721)
+- fix(json): make cjson instances inherit APISIX's cjson options
[#13680](https://github.com/apache/apisix/pull/13680)
+- fix(env): resolve the `os.getenv` prefix collision for `env` directives
[#13595](https://github.com/apache/apisix/pull/13595)
+- fix(cli): remove the stale key after resolving an env var in config keys
[#12885](https://github.com/apache/apisix/pull/12885)
+- fix(cli): quote `nginx_config.envs` entries so values with spaces work
[#13713](https://github.com/apache/apisix/pull/13713)
+- fix(admin): harden stream_route `superior_id` dependency checks
[#13672](https://github.com/apache/apisix/pull/13672)
+- fix(admin): encrypt only after successful validation
[#13729](https://github.com/apache/apisix/pull/13729)
+- fix(admin): encrypt the inline upstream client key of a stream route
[#13833](https://github.com/apache/apisix/pull/13833)
+- fix(admin): reconcile the plugins reload instead of trusting the broadcast
[#13714](https://github.com/apache/apisix/pull/13714)
+- fix(control): reconcile `/v1/plugins/reload` like the admin reload path
[#13745](https://github.com/apache/apisix/pull/13745)
+- fix(log-sanitize): return raw tables to avoid double `delay_encode`
[#13605](https://github.com/apache/apisix/pull/13605)
+- fix(dns): correct the `error()` call in dns client initialization
[#13358](https://github.com/apache/apisix/pull/13358)
+- fix: avoid 503 error after dns service temporary fail
[#13137](https://github.com/apache/apisix/pull/13137)
+- fix(cli): add IPv6 listen support for the PROXY protocol
[#12859](https://github.com/apache/apisix/pull/12859)
+- fix(upstream): use `cert` and `key` instead of stale `ok` in mTLS error
checks [#13442](https://github.com/apache/apisix/pull/13442)
+- fix(core.request): `set_header` must update the cached headers with a
normalized key [#13517](https://github.com/apache/apisix/pull/13517)
+- fix(admin): `encrypt_fields` get double-encrypted on every PATCH
[#13525](https://github.com/apache/apisix/pull/13525)
+- fix(plugin): ignore `plugin_metadata` of disabled or unknown plugins
[#13514](https://github.com/apache/apisix/pull/13514)
+- fix(xrpc): stream routes with xRPC protocols fail `check_schema` in HTTP
workers when the Admin API is disabled
[#13515](https://github.com/apache/apisix/pull/13515)
+- fix(secret): aws secret manager fails when the secret name contains a slash
[#13519](https://github.com/apache/apisix/pull/13519)
+- fix(consul): one invalid node should not discard the remaining nodes of the
service [#13513](https://github.com/apache/apisix/pull/13513)
+- fix(nacos): declare the `nacos-stream` shared dict in the stream subsystem
[#13541](https://github.com/apache/apisix/pull/13541)
+- fix: redis connections with different database/credentials must not share a
keepalive pool [#13516](https://github.com/apache/apisix/pull/13516)
+
+### Plugins
+
+- feat: add ai-cache plugin
[#13578](https://github.com/apache/apisix/pull/13578)
+- feat(ai-cache): add the semantic (L2) cache layer
[#13632](https://github.com/apache/apisix/pull/13632)
+- feat(ai-cache): add streaming support with format tagging
[#13644](https://github.com/apache/apisix/pull/13644)
+- feat: add ai-lakera-guard plugin
[#13570](https://github.com/apache/apisix/pull/13570)
+- feat(ai-lakera-guard): scan LLM responses (direction output/both,
non-streaming and streaming)
[#13606](https://github.com/apache/apisix/pull/13606)
+- feat: add ldap-auth-advanced plugin
[#13762](https://github.com/apache/apisix/pull/13762)
+- feat(ai-proxy-multi): add the semantic load-balancing algorithm
[#13676](https://github.com/apache/apisix/pull/13676)
+- feat(ai-proxy): include AI observability vars in `llm_summary`
[#13609](https://github.com/apache/apisix/pull/13609)
+- feat(ai-rate-limiting): support the redis policy for shared counters
[#13670](https://github.com/apache/apisix/pull/13670)
+- feat(ai-aws-content-moderation): moderate LLM responses, including streams
[#13735](https://github.com/apache/apisix/pull/13735)
+- feat(ai-aws-content-moderation): add `request_check_roles` and
`request_check_mode` [#13773](https://github.com/apache/apisix/pull/13773)
+- feat(ai-aliyun-content-moderation): moderate system and tool role content
[#13646](https://github.com/apache/apisix/pull/13646)
+- feat(prometheus): add metrics for AI cache hits, misses, bypasses, and
embedding latency [#13659](https://github.com/apache/apisix/pull/13659)
+- feat(prometheus): stream active connections, termination status and
bandwidth [#13796](https://github.com/apache/apisix/pull/13796)
+- feat: add `log_format_extra` to enrich the default logger format
[#13568](https://github.com/apache/apisix/pull/13568)
+- feat(kafka-logger): add TLS support for Kafka brokers
[#13607](https://github.com/apache/apisix/pull/13607)
+- feat(elasticsearch-logger): encrypt the `headers` field at rest
[#13612](https://github.com/apache/apisix/pull/13612)
+- feat: encrypt `redis_password` and `sentinel_password` in limit-count,
limit-req and limit-conn [#13624](https://github.com/apache/apisix/pull/13624)
+- feat(proxy-rewrite): support multiple same-name headers in
`headers.add`/`headers.set`
[#13597](https://github.com/apache/apisix/pull/13597)
+- feat(openid-connect): add the `set_raw_id_token_header` option
[#13616](https://github.com/apache/apisix/pull/13616)
+- feat(openid-connect): support PAR and DPoP client options
[#13649](https://github.com/apache/apisix/pull/13649)
+- feat(ldap-auth): add `hide_credentials`
[#13832](https://github.com/apache/apisix/pull/13832)
+- refactor(ai-providers): make the LLM request client ctx-free
[#13699](https://github.com/apache/apisix/pull/13699)
+- refactor(cas-auth): drop the unnecessary raw Cookie header fallback
[#13635](https://github.com/apache/apisix/pull/13635)
+- perf(zipkin): skip span tag construction for unsampled requests
[#13656](https://github.com/apache/apisix/pull/13656)
+- perf(datadog): reuse one UDP socket per batch and coalesce metrics
[#13653](https://github.com/apache/apisix/pull/13653)
+- perf(loggly): hoist the per-request closure out of the log phase
[#13648](https://github.com/apache/apisix/pull/13648)
+- fix(ai-proxy): preserve the upstream 429/5xx error response body
[#13565](https://github.com/apache/apisix/pull/13565)
+- fix(ai-proxy): drop `tool_choice` without tools and stop hanging the
Anthropic stream [#13583](https://github.com/apache/apisix/pull/13583)
+- fix(ai-proxy): do not abort the Anthropic response on bad `tool_call`
arguments [#13599](https://github.com/apache/apisix/pull/13599)
+- fix(ai-proxy): correct the Anthropic Messages to OpenAI Chat request
conversion [#13674](https://github.com/apache/apisix/pull/13674)
+- fix(ai-proxy): report error-path latency vars in milliseconds
[#13711](https://github.com/apache/apisix/pull/13711)
+- fix(ai-proxy-multi): keep the client request body intact across fallback
retries [#13793](https://github.com/apache/apisix/pull/13793)
+- fix(ai-protocols): flatten structured message content in the protocol layer
[#13634](https://github.com/apache/apisix/pull/13634)
+- fix(ai-cache): preserve non-text content in the exact key and bypass L2
[#13654](https://github.com/apache/apisix/pull/13654)
+- fix(ai-lakera-guard): update alert mode behavior with the `fail_open` option
[#13622](https://github.com/apache/apisix/pull/13622)
+- fix(ai-content-moderation): validate that `deny_code` is a valid HTTP status
[#13692](https://github.com/apache/apisix/pull/13692)
+- fix(ai-content-moderation): stop re-counting converted chunks in realtime
batches [#13765](https://github.com/apache/apisix/pull/13765)
+- fix(ai-content-moderation): moderate the OpenAI `developer` role
[#13780](https://github.com/apache/apisix/pull/13780)
+- fix(ai-aws-content-moderation): respect Comprehend's segment limits and
reuse the client [#13767](https://github.com/apache/apisix/pull/13767)
+- fix(ai-aliyun-content-moderation): return nil instead of `ngx.OK` in
`lua_body_filter` [#13623](https://github.com/apache/apisix/pull/13623)
+- fix(limit-count): make the sliding-window limiter check-and-increment atomic
[#13574](https://github.com/apache/apisix/pull/13574)
+- fix(limit-count): `commit()` must report the window-weighted remaining
[#13704](https://github.com/apache/apisix/pull/13704)
+- fix(limit-count): validate variable-resolved `count`/`time_window` bounds
[#13573](https://github.com/apache/apisix/pull/13573)
+- fix(limit-count): upgrade the redis-cluster library so NOSCRIPT is not
treated as a node failure [#13579](https://github.com/apache/apisix/pull/13579)
+- fix(limit-conn): isolate the counter per workflow action via the `_vid` key
[#13591](https://github.com/apache/apisix/pull/13591)
+- fix(limit-conn): use the parent resource key for consumer isolation
[#13600](https://github.com/apache/apisix/pull/13600)
+- fix(redis-schema): copy policy schemas instead of mutating shared tables
[#13555](https://github.com/apache/apisix/pull/13555)
+- fix(graphql-limit-count): measure each fragment once when computing query
depth [#13809](https://github.com/apache/apisix/pull/13809)
+- fix(key-auth): propagate the real auth error to the multi-auth orchestrator
[#13693](https://github.com/apache/apisix/pull/13693)
+- fix(basic-auth): validate `anonymous_consumer` against the schema
[#13682](https://github.com/apache/apisix/pull/13682)
+- fix(hmac-auth): pass ctx when hiding the Authorization header
[#13820](https://github.com/apache/apisix/pull/13820)
+- fix(ldap-auth): key the consumer lookup on the escaped bind DN
[#13805](https://github.com/apache/apisix/pull/13805)
+- fix(jwe-decrypt): skip decrypt when the token is missing and `strict` is
false [#13822](https://github.com/apache/apisix/pull/13822)
+- fix(cas-auth): stop the SLO callback POST from being proxied upstream
[#13610](https://github.com/apache/apisix/pull/13610)
+- fix(openid-connect): redirect instead of 500 on a stale authorization
callback [#13712](https://github.com/apache/apisix/pull/13712)
+- fix(openid-connect): handle `temporarily_unavailable` error redirects from
the ID provider [#13825](https://github.com/apache/apisix/pull/13825)
+- fix(wolf-rbac): clear upstream identity headers when the auth response omits
`userInfo` [#13696](https://github.com/apache/apisix/pull/13696)
+- fix(attach-consumer-label): always drop client-supplied configured headers
[#13590](https://github.com/apache/apisix/pull/13590)
+- fix(forward-auth): re-frame the buffered POST body for the auth request
[#13642](https://github.com/apache/apisix/pull/13642)
+- fix(loki-logger): resolve log labels per request to avoid label leakage
[#13562](https://github.com/apache/apisix/pull/13562)
+- fix(loki-logger): encrypt the `headers` field
[#13784](https://github.com/apache/apisix/pull/13784)
+- fix(error-log-logger): do not log the kafka sasl password
[#13786](https://github.com/apache/apisix/pull/13786)
+- fix(datadog): cap the coalesced DogStatsD datagram size, fall back to
per-metric sends [#13665](https://github.com/apache/apisix/pull/13665)
+- fix(prometheus): truncate llm model-name labels to bound cardinality
[#13637](https://github.com/apache/apisix/pull/13637)
+- fix(prometheus): bump nginx-lua-prometheus-api7 to 0.20260623 to drop
duplicate metrics [#13602](https://github.com/apache/apisix/pull/13602)
+- fix(prometheus): bump nginx-lua-prometheus-api7 to 0.20260716
[#13708](https://github.com/apache/apisix/pull/13708)
+- fix(prometheus): bump nginx-lua-prometheus-api7 to 1.0.0
[#13754](https://github.com/apache/apisix/pull/13754)
+- fix(opentelemetry): recreate the tracer object after the plugin metadata
changed [#13618](https://github.com/apache/apisix/pull/13618)
+- fix(opentelemetry): give `inject_core_spans` its own tracer cache key
[#13633](https://github.com/apache/apisix/pull/13633)
+- fix(opentelemetry): validate `x-request-id` before using it as `trace_id`
[#12990](https://github.com/apache/apisix/pull/12990)
+- fix(opentelemetry): use `oneOf` for the metadata `additionalProperties`
value type [#13690](https://github.com/apache/apisix/pull/13690)
+- fix(log-rotate): reopen logs after partial rotation
[#13375](https://github.com/apache/apisix/pull/13375)
+- fix(workflow): skip the action plugin in the chain to avoid double execution
[#13617](https://github.com/apache/apisix/pull/13617)
+- fix(proxy-rewrite): query string discarded when
`use_real_request_uri_unsafe` is set
[#12843](https://github.com/apache/apisix/pull/12843)
+- fix(proxy-cache): keep Vary variant keys out of reach of a crafted request
[#13831](https://github.com/apache/apisix/pull/13831)
+- fix(grpc-transcode): encode empty repeated fields as JSON arrays
[#13678](https://github.com/apache/apisix/pull/13678)
+- fix(request-validation): guard a non-string Content-Type before `lower()`
[#13691](https://github.com/apache/apisix/pull/13691)
+- fix(data-mask): compact the JSON array when removing an element
[#13818](https://github.com/apache/apisix/pull/13818)
+- fix: reframe the request body forwarded upstream in serverless plugins
[#13798](https://github.com/apache/apisix/pull/13798)
+- feat(limit-count): add Redis Sentinel backend, sliding window and delayed
sync support [#13443](https://github.com/apache/apisix/pull/13443)
+- feat(prometheus): support disabling labels via plugin metadata to reduce
cardinality [#13202](https://github.com/apache/apisix/pull/13202)
+- feat(prometheus): add built-in LLM histograms for TTFT and token
distribution [#13487](https://github.com/apache/apisix/pull/13487)
+- feat(ai-proxy): add built-in nginx variables for LLM observability
[#13477](https://github.com/apache/apisix/pull/13477)
+- feat(ai-plugins): add `fail_mode` for Consumer-bound protocol handling
[#13489](https://github.com/apache/apisix/pull/13489)
+- fix(kafka-logger): support `api_version` so brokers can store message
timestamps [#13521](https://github.com/apache/apisix/pull/13521)
+- fix(ai-proxy-multi): refresh the cached server picker once health checkers
are created [#13505](https://github.com/apache/apisix/pull/13505)
+- fix(ai-proxy-multi): keep the existing query string in the health check path
[#13506](https://github.com/apache/apisix/pull/13506)
+- fix(ai-proxy): forward the client method and query string for passthrough
[#13546](https://github.com/apache/apisix/pull/13546)
+- fix(authz-casdoor): expire the session when the Casdoor token expires
[#13500](https://github.com/apache/apisix/pull/13500)
+- fix(request-id): generate nanoid with a CSPRNG to avoid duplicate and
malformed ids [#13508](https://github.com/apache/apisix/pull/13508)
+- fix(jwt-auth): reject a malformed JWT signature instead of erroring
[#13518](https://github.com/apache/apisix/pull/13518)
+- fix(workflow): tolerate a missing `_workflow_cache` in the log phase
[#13512](https://github.com/apache/apisix/pull/13512)
+- fix(body-transformer): rebuild the table in `remove_namespace` instead of
mutating during traversal [#13522](https://github.com/apache/apisix/pull/13522)
+- fix(aws-lambda): build the SigV4 canonical query string per spec
[#13520](https://github.com/apache/apisix/pull/13520)
+- fix(graphql-proxy-cache): clear all Vary variants on PURGE
[#13523](https://github.com/apache/apisix/pull/13523)
+- fix(limit-count): isolate redis-sentinel keepalive pools by database and
credentials [#13553](https://github.com/apache/apisix/pull/13553)
+- fix(brotli): do not log an expected non-standard ETag at error level
[#13545](https://github.com/apache/apisix/pull/13545)
+- fix(elasticsearch-logger): guard `os.date` against an invalid index template
[#13542](https://github.com/apache/apisix/pull/13542)
+- fix(acl): correctly evaluate multi-match JSONPath labels
[#13527](https://github.com/apache/apisix/pull/13527)
+- fix: remove credential-leaking debug logs in logger plugins
[#13502](https://github.com/apache/apisix/pull/13502)
+- fix: use `description` instead of `title` for field-level schema doc strings
[#13547](https://github.com/apache/apisix/pull/13547)
+
## 3.17.0
**The changes marked with :warning: are not backward compatible.**
diff --git a/apisix/core/version.lua b/apisix/core/version.lua
index 326e22e8ba..b02e89d44c 100644
--- a/apisix/core/version.lua
+++ b/apisix/core/version.lua
@@ -20,5 +20,5 @@
-- @module core.version
return {
- VERSION = "3.17.0"
+ VERSION = "3.18.0"
}
diff --git a/ci/check_changelog_prs.ts b/ci/check_changelog_prs.ts
index 50dd25d1f9..b69b20d73d 100755
--- a/ci/check_changelog_prs.ts
+++ b/ci/check_changelog_prs.ts
@@ -64,6 +64,11 @@ const IGNORE_PRS = [
// docs/chore/test/ci type filter but which do not belong in a user
changelog.
13386, 13407, 13449, 13485,
13139, 13156, 13157, 13158, 13222, 13234,
+ // 3.18.0
+ // test-only, CI-only and build-only changes whose subject prefix ("fix:",
+ // "fix(ci)", "fix(dev-image)", "build:") dodges the docs/chore/test/ci
type
+ // filter but which do not belong in a user changelog.
+ 13526, 13554, 13679, 13709, 13815, 13824,
];
diff --git a/docs/en/latest/config.json b/docs/en/latest/config.json
index 5fb645afa3..77c08ec0da 100644
--- a/docs/en/latest/config.json
+++ b/docs/en/latest/config.json
@@ -1,5 +1,5 @@
{
- "version": "3.17.0",
+ "version": "3.18.0",
"sidebar": [
{
"type": "category",
diff --git a/docs/zh/latest/config.json b/docs/zh/latest/config.json
index 5f1d682020..bbd0b3ba11 100644
--- a/docs/zh/latest/config.json
+++ b/docs/zh/latest/config.json
@@ -1,5 +1,5 @@
{
- "version": "3.17.0",
+ "version": "3.18.0",
"sidebar": [
{
"type": "category",