diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 56c707a6..308f559c 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -18,9 +18,6 @@ jobs: check: timeout-minutes: 10 runs-on: ubuntu-latest - defaults: - run: - working-directory: ./site steps: - uses: actions/checkout@v4 @@ -33,7 +30,15 @@ jobs: ./site/tmp key: ${{ runner.os }}-${{ hashFiles('./Makefile') }} + - name: lint cjk + run: | + if ! make lint-cjk; then + echo "Please run 'make fix-cjk', edit the detected files and commit changes." + exit 1 + fi + - name: build + working-directory: ./site run: | set -euo pipefail make build diff --git a/Makefile b/Makefile index d1e81131..cbd5b861 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ dev-tools: build-dev-tools: # before running this task, please run `make build-dev-tools-local` and check if the image work locally docker buildx build --platform=linux/amd64,linux/arm64 \ - --network=host --build-arg GOPROXY=${GOPROXY} -t ${DEV_TOOLS_IMAGE} --push -f tools/Dockerfile.dev ./tools + --network=host --build-arg GOPROXY=${GOPROXY} -t ${REAL_DEV_TOOLS_IMAGE} --push -f tools/Dockerfile.dev ./tools .PHONY: build-dev-tools-local build-dev-tools-local: @@ -159,16 +159,35 @@ lint-editorconfig: $(LOCALBIN) test -x $(LOCALBIN)/editorconfig-checker || GOBIN=$(LOCALBIN) go install github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.7.2 $(LOCALBIN)/editorconfig-checker +.PHONY: lint-cjk +lint-cjk: dev-tools + docker run --rm -v $(PWD):/go/src/${PROJECT_NAME} -w /go/src/${PROJECT_NAME} \ + ${DEV_TOOLS_IMAGE} \ + autocorrect --lint ./site/content/zh-hans + +.PHONY: fix-cjk +fix-cjk: dev-tools + docker run --rm -v $(PWD):/go/src/${PROJECT_NAME} -w /go/src/${PROJECT_NAME} \ + ${DEV_TOOLS_IMAGE} \ + autocorrect --fix ./site/content/zh-hans + +# we don't add this to the umbrella `lint` task because it requires the website to be generated first +.PHONY: lint-website +lint-website: $(LOCALBIN) + test -x $(LOCALBIN)/htmltest || GOBIN=$(LOCALBIN) go install github.com/wjdp/htmltest@v0.17.0 + $(LOCALBIN)/htmltest --conf ./.htmltest.yml ./public | grep -E '(target does not exist|Non-OK status: 404)' \ + && exit 1 || true + .PHONY: lint-remain lint-remain: grep '>>>>>>' $(shell git ls-files .) | grep -v 'Makefile:' && exit 1 || true go run tools/cmd/linter/main.go .PHONY: lint -lint: lint-go lint-proto lint-license lint-spell lint-editorconfig lint-remain +lint: lint-go lint-proto lint-license lint-spell lint-editorconfig lint-cjk lint-remain .PHONY: fmt -fmt: fmt-go fmt-proto +fmt: fmt-go fmt-proto fix-spell fix-cjk .PHONY: verify-example verify-example: diff --git a/common.mk b/common.mk index d257c7bf..e7627ba6 100644 --- a/common.mk +++ b/common.mk @@ -31,7 +31,8 @@ BUILD_IMAGE ?= $(DOCKER_MIRROR)docker.io/library/golang:1.21-bullseye # We don't use istio/proxyv2 because it is not designed to be run separately (need to work around permission issue). PROXY_IMAGE ?= $(DOCKER_MIRROR)docker.io/envoyproxy/envoy:contrib-v1.29.5 # We may need to use timestamp if we need to update the image in one PR -DEV_TOOLS_IMAGE ?= $(DOCKER_MIRROR)ghcr.io/mosn/htnn-dev-tools:2024-03-05 +REAL_DEV_TOOLS_IMAGE ?= ghcr.io/mosn/htnn-dev-tools:2024-07-12 +DEV_TOOLS_IMAGE ?= $(DOCKER_MIRROR)$(REAL_DEV_TOOLS_IMAGE) ISTIO_VERSION = 1.21.3 GATEWAY_API_VERSION = 1.0.0 diff --git a/site/Makefile b/site/Makefile index 14bb6ea2..927292f7 100644 --- a/site/Makefile +++ b/site/Makefile @@ -31,9 +31,3 @@ clean: publish: # FIXME: change baseURL to real link docker run --rm -v $(PWD):/src --name docsy htnn-docsy -- hugo --minify --gc --baseURL https://mosn.io/ - -.PHONY: lint-website -lint-website: $(LOCALBIN) - test -x $(LOCALBIN)/htmltest || GOBIN=$(LOCALBIN) go install github.com/wjdp/htmltest@v0.17.0 - $(LOCALBIN)/htmltest --conf ./.htmltest.yml ./public | grep -E '(target does not exist|Non-OK status: 404)' \ - && exit 1 || true diff --git a/site/content/zh-hans/docs/concept/filterpolicy.md b/site/content/zh-hans/docs/concept/filterpolicy.md index ac4a4101..f08ec6df 100644 --- a/site/content/zh-hans/docs/concept/filterpolicy.md +++ b/site/content/zh-hans/docs/concept/filterpolicy.md @@ -199,7 +199,7 @@ status: pet: cat ``` -对于 VirtualService 里的其他路由,“pet” 对应的配置都是 goldfish。只有 “to-httpbin” 这条路由的配置是 cat。 +对于 VirtualService 里的其他路由,“pet”对应的配置都是 goldfish。只有“to-httpbin”这条路由的配置是 cat。 我们也可以在 [LDS](https://www.envoyproxy.io/docs/envoy/latest/configuration/listeners/lds.html) 级别上配置策略。简单来说,你可以理解成端口级别上的配置。要想配置 LDS 级别的策略,需要在启动控制面时设置环境变量 `HTNN_ENABLE_LDS_PLUGIN_VIA_ECDS` 为 true。 diff --git a/site/content/zh-hans/docs/developer-guide/plugin_development.md b/site/content/zh-hans/docs/developer-guide/plugin_development.md index fa585f29..8fea8f53 100644 --- a/site/content/zh-hans/docs/developer-guide/plugin_development.md +++ b/site/content/zh-hans/docs/developer-guide/plugin_development.md @@ -34,7 +34,7 @@ HTNN 的插件分成两种:Go 插件和 Native 插件。Native 插件在运行 ### 插件顺序 我们为每个插件定义了固定顺序。 -顺序由两部分组合而成:顺序组(Order Group) 和 操作(Operation)。插件的顺序首先通过其组进行比较。 +顺序由两部分组合而成:顺序组(Order Group)和 操作(Operation)。插件的顺序首先通过其组进行比较。 然后,同组内插件的顺序由操作决定。 对于操作相同的插件,它们按字母顺序排序。 以下是顺序组(从第一个到最后一个排序): diff --git a/site/content/zh-hans/docs/reference/expr.md b/site/content/zh-hans/docs/reference/expr.md index 88ada299..bbb5a954 100644 --- a/site/content/zh-hans/docs/reference/expr.md +++ b/site/content/zh-hans/docs/reference/expr.md @@ -2,7 +2,7 @@ title: 表达式 --- -HTNN 许多地方使用了 CEL(Common Expression Language) 作为运行时动态执行的表达式。关于 CEL 的语法,请参考[官方文档](https://github.com/google/cel-spec)。为了让 CEL 可以在网络代理的上下文中大显身手,HTNN 提供了一套 CEL 拓展库以供表达式访问相关的信息。本文档将描述该 CEL 拓展库。 +HTNN 许多地方使用了 CEL(Common Expression Language)作为运行时动态执行的表达式。关于 CEL 的语法,请参考[官方文档](https://github.com/google/cel-spec)。为了让 CEL 可以在网络代理的上下文中大显身手,HTNN 提供了一套 CEL 拓展库以供表达式访问相关的信息。本文档将描述该 CEL 拓展库。 ## request diff --git a/site/content/zh-hans/docs/reference/plugins/ext_auth.md b/site/content/zh-hans/docs/reference/plugins/ext_auth.md index f7af466b..feaecd7b 100644 --- a/site/content/zh-hans/docs/reference/plugins/ext_auth.md +++ b/site/content/zh-hans/docs/reference/plugins/ext_auth.md @@ -25,7 +25,7 @@ title: Ext Auth | 名称 | 类型 | 必选 | 校验规则 | 说明 | |---------------------|--------------------------------------------|------|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| -| url | string | 是 | must be valid URI | 外部服务的 uri,如 `http://ext_auth/prefix`。 uri 的路径将作为鉴权请求路径的前缀。 | +| url | string | 是 | must be valid URI | 外部服务的 uri,如 `http://ext_auth/prefix`。uri 的路径将作为鉴权请求路径的前缀。 | | timeout | [Duration](../../type#duration) | 否 | > 0s | 超时时长。例如,`10s` 表示超时时间为 10 秒。默认值为 0.2s。 | | authorizationRequest | AuthorizationRequest | 否 | | | | authorizationResponse | AuthorizationResponse | 否 | | | diff --git a/site/content/zh-hans/docs/reference/plugins/limit_count_redis.md b/site/content/zh-hans/docs/reference/plugins/limit_count_redis.md index 24cfd49e..c5226caa 100644 --- a/site/content/zh-hans/docs/reference/plugins/limit_count_redis.md +++ b/site/content/zh-hans/docs/reference/plugins/limit_count_redis.md @@ -31,7 +31,7 @@ title: Limit Count Redis 每个规则的统计是独立的。当任一规则的额度用完后,就会触发限流操作。因限流产生的拒绝的响应中会包含 header `x-envoy-ratelimited: true`。如果配置了 `enableLimitQuotaHeaders` 为 `true` 且访问 Redis 成功,所有响应中都会包括下面三个头: -* `x-ratelimit-limit`:表示当前应用的限流规则。格式为“当前剩余额度最少的规则, (规则额度;w=时间窗口){1个或多个规则}”,例如 `2, 2;w=60`。 +* `x-ratelimit-limit`:表示当前应用的限流规则。格式为“当前剩余额度最少的规则,(规则额度;w=时间窗口){1 个或多个规则}”,例如 `2, 2;w=60`。 * `x-ratelimit-remaining`:表示当前剩余额度最少的规则的剩余额度,最小值为 `0`。 * `x-ratelimit-reset`:表示当前剩余额度最少的规则什么时候重置,单位为秒,例如 `59`。注意由于网络延迟等原因,该值并非绝对精准。 diff --git a/site/content/zh-hans/docs/reference/plugins/local_ratelimit.md b/site/content/zh-hans/docs/reference/plugins/local_ratelimit.md index 0fc5048d..74ebb59f 100644 --- a/site/content/zh-hans/docs/reference/plugins/local_ratelimit.md +++ b/site/content/zh-hans/docs/reference/plugins/local_ratelimit.md @@ -39,7 +39,7 @@ spec: port: 8080 ``` -通过应用下述配置,`http://localhost:10000/` 的请求速率被限制为每秒 1 个请求: +通过应用下述配置,`http://localhost:10000/` 的请求速率被限制为每秒 1 个请求: ```yaml apiVersion: htnn.mosn.io/v1 @@ -69,7 +69,7 @@ spec: denominator: HUNDRED ``` -我们可以进行测试: +我们可以进行测试: ``` $ while true; do curl -I http://localhost:10000/ 2>/dev/null | head -1 ;done diff --git a/site/content/zh-hans/docs/reference/plugins/oidc.md b/site/content/zh-hans/docs/reference/plugins/oidc.md index 6a54a6a3..7db8b04b 100644 --- a/site/content/zh-hans/docs/reference/plugins/oidc.md +++ b/site/content/zh-hans/docs/reference/plugins/oidc.md @@ -19,7 +19,7 @@ title: OIDC |---------------------------|---------------------------------------------|------|-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| | clientId | string | 是 | | 客户端 ID | | clientSecret | string | 是 | | 客户端 secret | -| issuer | string | 是 | must be valid URI | OIDC Provider 的 URI,如 “https://accounts.google.com” | +| issuer | string | 是 | must be valid URI | OIDC Provider 的 URI,如“https://accounts.google.com” | | redirectUrl | string | 是 | must be valid URI | OIDC 认证过程中重定向用户的 URL。该 URL 需要满足两个条件:1. 事先已经在 OIDC Provider 中注册。2. 该 URL 和用户访问的 URL 使用同样的 OIDC 插件配置。 | | scopes | string[] | 否 | | 该参数可以要求 OIDC Provider 返回经过身份验证的用户的更多信息。具体可以参考 https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims 和所用的 Provider 自身的文档。 | | idTokenHeader | string | 否 | | OIDC Provider 返回的 ID Token 将通过该 header 传给上游。默认为 `X-ID-Token`。 | diff --git a/site/content/zh-hans/docs/reference/registries/nacos.md b/site/content/zh-hans/docs/reference/registries/nacos.md index 45e77b0d..9e045dda 100644 --- a/site/content/zh-hans/docs/reference/registries/nacos.md +++ b/site/content/zh-hans/docs/reference/registries/nacos.md @@ -6,7 +6,7 @@ title: Nacos `nacos` registry 对接 [Nacos](https://nacos.io/) 服务发现,将服务信息转换成 `ServiceEntry`。该 registry 支持的是 V1 API,但根据 Nacos OpenAPI 文档,亦可用于对接 Nacos 2.x。 -> Nacos 2.X 版本兼容 Nacos1.X 版本的OpenAPI, 请参考文档Nacos1.X OpenAPI使用。 +> Nacos 2.X 版本兼容 Nacos1.X 版本的 OpenAPI, 请参考文档 Nacos1.X OpenAPI 使用。 > > https://nacos.io/zh-cn/docs/v2/guide/user/open-api.html @@ -25,7 +25,7 @@ Nacos 1.x 没有提供订阅当前服务列表的接口,所以只能通过轮 注意:由于心跳间隔、网络延迟等原因,服务的变化可能需要几十秒之后才会引起 `ServiceEntry` 改变。尤其是因为 https://github.com/nacos-group/nacos-sdk-go/issues/139,服务中最后一个示例的移除不会导致 `ServiceEntry` 改变。另外,为了避免因为轮询失败或 Nacos 暂时不可用导致 `ServiceEntry` 被错误删除,只有在 registry 配置变化时,才会清除生成的 `ServiceEntry`。 -注意:因为 [nacos-sdk-go](https://github.com/nacos-group/nacos-sdk-go/) 会向文件系统写入日志和缓存,而默认情况下 HTNN 的控制面是以只读模式挂载的,所以会导致无法对接 Nacos 。解决方法是在部署 HTNN 时往 `/log` 和 `/cache` 挂载可写的目录。以通过 helm 安装 HTNN 为例,可以通过以下方式挂载可写的目录: +注意:因为 [nacos-sdk-go](https://github.com/nacos-group/nacos-sdk-go/) 会向文件系统写入日志和缓存,而默认情况下 HTNN 的控制面是以只读模式挂载的,所以会导致无法对接 Nacos。解决方法是在部署 HTNN 时往 `/log` 和 `/cache` 挂载可写的目录。以通过 helm 安装 HTNN 为例,可以通过以下方式挂载可写的目录: ```shell helm install htnn-controller htnn/htnn-controller ... -f custom-values.yaml diff --git a/tools/Dockerfile.dev b/tools/Dockerfile.dev index 015e6931..0cd5240e 100644 --- a/tools/Dockerfile.dev +++ b/tools/Dockerfile.dev @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=$TARGETPLATFORM golang:1.21-bullseye +FROM --platform=$TARGETPLATFORM m.daocloud.io/docker.io/library/golang:1.21-bullseye # If this image is changed, tell @spacewander to push it. # TODO: Maybe we can push this image automatically by tag? @@ -68,3 +68,11 @@ RUN VER=24.4 && \ # clang-format RUN pip install clang-format==17.0.6 + +# autocorrect +RUN VER=2.11.1 && \ + ARCH=$(dpkg --print-architecture) && \ + wget --progress=dot:giga https://github.com/huacnlee/autocorrect/releases/download/v${VER}/autocorrect-linux-${ARCH}.tar.gz -O autocorrect.tar.gz && \ + tar -zxvpf autocorrect.tar.gz && \ + mv autocorrect /usr/bin && \ + autocorrect --version