From 46d3064795bbf083686b458519d797271f6a0b52 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:42:29 +0000 Subject: [PATCH 01/11] Initial plan From 0880c628d91cebefdd1fbdd475490819b734649a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:45:00 +0000 Subject: [PATCH 02/11] ci: add docker-sshd end-to-end workflow check Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- .github/workflows/tests.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 88c5f8f..888cb0c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,7 +48,16 @@ jobs: go-version: '1.26.x' cache: true - - name: Run e2e smoke checks + - name: Run docker-sshd e2e check + run: | + docker run -d --rm --name docker-sshd-e2e-test alpine:3.20 sleep 300 + ssh-keygen -t ed25519 -N '' -f /tmp/docker-sshd-e2e-key > /dev/null + go run ./cmd/docker-sshd --address 127.0.0.1 --port 2232 --server-key /tmp/docker-sshd-e2e-key & + sshd_pid=$! + trap "kill ${sshd_pid} || true; docker rm -f docker-sshd-e2e-test || true" EXIT + sleep 2 + output="$(ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=none -p 2232 docker-sshd-e2e-test@127.0.0.1 echo ok 2>/dev/null)" + test "${output}" = "ok" + - name: Run kube-sshd smoke check run: | - go run ./cmd/docker-sshd --help > /dev/null go run ./cmd/kube-sshd --help > /dev/null From 5bb20da102b467fdc7779a0abf73581d99b6da2d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:47:09 +0000 Subject: [PATCH 03/11] ci: run docker-sshd e2e check in tests workflow Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- .github/workflows/tests.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 888cb0c..d8f03f1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -51,13 +51,17 @@ jobs: - name: Run docker-sshd e2e check run: | docker run -d --rm --name docker-sshd-e2e-test alpine:3.20 sleep 300 + sshd_pid="" + trap "test -n \"${sshd_pid}\" && kill ${sshd_pid} || true; docker rm -f docker-sshd-e2e-test || true" EXIT ssh-keygen -t ed25519 -N '' -f /tmp/docker-sshd-e2e-key > /dev/null go run ./cmd/docker-sshd --address 127.0.0.1 --port 2232 --server-key /tmp/docker-sshd-e2e-key & sshd_pid=$! - trap "kill ${sshd_pid} || true; docker rm -f docker-sshd-e2e-test || true" EXIT - sleep 2 - output="$(ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=none -p 2232 docker-sshd-e2e-test@127.0.0.1 echo ok 2>/dev/null)" - test "${output}" = "ok" + output="" + for _ in $(seq 1 20); do + output="$(ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=none -p 2232 docker-sshd-e2e-test@127.0.0.1 echo ok)" && break + sleep 1 + done + test "${output}" = "ok" || (echo "docker-sshd e2e failed: expected 'ok', got '${output}'" && exit 1) - name: Run kube-sshd smoke check run: | go run ./cmd/kube-sshd --help > /dev/null From 3e740adad53371cfb1427e7fd357f893f9927fd4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:54:06 +0000 Subject: [PATCH 04/11] ci: split e2e workflow and use docker compose Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- .github/e2e/docker-compose.yml | 5 ++++ .github/workflows/e2e.yml | 48 ++++++++++++++++++++++++++++++++++ .github/workflows/tests.yml | 35 ------------------------- 3 files changed, 53 insertions(+), 35 deletions(-) create mode 100644 .github/e2e/docker-compose.yml create mode 100644 .github/workflows/e2e.yml diff --git a/.github/e2e/docker-compose.yml b/.github/e2e/docker-compose.yml new file mode 100644 index 0000000..14c69f8 --- /dev/null +++ b/.github/e2e/docker-compose.yml @@ -0,0 +1,5 @@ +services: + docker-sshd-e2e-target: + image: alpine:3.20 + container_name: docker-sshd-e2e-test + command: ["sleep", "300"] diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000..b1ab67f --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,48 @@ +name: e2e + +on: + push: + tags: + - v* + branches: + - master + pull_request: + +permissions: + contents: read + +jobs: + e2e: + name: e2e + runs-on: ubuntu-latest + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@v3 + with: + fetch-depth: 0 + submodules: 'recursive' + + - name: Set up Go 1.x + uses: actions/setup-go@v4 + with: + go-version: '1.26.x' + cache: true + + - name: Run docker-sshd e2e check + run: | + docker compose -f .github/e2e/docker-compose.yml up -d + sshd_pid="" + trap "test -n \"${sshd_pid}\" && kill ${sshd_pid} || true; docker compose -f .github/e2e/docker-compose.yml down || true" EXIT + ssh-keygen -t ed25519 -N '' -f /tmp/docker-sshd-e2e-key > /dev/null + go run ./cmd/docker-sshd --address 127.0.0.1 --port 2232 --server-key /tmp/docker-sshd-e2e-key & + sshd_pid=$! + output="" + for _ in $(seq 1 20); do + output="$(ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=none -p 2232 docker-sshd-e2e-test@127.0.0.1 echo ok)" && break + sleep 1 + done + test "${output}" = "ok" || (echo "docker-sshd e2e failed: expected 'ok', got '${output}'" && exit 1) + + - name: Run kube-sshd smoke check + run: | + go run ./cmd/kube-sshd --help > /dev/null diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d8f03f1..8051dd8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -30,38 +30,3 @@ jobs: - name: Run unit tests run: go test ./... - - e2e: - name: e2e - runs-on: ubuntu-latest - needs: ut - steps: - - name: Check out code into the Go module directory - uses: actions/checkout@v3 - with: - fetch-depth: 0 - submodules: 'recursive' - - - name: Set up Go 1.x - uses: actions/setup-go@v4 - with: - go-version: '1.26.x' - cache: true - - - name: Run docker-sshd e2e check - run: | - docker run -d --rm --name docker-sshd-e2e-test alpine:3.20 sleep 300 - sshd_pid="" - trap "test -n \"${sshd_pid}\" && kill ${sshd_pid} || true; docker rm -f docker-sshd-e2e-test || true" EXIT - ssh-keygen -t ed25519 -N '' -f /tmp/docker-sshd-e2e-key > /dev/null - go run ./cmd/docker-sshd --address 127.0.0.1 --port 2232 --server-key /tmp/docker-sshd-e2e-key & - sshd_pid=$! - output="" - for _ in $(seq 1 20); do - output="$(ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=none -p 2232 docker-sshd-e2e-test@127.0.0.1 echo ok)" && break - sleep 1 - done - test "${output}" = "ok" || (echo "docker-sshd e2e failed: expected 'ok', got '${output}'" && exit 1) - - name: Run kube-sshd smoke check - run: | - go run ./cmd/kube-sshd --help > /dev/null From 9745faa7b72424a8811ce5178182d87c40e0a51f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 19:08:05 +0000 Subject: [PATCH 05/11] ci: move e2e assets and run go test based e2e Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- .github/workflows/e2e.yml | 26 +++-- e2e/Dockerfile.target | 3 + {.github/e2e => e2e}/docker-compose.yml | 5 +- e2e/e2e_test.go | 120 ++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 17 deletions(-) create mode 100644 e2e/Dockerfile.target rename {.github/e2e => e2e}/docker-compose.yml (52%) create mode 100644 e2e/e2e_test.go diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index b1ab67f..b7ba7a7 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -28,21 +28,17 @@ jobs: go-version: '1.26.x' cache: true - - name: Run docker-sshd e2e check + - name: Build test binaries run: | - docker compose -f .github/e2e/docker-compose.yml up -d - sshd_pid="" - trap "test -n \"${sshd_pid}\" && kill ${sshd_pid} || true; docker compose -f .github/e2e/docker-compose.yml down || true" EXIT - ssh-keygen -t ed25519 -N '' -f /tmp/docker-sshd-e2e-key > /dev/null - go run ./cmd/docker-sshd --address 127.0.0.1 --port 2232 --server-key /tmp/docker-sshd-e2e-key & - sshd_pid=$! - output="" - for _ in $(seq 1 20); do - output="$(ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=none -p 2232 docker-sshd-e2e-test@127.0.0.1 echo ok)" && break - sleep 1 - done - test "${output}" = "ok" || (echo "docker-sshd e2e failed: expected 'ok', got '${output}'" && exit 1) + mkdir -p /tmp/bin + go build -o /tmp/bin/docker-sshd ./cmd/docker-sshd + go build -o /tmp/bin/kube-sshd ./cmd/kube-sshd - - name: Run kube-sshd smoke check + - name: Set up kind + uses: helm/kind-action@v1.12.0 + + - name: Run e2e tests run: | - go run ./cmd/kube-sshd --help > /dev/null + docker compose -f e2e/docker-compose.yml up -d + trap "docker compose -f e2e/docker-compose.yml down || true" EXIT + DOCKER_SSHD_E2E=1 KUBE_SSHD_E2E=1 DOCKER_SSHD_BIN=/tmp/bin/docker-sshd KUBE_SSHD_BIN=/tmp/bin/kube-sshd go test ./e2e -v diff --git a/e2e/Dockerfile.target b/e2e/Dockerfile.target new file mode 100644 index 0000000..4aafe75 --- /dev/null +++ b/e2e/Dockerfile.target @@ -0,0 +1,3 @@ +FROM alpine:3.20 + +CMD ["sleep", "300"] diff --git a/.github/e2e/docker-compose.yml b/e2e/docker-compose.yml similarity index 52% rename from .github/e2e/docker-compose.yml rename to e2e/docker-compose.yml index 14c69f8..09df75b 100644 --- a/.github/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -1,5 +1,6 @@ services: docker-sshd-e2e-target: - image: alpine:3.20 + build: + context: .. + dockerfile: e2e/Dockerfile.target container_name: docker-sshd-e2e-test - command: ["sleep", "300"] diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go new file mode 100644 index 0000000..5fde10d --- /dev/null +++ b/e2e/e2e_test.go @@ -0,0 +1,120 @@ +package e2e + +import ( + "os" + "os/exec" + "strings" + "testing" + "time" +) + +func TestDockerSSHD(t *testing.T) { + if os.Getenv("DOCKER_SSHD_E2E") != "1" { + t.Skip("set DOCKER_SSHD_E2E=1 to run") + } + + bin := os.Getenv("DOCKER_SSHD_BIN") + if bin == "" { + t.Fatal("DOCKER_SSHD_BIN is required") + } + + container := os.Getenv("DOCKER_E2E_CONTAINER") + if container == "" { + container = "docker-sshd-e2e-test" + } + + key := t.TempDir() + "/docker-sshd-e2e-key" + mustRun(t, "ssh-keygen", "-t", "ed25519", "-N", "", "-f", key) + + cmd := exec.Command(bin, "--address", "127.0.0.1", "--port", "2232", "--server-key", key) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Start(); err != nil { + t.Fatalf("start docker-sshd: %v", err) + } + defer func() { + _ = cmd.Process.Kill() + _, _ = cmd.Process.Wait() + }() + + out := retrySSH(t, "2232", container+"@127.0.0.1") + if strings.TrimSpace(out) != "ok" { + t.Fatalf("expected ok, got %q", out) + } +} + +func TestKubeSSHD(t *testing.T) { + if os.Getenv("KUBE_SSHD_E2E") != "1" { + t.Skip("set KUBE_SSHD_E2E=1 to run") + } + + bin := os.Getenv("KUBE_SSHD_BIN") + if bin == "" { + t.Fatal("KUBE_SSHD_BIN is required") + } + + pod := "docker-sshd-e2e-" + time.Now().Format("150405") + mustRun(t, "kubectl", "run", pod, "--image=busybox:1.36", "--restart=Never", "--command", "--", "sleep", "300") + defer run(t, "kubectl", "delete", "pod", pod, "--ignore-not-found=true", "--wait=false") + mustRun(t, "kubectl", "wait", "--for=condition=Ready", "pod/"+pod, "--timeout=120s") + + key := t.TempDir() + "/kube-sshd-e2e-key" + mustRun(t, "ssh-keygen", "-t", "ed25519", "-N", "", "-f", key) + + cmd := exec.Command(bin, "--address", "127.0.0.1", "--port", "2233", "--server-key", key, "--namespace", "default") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Start(); err != nil { + t.Fatalf("start kube-sshd: %v", err) + } + defer func() { + _ = cmd.Process.Kill() + _, _ = cmd.Process.Wait() + }() + + out := retrySSH(t, "2233", pod+"@127.0.0.1") + if strings.TrimSpace(out) != "ok" { + t.Fatalf("expected ok, got %q", out) + } +} + +func retrySSH(t *testing.T, port, userHost string) string { + t.Helper() + + var out string + var err error + for range 30 { + out, err = run(t, + "ssh", + "-o", "StrictHostKeyChecking=no", + "-o", "UserKnownHostsFile=/dev/null", + "-o", "PreferredAuthentications=none", + "-p", port, + userHost, + "echo", "ok", + ) + if err == nil { + return out + } + time.Sleep(time.Second) + } + + t.Fatalf("ssh did not succeed: %v", err) + return "" +} + +func mustRun(t *testing.T, name string, args ...string) string { + t.Helper() + out, err := run(t, name, args...) + if err != nil { + t.Fatalf("%s %v failed: %v\n%s", name, args, err, out) + } + return out +} + +func run(t *testing.T, name string, args ...string) (string, error) { + t.Helper() + cmd := exec.Command(name, args...) + out, err := cmd.CombinedOutput() + return string(out), err +} From ce1f432797b0f81cac9f98d1ed8470f99ed947e7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 19:10:07 +0000 Subject: [PATCH 06/11] test: add go-test driven docker and kube e2e coverage Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- e2e/e2e_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 5fde10d..ec78a8a 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -53,7 +53,8 @@ func TestKubeSSHD(t *testing.T) { t.Fatal("KUBE_SSHD_BIN is required") } - pod := "docker-sshd-e2e-" + time.Now().Format("150405") + pod := "kube-sshd-e2e-" + strings.ToLower(time.Now().Format("150405.000000000")) + pod = strings.ReplaceAll(pod, ".", "-") mustRun(t, "kubectl", "run", pod, "--image=busybox:1.36", "--restart=Never", "--command", "--", "sleep", "300") defer run(t, "kubectl", "delete", "pod", pod, "--ignore-not-found=true", "--wait=false") mustRun(t, "kubectl", "wait", "--for=condition=Ready", "pod/"+pod, "--timeout=120s") From 6d0c2c16a3b8d6d7caebba25ba3694561ad5bed7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 19:19:17 +0000 Subject: [PATCH 07/11] ci: run go build and go test inside compose e2e runner Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- .github/workflows/e2e.yml | 19 ++++--------------- e2e/Dockerfile.testrunner | 5 +++++ e2e/docker-compose.yml | 27 +++++++++++++++++++++++++++ e2e/e2e_test.go | 13 +++++++++++-- 4 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 e2e/Dockerfile.testrunner diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index b7ba7a7..ad7e38e 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -22,23 +22,12 @@ jobs: fetch-depth: 0 submodules: 'recursive' - - name: Set up Go 1.x - uses: actions/setup-go@v4 - with: - go-version: '1.26.x' - cache: true - - - name: Build test binaries - run: | - mkdir -p /tmp/bin - go build -o /tmp/bin/docker-sshd ./cmd/docker-sshd - go build -o /tmp/bin/kube-sshd ./cmd/kube-sshd - - name: Set up kind uses: helm/kind-action@v1.12.0 - - name: Run e2e tests + - name: Run e2e tests in docker compose runner run: | - docker compose -f e2e/docker-compose.yml up -d + export KUBECONFIG=/home/runner/.kube/config + docker compose -f e2e/docker-compose.yml up -d docker-sshd-e2e-target trap "docker compose -f e2e/docker-compose.yml down || true" EXIT - DOCKER_SSHD_E2E=1 KUBE_SSHD_E2E=1 DOCKER_SSHD_BIN=/tmp/bin/docker-sshd KUBE_SSHD_BIN=/tmp/bin/kube-sshd go test ./e2e -v + docker compose -f e2e/docker-compose.yml run --rm e2e-runner diff --git a/e2e/Dockerfile.testrunner b/e2e/Dockerfile.testrunner new file mode 100644 index 0000000..b6fc3ee --- /dev/null +++ b/e2e/Dockerfile.testrunner @@ -0,0 +1,5 @@ +FROM golang:1.26 + +RUN apt-get update && apt-get install -y --no-install-recommends openssh-client curl ca-certificates && rm -rf /var/lib/apt/lists/* \ + && curl -fsSL https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl \ + && chmod +x /usr/local/bin/kubectl diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 09df75b..0935aca 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -4,3 +4,30 @@ services: context: .. dockerfile: e2e/Dockerfile.target container_name: docker-sshd-e2e-test + e2e-runner: + build: + context: .. + dockerfile: e2e/Dockerfile.testrunner + depends_on: + - docker-sshd-e2e-target + network_mode: host + working_dir: /src + environment: + - KUBECONFIG=/root/.kube/config + volumes: + - ..:/src + - /var/run/docker.sock:/var/run/docker.sock + - ${KUBECONFIG:-/tmp/invalid-kubeconfig-path}:/root/.kube/config:ro + command: + - /bin/sh + - -ec + - | + export GOFLAGS=-buildvcs=false + mkdir -p /tmp/bin + go build -o /tmp/bin/docker-sshd ./cmd/docker-sshd + go build -o /tmp/bin/kube-sshd ./cmd/kube-sshd + DOCKER_SSHD_E2E=$${DOCKER_SSHD_E2E:-1} \ + KUBE_SSHD_E2E=$${KUBE_SSHD_E2E:-1} \ + DOCKER_SSHD_BIN=/tmp/bin/docker-sshd \ + KUBE_SSHD_BIN=/tmp/bin/kube-sshd \ + go test ./e2e -v diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index ec78a8a..c1d8047 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -38,7 +38,7 @@ func TestDockerSSHD(t *testing.T) { }() out := retrySSH(t, "2232", container+"@127.0.0.1") - if strings.TrimSpace(out) != "ok" { + if !hasOKLine(out) { t.Fatalf("expected ok, got %q", out) } } @@ -74,11 +74,20 @@ func TestKubeSSHD(t *testing.T) { }() out := retrySSH(t, "2233", pod+"@127.0.0.1") - if strings.TrimSpace(out) != "ok" { + if !hasOKLine(out) { t.Fatalf("expected ok, got %q", out) } } +func hasOKLine(out string) bool { + for _, line := range strings.Split(out, "\n") { + if strings.TrimSpace(line) == "ok" { + return true + } + } + return false +} + func retrySSH(t *testing.T, port, userHost string) string { t.Helper() From 0ceed77358a8f8cb13e81b04a8a36f602f6573b3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 19:29:24 +0000 Subject: [PATCH 08/11] ci: inline docker e2e target command in compose Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- e2e/Dockerfile.target | 3 --- e2e/docker-compose.yml | 5 ++--- 2 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 e2e/Dockerfile.target diff --git a/e2e/Dockerfile.target b/e2e/Dockerfile.target deleted file mode 100644 index 4aafe75..0000000 --- a/e2e/Dockerfile.target +++ /dev/null @@ -1,3 +0,0 @@ -FROM alpine:3.20 - -CMD ["sleep", "300"] diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 0935aca..9543420 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -1,9 +1,8 @@ services: docker-sshd-e2e-target: - build: - context: .. - dockerfile: e2e/Dockerfile.target + image: alpine:3.20 container_name: docker-sshd-e2e-test + command: ["sleep", "300"] e2e-runner: build: context: .. From a5a1d8cf4e82705f09067625c00a8f6256d15d88 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 19:34:56 +0000 Subject: [PATCH 09/11] test: handle kube e2e cleanup error to satisfy lint Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- e2e/e2e_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index c1d8047..718278e 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -56,7 +56,11 @@ func TestKubeSSHD(t *testing.T) { pod := "kube-sshd-e2e-" + strings.ToLower(time.Now().Format("150405.000000000")) pod = strings.ReplaceAll(pod, ".", "-") mustRun(t, "kubectl", "run", pod, "--image=busybox:1.36", "--restart=Never", "--command", "--", "sleep", "300") - defer run(t, "kubectl", "delete", "pod", pod, "--ignore-not-found=true", "--wait=false") + defer func() { + if out, err := run(t, "kubectl", "delete", "pod", pod, "--ignore-not-found=true", "--wait=false"); err != nil { + t.Logf("cleanup pod %s failed: %v\n%s", pod, err, out) + } + }() mustRun(t, "kubectl", "wait", "--for=condition=Ready", "pod/"+pod, "--timeout=120s") key := t.TempDir() + "/kube-sshd-e2e-key" From 68cb597c20a7a6d54e186d6face7389ec3353be4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 22:47:58 +0000 Subject: [PATCH 10/11] ci: set up kind inside compose e2e runner Co-authored-by: tg123 <170430+tg123@users.noreply.github.com> --- .github/workflows/e2e.yml | 4 ---- e2e/Dockerfile.testrunner | 3 ++- e2e/docker-compose.yml | 10 +++++++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index ad7e38e..47a1cac 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -22,12 +22,8 @@ jobs: fetch-depth: 0 submodules: 'recursive' - - name: Set up kind - uses: helm/kind-action@v1.12.0 - - name: Run e2e tests in docker compose runner run: | - export KUBECONFIG=/home/runner/.kube/config docker compose -f e2e/docker-compose.yml up -d docker-sshd-e2e-target trap "docker compose -f e2e/docker-compose.yml down || true" EXIT docker compose -f e2e/docker-compose.yml run --rm e2e-runner diff --git a/e2e/Dockerfile.testrunner b/e2e/Dockerfile.testrunner index b6fc3ee..695dc09 100644 --- a/e2e/Dockerfile.testrunner +++ b/e2e/Dockerfile.testrunner @@ -1,5 +1,6 @@ FROM golang:1.26 -RUN apt-get update && apt-get install -y --no-install-recommends openssh-client curl ca-certificates && rm -rf /var/lib/apt/lists/* \ +RUN apt-get update && apt-get install -y --no-install-recommends openssh-client curl ca-certificates docker.io && rm -rf /var/lib/apt/lists/* \ && curl -fsSL https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl \ + && GOBIN=/usr/local/bin go install sigs.k8s.io/kind@v0.30.0 \ && chmod +x /usr/local/bin/kubectl diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 9543420..db06588 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -9,7 +9,7 @@ services: dockerfile: e2e/Dockerfile.testrunner depends_on: - docker-sshd-e2e-target - network_mode: host + privileged: true working_dir: /src environment: - KUBECONFIG=/root/.kube/config @@ -25,8 +25,16 @@ services: mkdir -p /tmp/bin go build -o /tmp/bin/docker-sshd ./cmd/docker-sshd go build -o /tmp/bin/kube-sshd ./cmd/kube-sshd + if [ "$${KUBE_SSHD_E2E:-1}" = "1" ]; then + kind get clusters | grep -qx docker-sshd-e2e || kind create cluster --name docker-sshd-e2e + kind export kubeconfig --name docker-sshd-e2e --internal + kubectl wait --for=condition=Ready pod -n kube-system --all --timeout=2m + fi DOCKER_SSHD_E2E=$${DOCKER_SSHD_E2E:-1} \ KUBE_SSHD_E2E=$${KUBE_SSHD_E2E:-1} \ DOCKER_SSHD_BIN=/tmp/bin/docker-sshd \ KUBE_SSHD_BIN=/tmp/bin/kube-sshd \ go test ./e2e -v + if [ "$${KUBE_SSHD_E2E:-1}" = "1" ]; then + kind delete cluster --name docker-sshd-e2e || true + fi From da206ac04ab8322b38a818dd2ff1b77d7f0992aa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Jun 2026 07:21:26 +0000 Subject: [PATCH 11/11] Apply remaining changes --- e2e/Dockerfile.testrunner | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/Dockerfile.testrunner b/e2e/Dockerfile.testrunner index 695dc09..270f979 100644 --- a/e2e/Dockerfile.testrunner +++ b/e2e/Dockerfile.testrunner @@ -1,6 +1,6 @@ FROM golang:1.26 -RUN apt-get update && apt-get install -y --no-install-recommends openssh-client curl ca-certificates docker.io && rm -rf /var/lib/apt/lists/* \ +RUN apt-get update && apt-get install -y --no-install-recommends openssh-client curl ca-certificates docker-cli && rm -rf /var/lib/apt/lists/* \ && curl -fsSL https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl \ && GOBIN=/usr/local/bin go install sigs.k8s.io/kind@v0.30.0 \ && chmod +x /usr/local/bin/kubectl