diff --git a/.github/workflows/external-plugin.yml b/.github/workflows/external-plugin.yml new file mode 100644 index 00000000000..d32b7df6021 --- /dev/null +++ b/.github/workflows/external-plugin.yml @@ -0,0 +1,76 @@ +name: External Plugin + +on: + push: + paths: + - 'pkg/' + - 'docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin' + - '.github/workflows/external-plugin.yml' + pull_request: + paths: + - 'pkg/' + - 'docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin' + - '.github/workflows/external-plugin.yml' + +jobs: + external: + name: Verify external plugin + runs-on: ubuntu-latest + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository + steps: + - name: Clone the code + uses: actions/checkout@v4 + with: + # Fetching minimal history to limit .git access + fetch-depth: 1 + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: '1.22.3' + + - name: Build Sample External Plugin + working-directory: docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1 + run: | + mkdir -p ./bin + make build + + - name: Move Plugin Binary to Plugin Path + run: | + # Define the plugin destination for Linux (XDG_CONFIG_HOME path) + XDG_CONFIG_HOME="${HOME}/.config" + PLUGIN_DEST="$XDG_CONFIG_HOME/kubebuilder/plugins/sampleexternalplugin/v1" + + # Ensure destination exists and move the built binary + mkdir -p "$PLUGIN_DEST" + mv docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/bin/sampleexternalplugin "$PLUGIN_DEST/sampleexternalplugin" + + - name: Build Kubebuilder Binary + run: | + # Set kb_root_dir to avoid .git permissions issues + export kb_root_dir=$(pwd) + go build -o "${kb_root_dir}/bin/kubebuilder" ./cmd + echo "${kb_root_dir}/bin" >> $GITHUB_PATH + + - name: Run Kubebuilder Commands + env: + KUBEBUILDER_ASSETS: $GITHUB_WORKSPACE/bin + run: | + # Ensure kubebuilder is executable + which kubebuilder || exit 1 + + # Initialize a new project using the sample external plugin + kubebuilder init --plugins sampleexternalplugin/v1 --domain sample.domain.com + + # Create an API using the plugin + kubebuilder create api --plugins sampleexternalplugin/v1 --number=2 --group=example --version=v1alpha1 --kind=ExampleKind + + # Create a webhook using the plugin + kubebuilder create webhook --plugins sampleexternalplugin/v1 --hooked --group=example --version=v1alpha1 --kind=ExampleKind + + - name: Verify Generated Files + run: | + # Check contents of the generated files + grep "DOMAIN: sample.domain.com" ./initFile.txt || exit 1 + grep "NUMBER: 2" ./apiFile.txt || exit 1 + grep "HOOKED!" ./webhookFile.txt || exit 1 diff --git a/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.mod b/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.mod index b3cb03fb69e..eecc1f591d3 100644 --- a/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.mod +++ b/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.mod @@ -1,17 +1,19 @@ module v1 -go 1.22 +go 1.22.0 + +toolchain go1.22.5 require ( github.com/spf13/pflag v1.0.5 - sigs.k8s.io/kubebuilder/v4 v4.2.0 + sigs.k8s.io/kubebuilder/v4 v4.3.0 ) require ( - github.com/gobuffalo/flect v1.0.2 // indirect + github.com/gobuffalo/flect v1.0.3 // indirect github.com/spf13/afero v1.11.0 // indirect - golang.org/x/mod v0.20.0 // indirect + golang.org/x/mod v0.21.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/text v0.17.0 // indirect - golang.org/x/tools v0.24.0 // indirect + golang.org/x/text v0.19.0 // indirect + golang.org/x/tools v0.26.0 // indirect ) diff --git a/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.sum b/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.sum index b998e11ebed..416fb981c8d 100644 --- a/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.sum +++ b/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1/go.sum @@ -1,22 +1,24 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= -github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= +github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= +github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= -github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= -github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= +github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -26,27 +28,26 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -sigs.k8s.io/kubebuilder/v4 v4.2.0 h1:vl5WgaYKR6e6YDK02Mizf7d1RxFNk1pOSnh6uRnHm6s= -sigs.k8s.io/kubebuilder/v4 v4.2.0/go.mod h1:Jq0Qrlrtn3YKdCFSW6CBbmGuwsw6xO6a7beFiVQf/bI= +sigs.k8s.io/kubebuilder/v4 v4.3.0 h1:h01b7sEmgwisvWylU/7PH/LD+eJMX/p+H2s5Vvt4kkI= +sigs.k8s.io/kubebuilder/v4 v4.3.0/go.mod h1:aJkZuiz9pgxCbXBLapYrdPAH+jPQ82YieMFBN/2paf8= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/test/e2e/ci.sh b/test/e2e/ci.sh index 2b971a6ecf4..dbafba3a3b6 100755 --- a/test/e2e/ci.sh +++ b/test/e2e/ci.sh @@ -17,8 +17,6 @@ source "$(dirname "$0")/../common.sh" source "$(dirname "$0")/setup.sh" -build_sample_external_plugin - export KIND_CLUSTER="kind" create_cluster ${KIND_K8S_VERSION} trap delete_cluster EXIT diff --git a/test/e2e/externalplugin/e2e_suite_test.go b/test/e2e/externalplugin/e2e_suite_test.go deleted file mode 100644 index 9f41a358919..00000000000 --- a/test/e2e/externalplugin/e2e_suite_test.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2023 The Kubernetes Authors. - -Licensed 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 externalplugin - -import ( - "fmt" - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -// Run e2e tests using the Ginkgo runner. -func TestE2E(t *testing.T) { - RegisterFailHandler(Fail) - _, _ = fmt.Fprintf(GinkgoWriter, "Starting sample external plugin kubebuilder suite\n") - RunSpecs(t, "Kubebuilder sample external plugin e2e suite") -} diff --git a/test/e2e/externalplugin/generate_test.go b/test/e2e/externalplugin/generate_test.go deleted file mode 100644 index 092e855bfb3..00000000000 --- a/test/e2e/externalplugin/generate_test.go +++ /dev/null @@ -1,106 +0,0 @@ -/* -Copyright 2023 The Kubernetes Authors. - -Licensed 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 externalplugin - -import ( - "path/filepath" - - pluginutil "sigs.k8s.io/kubebuilder/v4/pkg/plugin/util" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - //nolint:golint - // nolint:revive - //nolint:golint - // nolint:revive - "sigs.k8s.io/kubebuilder/v4/test/e2e/utils" -) - -var _ = Describe("kubebuilder", func() { - Context("plugin sampleexternalplugin/v1", func() { - var ( - kbc *utils.TestContext - ) - - BeforeEach(func() { - var err error - kbc, err = utils.NewTestContext(pluginutil.KubebuilderBinName, "GO111MODULE=on") - Expect(err).NotTo(HaveOccurred(), "Prepare NewTestContext should return no error.") - Expect(kbc.Prepare()).To(Succeed()) - }) - - AfterEach(func() { - kbc.Destroy() - }) - - It("should generate a runnable project with sample external plugin", func() { - GenerateProject(kbc) - }) - - }) -}) - -// GenerateProject implements a sampleexternalplugin/v1 external plugin project defined by a TestContext. -func GenerateProject(kbc *utils.TestContext) { - var err error - - By("initializing a project") - err = kbc.Init( - "--plugins", "sampleexternalplugin/v1", - "--domain", "sample.domain.com", - ) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - var initFileContentsTmpl = "A simple text file created with the `init` subcommand\nDOMAIN: sample.domain.com" - initFileContainsExpr, err := pluginutil.HasFileContentWith( - filepath.Join(kbc.Dir, "initFile.txt"), initFileContentsTmpl) - ExpectWithOffset(1, err).NotTo(HaveOccurred(), "Check initFile.txt should return no error.") - ExpectWithOffset(1, initFileContainsExpr).To(BeTrue(), "The init file does not contain the expected expression.") - - By("creating API definition") - err = kbc.CreateAPI( - "--plugins", "sampleexternalplugin/v1", - "--number=2", - "--group", kbc.Group, - "--version", kbc.Version, - "--kind", kbc.Kind, - ) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - var apiFileContentsTmpl = "A simple text file created with the `create api` subcommand\nNUMBER: 2" - apiFileContainsExpr, err := pluginutil.HasFileContentWith( - filepath.Join(kbc.Dir, "apiFile.txt"), apiFileContentsTmpl) - ExpectWithOffset(1, err).NotTo(HaveOccurred(), "Check apiFile.txt should return no error.") - ExpectWithOffset(1, apiFileContainsExpr).To(BeTrue(), "The api file does not contain the expected expression.") - - By("scaffolding webhook") - err = kbc.CreateWebhook( - "--plugins", "sampleexternalplugin/v1", - "--hooked", - "--group", kbc.Group, - "--version", kbc.Version, - "--kind", kbc.Kind, - ) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - var webhookFileContentsTmpl = "A simple text file created with the `create webhook` subcommand\nHOOKED!" - webhookFileContainsExpr, err := pluginutil.HasFileContentWith( - filepath.Join(kbc.Dir, "webhookFile.txt"), webhookFileContentsTmpl) - ExpectWithOffset(1, err).NotTo(HaveOccurred(), "Check webhookFile.txt should return no error.") - ExpectWithOffset(1, webhookFileContainsExpr).To(BeTrue(), "The webhook file does not contain the expected expression.") -} diff --git a/test/e2e/local.sh b/test/e2e/local.sh index fddf813937d..e939159802d 100755 --- a/test/e2e/local.sh +++ b/test/e2e/local.sh @@ -17,8 +17,6 @@ source "$(dirname "$0")/../common.sh" source "$(dirname "$0")/setup.sh" -build_sample_external_plugin - export KIND_CLUSTER="local-kubebuilder-e2e" create_cluster ${KIND_K8S_VERSION} if [ -z "${SKIP_KIND_CLEANUP:-}" ]; then diff --git a/test/e2e/setup.sh b/test/e2e/setup.sh index 18f96e24945..9c337c1201c 100755 --- a/test/e2e/setup.sh +++ b/test/e2e/setup.sh @@ -72,34 +72,3 @@ function test_cluster { go test $(dirname "$0")/externalplugin $flags -timeout 30m go test $(dirname "$0")/alphagenerate $flags -timeout 30m } - -function build_sample_external_plugin { - if [ "$(uname -s)" == "Darwin" ]; then - EXTERNAL_PLUGIN_DESTINATION_PREFIX="${HOME}/Library/Application Support/kubebuilder/plugins" - else - XDG_CONFIG_HOME="${HOME}/.config" - EXTERNAL_PLUGIN_DESTINATION_PREFIX="$XDG_CONFIG_HOME/kubebuilder/plugins" - fi - - PLUGIN_NAME="sampleexternalplugin" - PLUGIN_VERSION="v1" - EXTERNAL_PLUGIN_DESTINATION="${EXTERNAL_PLUGIN_DESTINATION_PREFIX}/${PLUGIN_NAME}/${PLUGIN_VERSION}" - EXTERNAL_PLUGIN_PATH="${EXTERNAL_PLUGIN_DESTINATION}/${PLUGIN_NAME}" - - if [ -d "$EXTERNAL_PLUGIN_DESTINATION" ]; then - echo "$EXTERNAL_PLUGIN_DESTINATION does exist." - if [ -e "$EXTERNAL_PLUGIN_PATH" ]; then - echo "clean up old binary..." - rm "$EXTERNAL_PLUGIN_PATH" - fi - else - mkdir -p "$EXTERNAL_PLUGIN_DESTINATION" - fi - - REPO_ROOT_DIR="$(git rev-parse --show-toplevel)" - SOURCE_DIR="${REPO_ROOT_DIR}/docs/book/src/simple-external-plugin-tutorial/testdata/sampleexternalplugin/v1" - - cd $SOURCE_DIR && go build -o $PLUGIN_NAME && mv $PLUGIN_NAME "$EXTERNAL_PLUGIN_PATH" - - cd $REPO_ROOT_DIR -}