This is an automated email from the ASF dual-hosted git repository.

mfordjody pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git


The following commit(s) were added to refs/heads/master by this push:
     new 73994dfe Fix CI startup policy and require quality gate (#964)
73994dfe is described below

commit 73994dfe895a27a76241a454687b76dfbb321a59
Author: mfordjody <[email protected]>
AuthorDate: Mon Jul 20 01:31:35 2026 +0800

    Fix CI startup policy and require quality gate (#964)
    
    * Fix CI startup policy and require quality gate
    
    * Fix blocking lint and license checks
---
 .asf.yaml                                          | 11 ++--
 .github/workflows/ci.yml                           | 60 ++++++++++++++++----
 .github/workflows/release.yaml                     |  4 +-
 .licenserc.yaml                                    |  4 ++
 dubboctl/cmd/admin_test.go                         | 15 +++++
 dubboctl/cmd/dashboard_test.go                     | 15 +++++
 dubboctl/cmd/get_test.go                           | 15 +++++
 dubboctl/cmd/gui.go                                | 15 +++++
 dubboctl/cmd/gui_test.go                           | 15 +++++
 dubboctl/cmd/multicluster.go                       | 15 +++++
 dubboctl/cmd/multicluster_test.go                  | 15 +++++
 dubbod/discovery/cmd/app/grpc_inbound_test.go      | 15 +++++
 dubbod/discovery/cmd/app/grpc_outbound_test.go     | 15 +++++
 .../pkg/bootstrap/gateway_multicluster.go          | 15 +++++
 dubbod/discovery/pkg/bootstrap/gui.go              | 15 +++++
 dubbod/discovery/pkg/bootstrap/gui_test.go         | 15 +++++
 dubbod/discovery/pkg/model/authentication_test.go  | 15 +++++
 .../discovery/pkg/networking/grpcgen/mtls_test.go  | 15 +++++
 .../serviceentry/controller_test.go                |  6 +-
 .../pkg/xds/endpoints/endpoint_builder_test.go     | 15 +++++
 dubbod/gui/handler.go                              | 15 +++++
 dubbod/gui/handler_test.go                         | 15 +++++
 dubbod/gui/resources/data/app.js                   | 17 ++++++
 dubbod/gui/resources/data/charts.js                | 17 ++++++
 dubbod/gui/resources/data/index.html               | 17 ++++++
 dubbod/gui/resources/data/mock.js                  | 17 ++++++
 dubbod/gui/resources/data/styles.css               | 17 ++++++
 dubbod/gui/resources/data/topology.js              | 17 ++++++
 dubbod/gui/resources/fs.go                         | 15 +++++
 pkg/kube/multicluster/eastwest.go                  | 15 +++++
 pkg/kube/multicluster/eastwest_test.go             | 15 +++++
 pkg/kube/multicluster/secretcontroller_test.go     | 15 +++++
 samples/moviereview/src/details/Dockerfile         | 15 +++++
 samples/moviereview/src/moviepage/Dockerfile       | 15 +++++
 samples/moviereview/src/ratings/Dockerfile         | 15 +++++
 samples/moviereview/src/reviews-v1/Dockerfile      | 15 +++++
 samples/moviereview/src/reviews-v2/Dockerfile      | 15 +++++
 samples/moviereview/src/reviews-v3/Dockerfile      | 15 +++++
 tools/ci/install-helm.sh                           | 66 ++++++++++++++++++++++
 tools/ci/install-kind.sh                           | 65 +++++++++++++++++++++
 tools/govulncheck.py                               | 14 +++++
 41 files changed, 715 insertions(+), 22 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
index 199366fa..4b54410a 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -36,8 +36,9 @@ github:
     # Enable wiki for documentation
     wiki: false
   protected_branches:
-    master: {}
-    # only disable force push
-    # foo: bar
-
-
+    master:
+      required_status_checks:
+        strict: true
+        contexts:
+          # This stable aggregate check fails unless every required CI job 
passes.
+          - CI Required
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ee734d31..70fac3aa 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -118,7 +118,7 @@ jobs:
           file: ./coverage.txt
           flags: unittests
           name: codecov-umbrella
-          fail_ci_if_error: false
+          fail_ci_if_error: true
 
   performance:
     name: Performance Scale Smoke
@@ -182,9 +182,7 @@ jobs:
         uses: actions/checkout@v4
 
       - name: Install Helm
-        uses: azure/setup-helm@v4
-        with:
-          version: 'v3.16.4'
+        run: tools/ci/install-helm.sh v3.16.4
 
       - name: Lint and render charts
         run: make lint-helm
@@ -199,17 +197,57 @@ jobs:
         uses: actions/checkout@v4
 
       - name: Install Helm
-        uses: azure/setup-helm@v4
-        with:
-          version: 'v3.16.4'
+        run: tools/ci/install-helm.sh v3.16.4
 
       - name: Install kind
-        uses: helm/kind-action@v1
-        with:
-          install_only: true
-          version: 'v0.30.0'
+        run: tools/ci/install-kind.sh v0.30.0
 
       - name: Run e2e smoke test
         env:
           UPGRADE_FROM_VERSION: '0.4.3'
         run: make test-e2e
+
+  required:
+    name: CI Required
+    runs-on: ubuntu-latest
+    timeout-minutes: 5
+    if: ${{ always() }}
+    needs:
+      - lint
+      - check
+      - unit-test
+      - performance
+      - build
+      - helm
+      - e2e
+    steps:
+      - name: Verify required jobs passed
+        env:
+          LINT_RESULT: ${{ needs.lint.result }}
+          CHECK_RESULT: ${{ needs.check.result }}
+          UNIT_TEST_RESULT: ${{ needs.unit-test.result }}
+          PERFORMANCE_RESULT: ${{ needs.performance.result }}
+          BUILD_RESULT: ${{ needs.build.result }}
+          HELM_RESULT: ${{ needs.helm.result }}
+          E2E_RESULT: ${{ needs.e2e.result }}
+        run: |
+          failed=0
+          for job_result in \
+            "lint=${LINT_RESULT}" \
+            "check=${CHECK_RESULT}" \
+            "unit-test=${UNIT_TEST_RESULT}" \
+            "performance=${PERFORMANCE_RESULT}" \
+            "build=${BUILD_RESULT}" \
+            "helm=${HELM_RESULT}" \
+            "e2e=${E2E_RESULT}"; do
+            job="${job_result%%=*}"
+            result="${job_result#*=}"
+            echo "${job}: ${result}"
+            if [[ "${result}" != "success" ]]; then
+              failed=1
+            fi
+          done
+          if [[ "${failed}" -ne 0 ]]; then
+            echo "Required CI job did not succeed." >&2
+            exit 1
+          fi
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 7ce67f7c..f8129f04 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -238,9 +238,7 @@ jobs:
         uses: actions/checkout@v4
 
       - name: Install Helm
-        uses: azure/[email protected]
-        with:
-          version: 'v3.16.4'
+        run: tools/ci/install-helm.sh v3.16.4
 
       - name: Lint, package, and verify charts
         env:
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 2364d900..06ff73cd 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -23,6 +23,9 @@ header:
     - '**/*.pb.go'
     - '**/*.gen.go'
     - '**/*.cache'
+
+    # Upstream KRT sources retain the Istio Authors Apache-2.0 header.
+    - 'pkg/kube/krt/**'
     
     # Configuration and template files
     - '**/*.proto'
@@ -58,6 +61,7 @@ header:
     
     # Test data
     - '**/testdata/**'
+    - '**/*.pem'
     
     # Log files
     - '**/*.log'
diff --git a/dubboctl/cmd/admin_test.go b/dubboctl/cmd/admin_test.go
index cd635224..11307f04 100644
--- a/dubboctl/cmd/admin_test.go
+++ b/dubboctl/cmd/admin_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package cmd
 
 import (
diff --git a/dubboctl/cmd/dashboard_test.go b/dubboctl/cmd/dashboard_test.go
index b44a963f..00084d42 100644
--- a/dubboctl/cmd/dashboard_test.go
+++ b/dubboctl/cmd/dashboard_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package cmd
 
 import (
diff --git a/dubboctl/cmd/get_test.go b/dubboctl/cmd/get_test.go
index ef9af75c..2c7f91d0 100644
--- a/dubboctl/cmd/get_test.go
+++ b/dubboctl/cmd/get_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package cmd
 
 import (
diff --git a/dubboctl/cmd/gui.go b/dubboctl/cmd/gui.go
index ba4e6c2f..72d100d9 100644
--- a/dubboctl/cmd/gui.go
+++ b/dubboctl/cmd/gui.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package cmd
 
 import (
diff --git a/dubboctl/cmd/gui_test.go b/dubboctl/cmd/gui_test.go
index 9e7bc056..82fb45e2 100644
--- a/dubboctl/cmd/gui_test.go
+++ b/dubboctl/cmd/gui_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package cmd
 
 import "testing"
diff --git a/dubboctl/cmd/multicluster.go b/dubboctl/cmd/multicluster.go
index b75381b8..69610006 100644
--- a/dubboctl/cmd/multicluster.go
+++ b/dubboctl/cmd/multicluster.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package cmd
 
 import (
diff --git a/dubboctl/cmd/multicluster_test.go 
b/dubboctl/cmd/multicluster_test.go
index 1f9bb565..560f653f 100644
--- a/dubboctl/cmd/multicluster_test.go
+++ b/dubboctl/cmd/multicluster_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package cmd
 
 import (
diff --git a/dubbod/discovery/cmd/app/grpc_inbound_test.go 
b/dubbod/discovery/cmd/app/grpc_inbound_test.go
index fadac08f..adfc6433 100644
--- a/dubbod/discovery/cmd/app/grpc_inbound_test.go
+++ b/dubbod/discovery/cmd/app/grpc_inbound_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package app
 
 import (
diff --git a/dubbod/discovery/cmd/app/grpc_outbound_test.go 
b/dubbod/discovery/cmd/app/grpc_outbound_test.go
index 0a001f30..ee82cd69 100644
--- a/dubbod/discovery/cmd/app/grpc_outbound_test.go
+++ b/dubbod/discovery/cmd/app/grpc_outbound_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package app
 
 import (
diff --git a/dubbod/discovery/pkg/bootstrap/gateway_multicluster.go 
b/dubbod/discovery/pkg/bootstrap/gateway_multicluster.go
index 75ceee86..65e4e971 100644
--- a/dubbod/discovery/pkg/bootstrap/gateway_multicluster.go
+++ b/dubbod/discovery/pkg/bootstrap/gateway_multicluster.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package bootstrap
 
 import (
diff --git a/dubbod/discovery/pkg/bootstrap/gui.go 
b/dubbod/discovery/pkg/bootstrap/gui.go
index f2545a3d..65199636 100644
--- a/dubbod/discovery/pkg/bootstrap/gui.go
+++ b/dubbod/discovery/pkg/bootstrap/gui.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package bootstrap
 
 import (
diff --git a/dubbod/discovery/pkg/bootstrap/gui_test.go 
b/dubbod/discovery/pkg/bootstrap/gui_test.go
index 88ae1b5c..730a91c2 100644
--- a/dubbod/discovery/pkg/bootstrap/gui_test.go
+++ b/dubbod/discovery/pkg/bootstrap/gui_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package bootstrap
 
 import (
diff --git a/dubbod/discovery/pkg/model/authentication_test.go 
b/dubbod/discovery/pkg/model/authentication_test.go
index b186e9fd..a6cce7ab 100644
--- a/dubbod/discovery/pkg/model/authentication_test.go
+++ b/dubbod/discovery/pkg/model/authentication_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package model
 
 import (
diff --git a/dubbod/discovery/pkg/networking/grpcgen/mtls_test.go 
b/dubbod/discovery/pkg/networking/grpcgen/mtls_test.go
index 68218140..f6338f20 100644
--- a/dubbod/discovery/pkg/networking/grpcgen/mtls_test.go
+++ b/dubbod/discovery/pkg/networking/grpcgen/mtls_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package grpcgen
 
 import (
diff --git 
a/dubbod/discovery/pkg/serviceregistry/serviceentry/controller_test.go 
b/dubbod/discovery/pkg/serviceregistry/serviceentry/controller_test.go
index 7c822608..b513c459 100644
--- a/dubbod/discovery/pkg/serviceregistry/serviceentry/controller_test.go
+++ b/dubbod/discovery/pkg/serviceregistry/serviceentry/controller_test.go
@@ -132,7 +132,7 @@ func (f *fakeConfigController) HasSynced() bool          { 
return true }
 
 func (f *fakeConfigController) create(t *testing.T, cfg config.Config) {
        t.Helper()
-       if _, err := f.ConfigStore.Create(cfg); err != nil {
+       if _, err := f.Create(cfg); err != nil {
                t.Fatal(err)
        }
        current := *f.Get(cfg.GroupVersionKind, cfg.Name, cfg.Namespace)
@@ -145,7 +145,7 @@ func (f *fakeConfigController) update(t *testing.T, cfg 
config.Config) {
        t.Helper()
        old := *f.Get(cfg.GroupVersionKind, cfg.Name, cfg.Namespace)
        cfg.ResourceVersion = ""
-       if _, err := f.ConfigStore.Update(cfg); err != nil {
+       if _, err := f.Update(cfg); err != nil {
                t.Fatal(err)
        }
        current := *f.Get(cfg.GroupVersionKind, cfg.Name, cfg.Namespace)
@@ -157,7 +157,7 @@ func (f *fakeConfigController) update(t *testing.T, cfg 
config.Config) {
 func (f *fakeConfigController) delete(t *testing.T, kind 
config.GroupVersionKind, name, namespace string) {
        t.Helper()
        old := *f.Get(kind, name, namespace)
-       if err := f.ConfigStore.Delete(kind, name, namespace, nil); err != nil {
+       if err := f.Delete(kind, name, namespace, nil); err != nil {
                t.Fatal(err)
        }
        for _, handler := range f.handlers[kind] {
diff --git a/dubbod/discovery/pkg/xds/endpoints/endpoint_builder_test.go 
b/dubbod/discovery/pkg/xds/endpoints/endpoint_builder_test.go
index c60e3f42..06d38160 100644
--- a/dubbod/discovery/pkg/xds/endpoints/endpoint_builder_test.go
+++ b/dubbod/discovery/pkg/xds/endpoints/endpoint_builder_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package endpoints
 
 import (
diff --git a/dubbod/gui/handler.go b/dubbod/gui/handler.go
index 45072203..8897a0d0 100644
--- a/dubbod/gui/handler.go
+++ b/dubbod/gui/handler.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package gui
 
 import (
diff --git a/dubbod/gui/handler_test.go b/dubbod/gui/handler_test.go
index 49ad8d57..77a4de31 100644
--- a/dubbod/gui/handler_test.go
+++ b/dubbod/gui/handler_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package gui
 
 import (
diff --git a/dubbod/gui/resources/data/app.js b/dubbod/gui/resources/data/app.js
index 231ee205..6b494a8e 100644
--- a/dubbod/gui/resources/data/app.js
+++ b/dubbod/gui/resources/data/app.js
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 /**
  * Dubbo control plane console (Preact no-build).
  *
diff --git a/dubbod/gui/resources/data/charts.js 
b/dubbod/gui/resources/data/charts.js
index f505e795..46f54349 100644
--- a/dubbod/gui/resources/data/charts.js
+++ b/dubbod/gui/resources/data/charts.js
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 /**
  * Hand-rolled SVG chart primitives (no external chart library).
  *
diff --git a/dubbod/gui/resources/data/index.html 
b/dubbod/gui/resources/data/index.html
index acb4a1b1..4765e83a 100644
--- a/dubbod/gui/resources/data/index.html
+++ b/dubbod/gui/resources/data/index.html
@@ -1,3 +1,20 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
 <!DOCTYPE html>
 <html lang="en">
 <head>
diff --git a/dubbod/gui/resources/data/mock.js 
b/dubbod/gui/resources/data/mock.js
index 4d3302ee..411296b7 100644
--- a/dubbod/gui/resources/data/mock.js
+++ b/dubbod/gui/resources/data/mock.js
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 /**
  * Development mock data.
  *
diff --git a/dubbod/gui/resources/data/styles.css 
b/dubbod/gui/resources/data/styles.css
index 04cb6fc4..568d9459 100644
--- a/dubbod/gui/resources/data/styles.css
+++ b/dubbod/gui/resources/data/styles.css
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 /* ---------------------------------------------------------------------------
  * Dubbo Console — "engineering print" design system
  *
diff --git a/dubbod/gui/resources/data/topology.js 
b/dubbod/gui/resources/data/topology.js
index 193ee95e..26e57b32 100644
--- a/dubbod/gui/resources/data/topology.js
+++ b/dubbod/gui/resources/data/topology.js
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 /**
  * Config-plane topology — the console's signature view.
  *
diff --git a/dubbod/gui/resources/fs.go b/dubbod/gui/resources/fs.go
index 1d50fc65..2e5fc7b0 100644
--- a/dubbod/gui/resources/fs.go
+++ b/dubbod/gui/resources/fs.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package resources
 
 import (
diff --git a/pkg/kube/multicluster/eastwest.go 
b/pkg/kube/multicluster/eastwest.go
index 247f453b..c6538473 100644
--- a/pkg/kube/multicluster/eastwest.go
+++ b/pkg/kube/multicluster/eastwest.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package multicluster
 
 import (
diff --git a/pkg/kube/multicluster/eastwest_test.go 
b/pkg/kube/multicluster/eastwest_test.go
index 3e03a15f..b5467a92 100644
--- a/pkg/kube/multicluster/eastwest_test.go
+++ b/pkg/kube/multicluster/eastwest_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package multicluster
 
 import (
diff --git a/pkg/kube/multicluster/secretcontroller_test.go 
b/pkg/kube/multicluster/secretcontroller_test.go
index 4fa45c25..e78fd1f4 100644
--- a/pkg/kube/multicluster/secretcontroller_test.go
+++ b/pkg/kube/multicluster/secretcontroller_test.go
@@ -1,3 +1,18 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package multicluster
 
 import (
diff --git a/samples/moviereview/src/details/Dockerfile 
b/samples/moviereview/src/details/Dockerfile
index 5d706a76..fe00a72b 100644
--- a/samples/moviereview/src/details/Dockerfile
+++ b/samples/moviereview/src/details/Dockerfile
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 FROM golang:1.25-alpine AS build
 
 WORKDIR /src
diff --git a/samples/moviereview/src/moviepage/Dockerfile 
b/samples/moviereview/src/moviepage/Dockerfile
index e5769d15..1cd2fb7a 100644
--- a/samples/moviereview/src/moviepage/Dockerfile
+++ b/samples/moviereview/src/moviepage/Dockerfile
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 FROM python:3.12-alpine
 
 WORKDIR /app
diff --git a/samples/moviereview/src/ratings/Dockerfile 
b/samples/moviereview/src/ratings/Dockerfile
index d02adb35..96759f53 100644
--- a/samples/moviereview/src/ratings/Dockerfile
+++ b/samples/moviereview/src/ratings/Dockerfile
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 FROM golang:1.25-alpine AS build
 
 WORKDIR /src
diff --git a/samples/moviereview/src/reviews-v1/Dockerfile 
b/samples/moviereview/src/reviews-v1/Dockerfile
index af3542d4..56d4a466 100644
--- a/samples/moviereview/src/reviews-v1/Dockerfile
+++ b/samples/moviereview/src/reviews-v1/Dockerfile
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 FROM eclipse-temurin:21-jdk-alpine AS build
 
 WORKDIR /src
diff --git a/samples/moviereview/src/reviews-v2/Dockerfile 
b/samples/moviereview/src/reviews-v2/Dockerfile
index e5769d15..1cd2fb7a 100644
--- a/samples/moviereview/src/reviews-v2/Dockerfile
+++ b/samples/moviereview/src/reviews-v2/Dockerfile
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 FROM python:3.12-alpine
 
 WORKDIR /app
diff --git a/samples/moviereview/src/reviews-v3/Dockerfile 
b/samples/moviereview/src/reviews-v3/Dockerfile
index f1767c8b..944723a7 100644
--- a/samples/moviereview/src/reviews-v3/Dockerfile
+++ b/samples/moviereview/src/reviews-v3/Dockerfile
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 FROM node:22-alpine
 
 WORKDIR /app
diff --git a/tools/ci/install-helm.sh b/tools/ci/install-helm.sh
new file mode 100755
index 00000000..f9bcfbd3
--- /dev/null
+++ b/tools/ci/install-helm.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -euo pipefail
+
+version="${1:-}"
+if [[ ! "${version}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+  echo "usage: $0 vMAJOR.MINOR.PATCH" >&2
+  exit 2
+fi
+
+case "$(uname -m)" in
+  x86_64) arch="amd64" ;;
+  aarch64 | arm64) arch="arm64" ;;
+  *)
+    echo "unsupported architecture: $(uname -m)" >&2
+    exit 1
+    ;;
+esac
+
+if [[ "$(uname -s)" != "Linux" ]]; then
+  echo "unsupported operating system: $(uname -s)" >&2
+  exit 1
+fi
+
+archive="helm-${version}-linux-${arch}.tar.gz"
+download_base="https://get.helm.sh";
+install_root="${RUNNER_TEMP:-${TMPDIR:-/tmp}}/dubbo-ci-tools"
+work_dir="$(mktemp -d "${TMPDIR:-/tmp}/dubbo-helm.XXXXXX")"
+
+cleanup() {
+  rm -rf -- "${work_dir}"
+}
+trap cleanup EXIT
+
+curl -fsSLo "${work_dir}/${archive}" "${download_base}/${archive}"
+curl -fsSLo "${work_dir}/${archive}.sha256sum" 
"${download_base}/${archive}.sha256sum"
+expected="$(awk 'NR == 1 {print $1}' "${work_dir}/${archive}.sha256sum")"
+actual="$(sha256sum "${work_dir}/${archive}" | awk '{print $1}')"
+if [[ -z "${expected}" || "${actual}" != "${expected}" ]]; then
+  echo "helm checksum verification failed for ${archive}" >&2
+  exit 1
+fi
+
+tar -xzf "${work_dir}/${archive}" -C "${work_dir}"
+mkdir -p "${install_root}/bin"
+install -m 0755 "${work_dir}/linux-${arch}/helm" "${install_root}/bin/helm"
+
+if [[ -n "${GITHUB_PATH:-}" ]]; then
+  echo "${install_root}/bin" >> "${GITHUB_PATH}"
+fi
+
+"${install_root}/bin/helm" version --short
diff --git a/tools/ci/install-kind.sh b/tools/ci/install-kind.sh
new file mode 100755
index 00000000..511e524f
--- /dev/null
+++ b/tools/ci/install-kind.sh
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -euo pipefail
+
+version="${1:-}"
+if [[ ! "${version}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+  echo "usage: $0 vMAJOR.MINOR.PATCH" >&2
+  exit 2
+fi
+
+case "$(uname -m)" in
+  x86_64) arch="amd64" ;;
+  aarch64 | arm64) arch="arm64" ;;
+  *)
+    echo "unsupported architecture: $(uname -m)" >&2
+    exit 1
+    ;;
+esac
+
+if [[ "$(uname -s)" != "Linux" ]]; then
+  echo "unsupported operating system: $(uname -s)" >&2
+  exit 1
+fi
+
+binary="kind-linux-${arch}"
+download_base="https://github.com/kubernetes-sigs/kind/releases/download/${version}";
+install_root="${RUNNER_TEMP:-${TMPDIR:-/tmp}}/dubbo-ci-tools"
+work_dir="$(mktemp -d "${TMPDIR:-/tmp}/dubbo-kind.XXXXXX")"
+
+cleanup() {
+  rm -rf -- "${work_dir}"
+}
+trap cleanup EXIT
+
+curl -fsSLo "${work_dir}/${binary}" "${download_base}/${binary}"
+curl -fsSLo "${work_dir}/${binary}.sha256sum" 
"${download_base}/${binary}.sha256sum"
+expected="$(awk 'NR == 1 {print $1}' "${work_dir}/${binary}.sha256sum")"
+actual="$(sha256sum "${work_dir}/${binary}" | awk '{print $1}')"
+if [[ -z "${expected}" || "${actual}" != "${expected}" ]]; then
+  echo "kind checksum verification failed for ${binary}" >&2
+  exit 1
+fi
+
+mkdir -p "${install_root}/bin"
+install -m 0755 "${work_dir}/${binary}" "${install_root}/bin/kind"
+
+if [[ -n "${GITHUB_PATH:-}" ]]; then
+  echo "${install_root}/bin" >> "${GITHUB_PATH}"
+fi
+
+"${install_root}/bin/kind" version
diff --git a/tools/govulncheck.py b/tools/govulncheck.py
index 91c5e0a5..f487f8da 100644
--- a/tools/govulncheck.py
+++ b/tools/govulncheck.py
@@ -1,4 +1,18 @@
 #!/usr/bin/env python3
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 import json
 from pathlib import Path

Reply via email to