From 57c53bc7c036047cab57e2358907033adb695c9b Mon Sep 17 00:00:00 2001 From: Ted Kim Date: Tue, 9 Jun 2026 12:57:35 -0400 Subject: [PATCH 1/6] chore: init From b4204f22df0d8078b8ae0215cb53faedc70be200 Mon Sep 17 00:00:00 2001 From: Ted Kim Date: Tue, 9 Jun 2026 12:52:46 -0400 Subject: [PATCH 2/6] feat: default local mode to local image tag --- internal/cmd/localmode/localmode.go | 2 +- .../localmode/assets/docker-compose.template.yml | 2 +- internal/localmode/compose_test.go | 12 ++++++------ internal/localmode/service.go | 2 +- internal/localmode/start_test.go | 4 ++-- tests/e2e/localmode/localmode_test.go | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/cmd/localmode/localmode.go b/internal/cmd/localmode/localmode.go index 154108b..cd9a464 100644 --- a/internal/cmd/localmode/localmode.go +++ b/internal/cmd/localmode/localmode.go @@ -16,7 +16,7 @@ func NewStart(deps cliruntime.Deps) *cobra.Command { Long: `Start PostgreSQL, Redis, and the Volcano local-mode server with Docker Compose. To override the server image, set VOLCANO_IMAGE: - VOLCANO_IMAGE=kong/volcano:nightly volcano start`, + VOLCANO_IMAGE=kong/volcano:local-nightly volcano start`, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { return localmodecore.NewService(deps).Start(cmd.Context(), cmd.OutOrStdout()) diff --git a/internal/localmode/assets/docker-compose.template.yml b/internal/localmode/assets/docker-compose.template.yml index 9d7a3f3..d105c28 100644 --- a/internal/localmode/assets/docker-compose.template.yml +++ b/internal/localmode/assets/docker-compose.template.yml @@ -37,7 +37,7 @@ services: retries: 5 server: - image: ${VOLCANO_IMAGE:-kong/volcano:latest} + image: ${VOLCANO_IMAGE:-kong/volcano:local-nightly} container_name: volcano-server depends_on: postgres: diff --git a/internal/localmode/compose_test.go b/internal/localmode/compose_test.go index 11c3f36..bf3e925 100644 --- a/internal/localmode/compose_test.go +++ b/internal/localmode/compose_test.go @@ -37,7 +37,7 @@ func TestComposeEnvironmentPrefersProcessImageOverDotEnvImage(t *testing.T) { cliruntime.Deps{}, WithEnvironment(func() []string { return []string{"PATH=/bin"} }, func(key string) string { if key == "VOLCANO_IMAGE" { - return "kong/volcano:nightly" + return "kong/volcano:local-nightly" } return "" }), @@ -46,10 +46,10 @@ func TestComposeEnvironmentPrefersProcessImageOverDotEnvImage(t *testing.T) { env, image, err := service.composeEnvironment() require.NoError(t, err) - assert.Equal(t, "kong/volcano:nightly", image) + assert.Equal(t, "kong/volcano:local-nightly", image) actual, ok := lastEnvValue(env, "VOLCANO_IMAGE") require.True(t, ok) - assert.Equal(t, "kong/volcano:nightly", actual) + assert.Equal(t, "kong/volcano:local-nightly", actual) } func TestComposeEnvironmentKeepsSingleResolvedVolcanoImage(t *testing.T) { @@ -62,7 +62,7 @@ func TestComposeEnvironmentKeepsSingleResolvedVolcanoImage(t *testing.T) { return []string{"PATH=/bin", "VOLCANO_IMAGE=kong/volcano:from-environ"} }, func(key string) string { if key == "VOLCANO_IMAGE" { - return "kong/volcano:nightly" + return "kong/volcano:local-nightly" } return "" }), @@ -71,8 +71,8 @@ func TestComposeEnvironmentKeepsSingleResolvedVolcanoImage(t *testing.T) { env, image, err := service.composeEnvironment() require.NoError(t, err) - assert.Equal(t, "kong/volcano:nightly", image) - assert.Equal(t, []string{"kong/volcano:nightly"}, envValues(env, "VOLCANO_IMAGE")) + assert.Equal(t, "kong/volcano:local-nightly", image) + assert.Equal(t, []string{"kong/volcano:local-nightly"}, envValues(env, "VOLCANO_IMAGE")) } func TestComposeEnvironmentDefaultsVolcanoImage(t *testing.T) { diff --git a/internal/localmode/service.go b/internal/localmode/service.go index 0455a95..f9a71d1 100644 --- a/internal/localmode/service.go +++ b/internal/localmode/service.go @@ -17,7 +17,7 @@ import ( const ( composeProjectName = "volcano" redisContainerName = "volcano-redis" - defaultVolcanoImage = "kong/volcano:nightly" + defaultVolcanoImage = "kong/volcano:local-nightly" defaultLocalAPIURL = "http://localhost:8000" postgresAddress = "localhost:8002" diff --git a/internal/localmode/start_test.go b/internal/localmode/start_test.go index 05dbf4d..27512bf 100644 --- a/internal/localmode/start_test.go +++ b/internal/localmode/start_test.go @@ -80,7 +80,7 @@ func TestStartCreatesStackPersistsMetadataAndDefaultDatabase(t *testing.T) { started = true image, ok := lastEnvValue(command.Env, "VOLCANO_IMAGE") require.True(t, ok) - assert.Equal(t, "kong/volcano:nightly", image) + assert.Equal(t, "kong/volcano:local-nightly", image) assert.Contains(t, command.Env, "VOLCANO_LOG_LEVEL=debug") assert.Contains(t, command.Env, "QUOTED=value") assert.Contains(t, command.Env, "INLINE=kept") @@ -104,7 +104,7 @@ func TestStartCreatesStackPersistsMetadataAndDefaultDatabase(t *testing.T) { WithDialTCP(func(context.Context, string) error { return nil }), WithEnvironment(func() []string { return []string{"PATH=/bin"} }, func(key string) string { if key == "VOLCANO_IMAGE" { - return "kong/volcano:nightly" + return "kong/volcano:local-nightly" } return "" }), diff --git a/tests/e2e/localmode/localmode_test.go b/tests/e2e/localmode/localmode_test.go index abc459f..7d6d604 100644 --- a/tests/e2e/localmode/localmode_test.go +++ b/tests/e2e/localmode/localmode_test.go @@ -164,7 +164,7 @@ func localModeE2EEnv(t *testing.T) []string { "VOLCANO_FIRST_PARTY_DEVICE_CLIENT_ID=", ) if os.Getenv("VOLCANO_IMAGE") == "" { - env = append(env, "VOLCANO_IMAGE=kong/volcano:nightly") + env = append(env, "VOLCANO_IMAGE=kong/volcano:local-nightly") } return env } From 8ad06f35b5ede1d5e64ecbf37a0f96ea09c99698 Mon Sep 17 00:00:00 2001 From: Ted Kim Date: Tue, 9 Jun 2026 13:55:54 -0400 Subject: [PATCH 3/6] ci: use local image tag for localmode smoke --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 0909e8f..a4968a9 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -35,5 +35,5 @@ jobs: cache: true - name: Run local-mode CLI contract smoke env: - VOLCANO_IMAGE: kong/volcano:nightly@sha256:1c57519c86ac156fcc7a6464c9eb6a6812795d8d438306d2a89efe486e523399 + VOLCANO_IMAGE: kong/volcano:local-nightly run: make localmode-e2e From 513966b8934ae3f672470d7c86f353a2e630bf09 Mon Sep 17 00:00:00 2001 From: Ted Kim Date: Wed, 10 Jun 2026 10:53:32 -0400 Subject: [PATCH 4/6] ci: keep localmode smoke on published image --- .github/workflows/check.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index a4968a9..6b0bdeb 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -35,5 +35,7 @@ jobs: cache: true - name: Run local-mode CLI contract smoke env: - VOLCANO_IMAGE: kong/volcano:local-nightly + # Keep CI pinned to the last published local-compatible image until + # volcano-hosting publishes kong/volcano:local-nightly. + VOLCANO_IMAGE: kong/volcano:nightly@sha256:1c57519c86ac156fcc7a6464c9eb6a6812795d8d438306d2a89efe486e523399 run: make localmode-e2e From c000115f41bfdc00c1fb412de099beafde50dc5e Mon Sep 17 00:00:00 2001 From: Ted Kim Date: Wed, 10 Jun 2026 11:39:16 -0400 Subject: [PATCH 5/6] test: satisfy gofumpt in auth tests --- internal/auth/auth_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/auth/auth_test.go b/internal/auth/auth_test.go index 0557804..416dc4b 100644 --- a/internal/auth/auth_test.go +++ b/internal/auth/auth_test.go @@ -19,7 +19,9 @@ import ( cliruntime "github.com/Kong/volcano-cli/internal/runtime" ) -const authAlphaProjectID = "11111111-1111-4111-8111-111111111111" +const ( + authAlphaProjectID = "11111111-1111-4111-8111-111111111111" +) func TestLoginWithTokenSuccess(t *testing.T) { cfg := testAuthConfig(t) From 2960f9aad42950db3db8cf00edb2eb3d78b0ac23 Mon Sep 17 00:00:00 2001 From: Ted Kim Date: Wed, 10 Jun 2026 11:48:30 -0400 Subject: [PATCH 6/6] fix: clarify local image selection and require local tag in CI --- .github/workflows/check.yml | 8 +++++--- internal/cmd/localmode/localmode.go | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 6b0bdeb..5314837 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -33,9 +33,11 @@ jobs: with: go-version-file: go.mod cache: true + - name: Verify local-mode image exists + run: | + set -euo pipefail + docker manifest inspect kong/volcano:local-nightly >/dev/null - name: Run local-mode CLI contract smoke env: - # Keep CI pinned to the last published local-compatible image until - # volcano-hosting publishes kong/volcano:local-nightly. - VOLCANO_IMAGE: kong/volcano:nightly@sha256:1c57519c86ac156fcc7a6464c9eb6a6812795d8d438306d2a89efe486e523399 + VOLCANO_IMAGE: kong/volcano:local-nightly run: make localmode-e2e diff --git a/internal/cmd/localmode/localmode.go b/internal/cmd/localmode/localmode.go index cd9a464..7f23459 100644 --- a/internal/cmd/localmode/localmode.go +++ b/internal/cmd/localmode/localmode.go @@ -15,7 +15,7 @@ func NewStart(deps cliruntime.Deps) *cobra.Command { Short: "Start the local Volcano development environment", Long: `Start PostgreSQL, Redis, and the Volcano local-mode server with Docker Compose. -To override the server image, set VOLCANO_IMAGE: +To pin or select a specific server image, set VOLCANO_IMAGE: VOLCANO_IMAGE=kong/volcano:local-nightly volcano start`, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error {