diff --git a/.github/workflows/test-devcontainer.yaml b/.github/workflows/test-devcontainer.yaml new file mode 100644 index 00000000000..da459cca614 --- /dev/null +++ b/.github/workflows/test-devcontainer.yaml @@ -0,0 +1,42 @@ +name: Test DevContainer Image + +on: + push: + pull_request: + +jobs: + test-devcontainer: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Go 1.22.x + uses: actions/setup-go@v5 + with: + go-version: "1.22.x" + + # required for installing devcontainer CLI + - name: Setup NodeJS 20.x + uses: actions/setup-node@v4 + with: + node-version: "20.x" + + - name: Setup Devcontainer CLI + run: | + npm install -g @devcontainers/cli + + - name: Build and Validate DevContainer + run: | + cd testdata/project-v4 + + OUTPUT=$(devcontainer up --workspace-folder=./) + STATUS=$(echo "$OUTPUT" | jq -r '.outcome') + + if [[ "$STATUS" == "success" ]]; then + echo "Devcontainer setup was successful." + exit 0 + else + echo "Devcontainer setup failed." + exit 1 + fi diff --git a/docs/book/src/cronjob-tutorial/testdata/project/.devcontainer/devcontainer.json b/docs/book/src/cronjob-tutorial/testdata/project/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..df867948839 --- /dev/null +++ b/docs/book/src/cronjob-tutorial/testdata/project/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + diff --git a/docs/book/src/cronjob-tutorial/testdata/project/.devcontainer/post-install.sh b/docs/book/src/cronjob-tutorial/testdata/project/.devcontainer/post-install.sh new file mode 100644 index 00000000000..daac1cac176 --- /dev/null +++ b/docs/book/src/cronjob-tutorial/testdata/project/.devcontainer/post-install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client diff --git a/docs/book/src/getting-started/testdata/project/.devcontainer/devcontainer.json b/docs/book/src/getting-started/testdata/project/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..df867948839 --- /dev/null +++ b/docs/book/src/getting-started/testdata/project/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + diff --git a/docs/book/src/getting-started/testdata/project/.devcontainer/post-install.sh b/docs/book/src/getting-started/testdata/project/.devcontainer/post-install.sh new file mode 100644 index 00000000000..daac1cac176 --- /dev/null +++ b/docs/book/src/getting-started/testdata/project/.devcontainer/post-install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client diff --git a/pkg/plugins/golang/v4/scaffolds/init.go b/pkg/plugins/golang/v4/scaffolds/init.go index 9700a606c3e..ab4ce8ad2d3 100644 --- a/pkg/plugins/golang/v4/scaffolds/init.go +++ b/pkg/plugins/golang/v4/scaffolds/init.go @@ -162,5 +162,7 @@ func (s *initScaffolder) Scaffold() error { &e2e.Test{}, &e2e.SuiteTest{}, &utils.Utils{}, + &templates.DevContainer{}, + &templates.DevContainerPostInstallScript{}, ) } diff --git a/pkg/plugins/golang/v4/scaffolds/internal/templates/devcontainer.go b/pkg/plugins/golang/v4/scaffolds/internal/templates/devcontainer.go new file mode 100644 index 00000000000..a08bdac9530 --- /dev/null +++ b/pkg/plugins/golang/v4/scaffolds/internal/templates/devcontainer.go @@ -0,0 +1,118 @@ +/* +Copyright 2024 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 templates + +import ( + "sigs.k8s.io/kubebuilder/v4/pkg/machinery" +) + +const devContainerTemplate = `{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + +` + +const postInstallScript = `#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client +` + +var _ machinery.Template = &DevContainer{} +var _ machinery.Template = &DevContainerPostInstallScript{} + +// DevCotaniner scaffoldds a `devcontainer.json` configurations file for +// creating Kubebuilder & Kind based DevContainer. +type DevContainer struct { + machinery.TemplateMixin +} + +type DevContainerPostInstallScript struct { + machinery.TemplateMixin +} + +func (f *DevContainer) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = ".devcontainer/devcontainer.json" + } + + f.TemplateBody = devContainerTemplate + + return nil +} + +func (f *DevContainerPostInstallScript) SetTemplateDefaults() error { + if f.Path == "" { + f.Path = ".devcontainer/post-install.sh" + } + + f.TemplateBody = postInstallScript + + return nil +} diff --git a/testdata/project-v4-multigroup-with-deploy-image/.devcontainer/devcontainer.json b/testdata/project-v4-multigroup-with-deploy-image/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..df867948839 --- /dev/null +++ b/testdata/project-v4-multigroup-with-deploy-image/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + diff --git a/testdata/project-v4-multigroup-with-deploy-image/.devcontainer/post-install.sh b/testdata/project-v4-multigroup-with-deploy-image/.devcontainer/post-install.sh new file mode 100644 index 00000000000..daac1cac176 --- /dev/null +++ b/testdata/project-v4-multigroup-with-deploy-image/.devcontainer/post-install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client diff --git a/testdata/project-v4-multigroup/.devcontainer/devcontainer.json b/testdata/project-v4-multigroup/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..df867948839 --- /dev/null +++ b/testdata/project-v4-multigroup/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + diff --git a/testdata/project-v4-multigroup/.devcontainer/post-install.sh b/testdata/project-v4-multigroup/.devcontainer/post-install.sh new file mode 100644 index 00000000000..daac1cac176 --- /dev/null +++ b/testdata/project-v4-multigroup/.devcontainer/post-install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client diff --git a/testdata/project-v4-with-deploy-image/.devcontainer/devcontainer.json b/testdata/project-v4-with-deploy-image/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..df867948839 --- /dev/null +++ b/testdata/project-v4-with-deploy-image/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + diff --git a/testdata/project-v4-with-deploy-image/.devcontainer/post-install.sh b/testdata/project-v4-with-deploy-image/.devcontainer/post-install.sh new file mode 100644 index 00000000000..daac1cac176 --- /dev/null +++ b/testdata/project-v4-with-deploy-image/.devcontainer/post-install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client diff --git a/testdata/project-v4-with-grafana/.devcontainer/devcontainer.json b/testdata/project-v4-with-grafana/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..df867948839 --- /dev/null +++ b/testdata/project-v4-with-grafana/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + diff --git a/testdata/project-v4-with-grafana/.devcontainer/post-install.sh b/testdata/project-v4-with-grafana/.devcontainer/post-install.sh new file mode 100644 index 00000000000..daac1cac176 --- /dev/null +++ b/testdata/project-v4-with-grafana/.devcontainer/post-install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client diff --git a/testdata/project-v4/.devcontainer/devcontainer.json b/testdata/project-v4/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..df867948839 --- /dev/null +++ b/testdata/project-v4/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "name": "Kubebuilder DevContainer", + "image": "golang:1.22-bullseye", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/git:1": {} + }, + + // Required for running Kind inside DevContainer + "runArgs": ["--network=host"], + + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-kubernetes-tools.vscode-kubernetes-tools", + "ms-azuretools.vscode-docker" + ] + } + }, + + "onCreateCommand": "bash .devcontainer/post-install.sh" +} + diff --git a/testdata/project-v4/.devcontainer/post-install.sh b/testdata/project-v4/.devcontainer/post-install.sh new file mode 100644 index 00000000000..daac1cac176 --- /dev/null +++ b/testdata/project-v4/.devcontainer/post-install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2024 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. + +set -x + +curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64 +chmod +x ./kind +mv ./kind /usr/local/bin/kind + +curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64 +chmod +x kubebuilder +mv kubebuilder /usr/local/bin/ + +curl -L -o kubectl https://dl.k8s.io/release/v1.31.0/bin/linux/amd64/kubectl +chmod +x kubectl +mv kubectl /usr/local/bin/kubectl + +kind version +kubebuilder version +docker --version +go version +kubectl version --client