Skip to content

Commit 469bf8e

Browse files
youngsofunsmallfish
authored andcommitted
ci: simplify go client compat test source setup (#19791)
1 parent d0f82da commit 469bf8e

2 files changed

Lines changed: 105 additions & 18 deletions

File tree

.github/actions/test_compat_client_cluster/action.yml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@ runs:
3434
ref: main
3535
path: tests/nox/cache/databend-jdbc
3636

37-
- name: checkout databend-go
38-
uses: actions/checkout@v4
39-
with:
40-
repository: databendlabs/databend-go
41-
ref: main
42-
path: tests/nox/cache/databend-go
43-
4437
- name: checkout bendsql
4538
uses: actions/checkout@v4
4639
with:
@@ -68,4 +61,5 @@ runs:
6861
shell: bash
6962
run: nox -f tests/nox/noxfile.py -s python_client java_client go_client
7063
env:
64+
DATABEND_GO_SKIP_UP: "1"
7165
JDBC_MAIN_VER: ${{env.JDBC_MAIN_VER}}

tests/nox/noxfile.py

Lines changed: 104 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
import json
12
import os
3+
import shutil
4+
import tarfile
5+
import urllib.request
6+
from pathlib import Path
27

38
import nox
49

@@ -23,6 +28,12 @@ def python_client(session, driver_version):
2328

2429

2530
JDBC_DRIVER = ["0.4.0", "main"]
31+
GO_DRIVER_PINNED = ["v0.9.1"]
32+
GO_DRIVER = ["main", "latest", *GO_DRIVER_PINNED]
33+
GO_CLIENT_CACHE_DIR = Path(__file__).resolve().parent / "cache"
34+
GO_CLIENT_ARCHIVE_ROOT = "https://github.com/databendlabs/databend-go/archive/refs"
35+
GO_CLIENT_LATEST_RELEASE_URL = "https://github.com/databendlabs/databend-go/releases/latest"
36+
GO_CLIENT_SKIP_UP = "DATABEND_GO_SKIP_UP"
2637

2738

2839
@nox.session
@@ -58,20 +69,102 @@ def run_jdbc_test(session, driver_version, main_version):
5869
)
5970

6071

72+
def resolve_go_source_ref(source_ref):
73+
if source_ref != "latest":
74+
return source_ref
75+
76+
request = urllib.request.Request(
77+
GO_CLIENT_LATEST_RELEASE_URL,
78+
headers={"User-Agent": "databend-nox-go-client"},
79+
)
80+
with urllib.request.urlopen(request) as response:
81+
latest_url = response.geturl().rstrip("/")
82+
83+
latest_tag = latest_url.rsplit("/", 1)[-1]
84+
if not latest_tag.startswith("v"):
85+
raise RuntimeError(
86+
f"unexpected databend-go latest release redirect: {latest_url}"
87+
)
88+
89+
return latest_tag
90+
91+
92+
def get_go_archive_url(resolved_ref):
93+
archive_type = "tags" if resolved_ref.startswith("v") else "heads"
94+
return f"{GO_CLIENT_ARCHIVE_ROOT}/{archive_type}/{resolved_ref}.tar.gz"
95+
96+
97+
def get_go_driver_env(resolved_ref):
98+
env = {}
99+
if resolved_ref != "main":
100+
env["DATABEND_GO_VERSION"] = resolved_ref
101+
102+
if os.environ.get(GO_CLIENT_SKIP_UP):
103+
env[GO_CLIENT_SKIP_UP] = os.environ[GO_CLIENT_SKIP_UP]
104+
105+
return env
106+
107+
108+
def prepare_go_client_source(source_ref):
109+
resolved_ref = resolve_go_source_ref(source_ref)
110+
cache_key = source_ref.replace("/", "-")
111+
source_dir = GO_CLIENT_CACHE_DIR / f"databend-go-{cache_key}"
112+
marker_path = source_dir / ".databend-ref.json"
113+
makefile_path = source_dir / "tests" / "Makefile"
114+
115+
if source_ref != "main" and marker_path.exists() and makefile_path.exists():
116+
marker = json.loads(marker_path.read_text())
117+
if marker.get("resolved_ref") == resolved_ref:
118+
return source_dir, resolved_ref
119+
120+
shutil.rmtree(source_dir, ignore_errors=True)
121+
source_dir.mkdir(parents=True, exist_ok=True)
122+
123+
request = urllib.request.Request(
124+
get_go_archive_url(resolved_ref),
125+
headers={"User-Agent": "databend-nox-go-client"},
126+
)
127+
with urllib.request.urlopen(request) as response:
128+
with tarfile.open(fileobj=response, mode="r|gz") as archive:
129+
archive.extractall(source_dir)
130+
131+
extracted_dirs = [path for path in source_dir.iterdir() if path.is_dir()]
132+
if len(extracted_dirs) != 1:
133+
raise RuntimeError(
134+
f"expected one extracted databend-go root for {resolved_ref}, got {len(extracted_dirs)}"
135+
)
136+
137+
extracted_root = extracted_dirs[0]
138+
for child in extracted_root.iterdir():
139+
shutil.move(str(child), source_dir / child.name)
140+
extracted_root.rmdir()
141+
142+
if not makefile_path.exists():
143+
raise RuntimeError(
144+
f"missing databend-go tests/Makefile after extracting {resolved_ref}"
145+
)
146+
147+
marker_path.write_text(json.dumps({"resolved_ref": resolved_ref}) + "\n")
148+
return source_dir, resolved_ref
149+
150+
61151

62152

63153
@nox.session
64-
@nox.parametrize("driver_version", ["v100.0.0"])
65-
def go_client(session, driver_version):
66-
env = {"DATABEND_GO_VERSION": driver_version}
67-
test_dir = f"cache/databend-go/tests"
68-
with session.cd(test_dir):
69-
if os.path.exists("go.mod"):
70-
os.remove("go.mod")
71-
if driver_version == "v100.0.0":
72-
session.run("make", "-o", "up", "integration", external=True, env=env)
73-
else:
74-
session.run("make", "-o", "up", "compat", external=True, env=env)
154+
@nox.parametrize("source_ref", GO_DRIVER)
155+
def go_client(session, source_ref):
156+
source_dir, resolved_ref = prepare_go_client_source(source_ref)
157+
env = get_go_driver_env(resolved_ref)
158+
test_dir = source_dir / "tests"
159+
skip_up = os.environ.get(GO_CLIENT_SKIP_UP)
160+
make_args = ["make"]
161+
if skip_up:
162+
make_args.extend(["-o", "up"])
163+
make_args.append("integration")
164+
165+
session.log(f"running databend-go integration tests from {resolved_ref}")
166+
with session.chdir(str(test_dir)):
167+
session.run(*make_args, external=True, env=env)
75168

76169
# test API with requests directly.
77170
# some of the tests will fail with cluster behind nginx.

0 commit comments

Comments
 (0)