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