Skip to content

Commit

Permalink
feat: options to configure local registry (#113)
Browse files Browse the repository at this point in the history
* feat: options to configure local registry

Signed-off-by: Thuan Vo <[email protected]>

* set registry address in env var LOCAL_REGISTRY

Signed-off-by: Thuan Vo <[email protected]>

* add missing code block syntax in README

Signed-off-by: Thuan Vo <[email protected]>

* output registry address as output instead

Signed-off-by: Thuan Vo <[email protected]>

---------

Signed-off-by: Thuan Vo <[email protected]>
  • Loading branch information
tthvo authored Dec 18, 2024
1 parent aed9fb9 commit 9315f6b
Show file tree
Hide file tree
Showing 7 changed files with 391 additions and 8 deletions.
90 changes: 90 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,93 @@ jobs:
run: |
kubectl cluster-info
kubectl get nodes
test-without-registry:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4

- name: Create kind cluster without registry
uses: ./
with:
registry: false

- name: Test
run: |
kubectl cluster-info
kubectl get storageclass standard
if [[ -n "$(docker ps --filter "name=kind-registry" --format "{{.ID}}")" ]]; then
echo "Registry is present"
exit 1
fi
test-with-registry:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4

- name: Create kind cluster with registry
id: kind
uses: ./
with:
registry: true
registry_name: custom-registry
registry_port: 5001

- name: Test
env:
LOCAL_REGISTRY: ${{ steps.kind.outputs.LOCAL_REGISTRY }}
run: |
kubectl cluster-info
kubectl get storageclass standard
if [[ -z "$(docker ps --filter "name=custom-registry" --format "{{.ID}}")" ]]; then
echo "Registry is not present"
exit 1
fi
docker pull busybox
docker tag busybox $LOCAL_REGISTRY/localbusybox
docker push $LOCAL_REGISTRY/localbusybox
kubectl create job test --image=$LOCAL_REGISTRY/localbusybox
kubectl wait --for=condition=complete --timeout=30s job/test
test-with-registry-and-delete-enabled:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4

- name: Create kind cluster with registry and delete enabled
id: kind
uses: ./
with:
registry: true
registry_name: custom-registry
registry_port: 5001
registry_enable_delete: true

- name: Test
env:
LOCAL_REGISTRY: ${{ steps.kind.outputs.LOCAL_REGISTRY }}
run: |
kubectl cluster-info
kubectl get storageclass standard
if [[ -z "$(docker ps --filter "name=custom-registry" --format "{{.ID}}")" ]]; then
echo "Registry is not present"
exit 1
fi
docker pull busybox
docker tag busybox $LOCAL_REGISTRY/localbusybox
DIGEST=$(docker push $LOCAL_REGISTRY/localbusybox | grep -oE 'sha256:\w+')
curl -X DELETE $LOCAL_REGISTRY/v2/localbusybox/manifests/$DIGEST
[[ "$(curl -Ls $LOCAL_REGISTRY/v2/localbusybox/tags/list | jq .tags)" == null ]]
42 changes: 42 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ For more information on inputs, see the [API Documentation](https://developer.gi
- `wait`: The duration to wait for the control plane to become ready (default: `60s`)
- `verbosity`: info log verbosity, higher value produces more output
- `kubectl_version`: The kubectl version to use (default: v1.30.4)
- `registry`: Whether to configure an insecure local registry (default: false)
- `registry_image`: The registry image to use (default: registry:2)
- `registry_name`: The registry name to use (default: kind-registry)
- `registry_port`: The local port used to bind the registry (default: 5000)
- `registry_enable_delete`: Enable delete operations on the registry (default: false)
- `install_only`: Skips cluster creation, only install kind (default: false)
- `ignore_failed_clean`: Whether to ignore the post delete cluster action failing (default: false)

Expand All @@ -45,6 +50,43 @@ jobs:
This uses [@helm/kind-action](https://github.com/helm/kind-action) GitHub Action to spin up a [kind](https://kind.sigs.k8s.io/) Kubernetes cluster on every Pull Request.
See [@helm/chart-testing-action](https://github.com/helm/chart-testing-action) for a more practical example.
### Configuring Local Registry
Create a workflow (eg: `.github/workflows/create-cluster-with-registry.yml`):


```yaml
name: Create Cluster with Registry
on: pull_request
jobs:
create-cluster-with-registry:
runs-on: ubuntu-latest
steps:
- name: Kubernetes KinD Cluster
id: kind
uses: helm/kind-action@v1
with:
registry: true
registry_name: my-registry
registry_port: 5001
registry_enable_delete: true
```

This will configure the cluster with an insecure local registry at `my-registry:5001` on both the host and within cluster. Subsequent steps can refer to the registry address with the output of the kind setup step (i.e. `${{ steps.kind.outputs.LOCAL_REGISTRY }}`).

**Note**: If `config` option is used, you must manually configure the cluster nodes with registry config dir enabled at `/etc/containerd/certs.d`. For example:

```yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
```

## Code of conduct

Participation in the Helm community is governed by the [Code of Conduct](CODE_OF_CONDUCT.md).
20 changes: 20 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,26 @@ inputs:
description: "The kubectl version to use (default: v1.31.4)"
required: false
default: "v1.31.4"
registry:
description: "Whether to configure an insecure local registry (default: false)"
required: false
default: "false"
registry_image:
description: "The registry image to use (default: registry:2)"
required: false
default: "registry:2"
registry_name:
description: "The registry name to use (default: kind-registry)"
required: false
default: "kind-registry"
registry_port:
description: "The local port used to bind the registry (default: 5000)"
required: false
default: "5000"
registry_enable_delete:
description: "Enable delete operations on the registry (default: false)"
required: false
default: "false"
install_only:
description: "Skips cluster creation, only install kind (default: false)"
required: false
Expand Down
12 changes: 5 additions & 7 deletions cleanup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,14 @@ set -o nounset
set -o pipefail

DEFAULT_CLUSTER_NAME=chart-testing
DEFAULT_REGISTRY_NAME=kind-registry

main() {
args=()

if [[ -n "${INPUT_CLUSTER_NAME:-}" ]]; then
args+=(--name "${INPUT_CLUSTER_NAME}")
else
args+=(--name "${DEFAULT_CLUSTER_NAME}")
fi
args=(--name "${INPUT_CLUSTER_NAME:-$DEFAULT_CLUSTER_NAME}")
registry_args=("${INPUT_REGISTRY_NAME:-$DEFAULT_REGISTRY_NAME}")

docker rm -f "${registry_args[@]}" || "${INPUT_IGNORE_FAILED_CLEAN}"

kind delete cluster "${args[@]}" || "${INPUT_IGNORE_FAILED_CLEAN}"
}

Expand Down
34 changes: 34 additions & 0 deletions kind.sh
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ Usage: $(basename "$0") <options>
-l, --verbosity info log verbosity, higher value produces more output
-k, --kubectl-version The kubectl version to use (default: $DEFAULT_KUBECTL_VERSION)
-o, --install-only Skips cluster creation, only install kind (default: false)
--with-registry Enables registry config dir for the cluster (default: false)
EOF
}
Expand All @@ -50,6 +51,8 @@ main() {
local verbosity=
local kubectl_version="${DEFAULT_KUBECTL_VERSION}"
local install_only=false
local with_registry=false
local config_with_registry_path="/etc/kind-registry/config.yaml"

parse_command_line "$@"

Expand Down Expand Up @@ -187,6 +190,14 @@ parse_command_line() {
install_only=true
fi
;;
--with-registry)
if [[ -n "${2:-}" ]]; then
with_registry="$2"
shift
else
with_registry=true
fi
;;
*)
break
;;
Expand Down Expand Up @@ -220,6 +231,20 @@ install_kubectl() {
chmod +x "${kubectl_dir}/kubectl"
}

create_config_with_registry() {
sudo mkdir -p $(dirname "$config_with_registry_path")
cat <<EOF | sudo tee "$config_with_registry_path"
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
EOF
sudo chmod a+r "$config_with_registry_path"
}

create_kind_cluster() {
echo 'Creating kind cluster...'
local args=(create cluster "--name=${cluster_name}" "--wait=${wait}")
Expand All @@ -240,6 +265,15 @@ create_kind_cluster() {
args+=("--verbosity=${verbosity}")
fi

if [[ "${with_registry}" == true ]]; then
if [[ -n "${config}" ]]; then
echo 'WARNING: when using the "config" option, you need to manually configure the registry in the provided configurations'
else
create_config_with_registry
args+=(--config "$config_with_registry_path")
fi
fi

"${kind_dir}/kind" "${args[@]}"
}

Expand Down
28 changes: 27 additions & 1 deletion main.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ set -o pipefail
SCRIPT_DIR=$(dirname -- "$(readlink -f "${BASH_SOURCE[0]}" || realpath "${BASH_SOURCE[0]}")")

main() {
args=()
local args=()
local registry_args=()

if [[ -n "${INPUT_VERSION:-}" ]]; then
args+=(--version "${INPUT_VERSION}")
Expand All @@ -41,6 +42,7 @@ main() {

if [[ -n "${INPUT_CLUSTER_NAME:-}" ]]; then
args+=(--cluster-name "${INPUT_CLUSTER_NAME}")
registry_args+=(--cluster-name "${INPUT_CLUSTER_NAME}")
fi

if [[ -n "${INPUT_WAIT:-}" ]]; then
Expand All @@ -59,7 +61,31 @@ main() {
args+=(--install-only)
fi

if [[ -n "${INPUT_REGISTRY:-}" ]]; then
args+=(--with-registry "${INPUT_REGISTRY}")
fi

if [[ -n "${INPUT_REGISTRY_IMAGE:-}" ]]; then
registry_args+=(--registry-image "${INPUT_REGISTRY_IMAGE}")
fi

if [[ -n "${INPUT_REGISTRY_NAME:-}" ]]; then
registry_args+=(--registry-name "${INPUT_REGISTRY_NAME}")
fi

if [[ -n "${INPUT_REGISTRY_PORT:-}" ]]; then
registry_args+=(--registry-port "${INPUT_REGISTRY_PORT}")
fi

if [[ -n "${INPUT_REGISTRY_ENABLE_DELETE:-}" ]]; then
registry_args+=(--enable-delete "${INPUT_REGISTRY_ENABLE_DELETE}")
fi

"${SCRIPT_DIR}/kind.sh" ${args[@]+"${args[@]}"}

if [[ "${INPUT_REGISTRY:-}" == true ]]; then
"${SCRIPT_DIR}/registry.sh" "${registry_args[@]}"
fi
}

main
Loading

0 comments on commit 9315f6b

Please sign in to comment.