Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bump the supported Go version to 1.23 #1033

Merged
merged 5 commits into from
Sep 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,7 @@ The table below shows the supported package managers and their support level in

Tool | Version |
--- |---------|
Go* | 1.20.7, 1.21.0 |
Go* | 1.20.7, 1.23.0 (no workspace vendoring support) |
Npm | 9.5.0 |
Node | 18.16.1 |
Pip | 22.3.1 |
Expand Down
12 changes: 11 additions & 1 deletion cachito/workers/pkg_managers/gomod.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,9 @@ def resolve_gomod(
go = _select_go_toolchain(Path(app_source_path, "go.mod"))
log.info(f"Using Go release: {go.release}")

# Explicitly disable toolchain telemetry for go >= 1.23
_disable_telemetry(go, run_params)

# Collect all the dependency names that are being replaced to later report which
# dependencies were replaced
deps_to_replace = set()
Expand Down Expand Up @@ -1081,7 +1084,7 @@ def _get_gomod_version(go_mod_file: Path) -> Tuple[Optional[str], Optional[str]]
def _select_go_toolchain(go_mod_file: Path) -> Go:
go = Go()
target_version = None
go_max_version = pkgver.Version("1.22")
go_max_version = pkgver.Version("1.23")
go_121_version = pkgver.Version("1.21")
go_base_version = go.version
go_mod_version_msg = "go.mod reported versions: '{}'[go], '{}'[toolchain]"
Expand Down Expand Up @@ -1135,3 +1138,10 @@ def _select_go_toolchain(go_mod_file: Path) -> Go:
# projects in the ecosystem adopt 1.21, we need a fallback to an older toolchain version.
go = Go(release="go1.20")
return go


def _disable_telemetry(go: Go, run_params: dict[str, Any]) -> None:
telemetry = go(["env", "GOTELEMETRY"], run_params).rstrip()
if telemetry and telemetry != "off":
log.debug("Disabling Go telemetry")
go(["telemetry", "off"], run_params)
51 changes: 49 additions & 2 deletions tests/test_workers/test_pkg_managers/test_gomod.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def go_mod_file(tmp_path: Path, request: pytest.FixtureRequest) -> Path:
)
@pytest.mark.parametrize("cgo_disable", [False, True])
@pytest.mark.parametrize("force_gomod_tidy", [False, True])
@mock.patch("cachito.workers.pkg_managers.gomod._disable_telemetry")
@mock.patch("cachito.workers.pkg_managers.gomod.Go.release", new_callable=mock.PropertyMock)
@mock.patch("cachito.workers.pkg_managers.gomod._get_gomod_version")
@mock.patch("cachito.workers.pkg_managers.gomod.get_golang_version")
Expand All @@ -85,6 +86,7 @@ def test_resolve_gomod(
mock_golang_version: mock.Mock,
mock_get_gomod_version: mock.Mock,
mock_go_release: mock.PropertyMock,
mock_disable_telemetry: mock.Mock,
dep_replacement: Optional[dict[str, Any]],
expected_replace: Optional[str],
cgo_disable: bool,
Expand All @@ -96,6 +98,8 @@ def test_resolve_gomod(
# Mock the tempfile.TemporaryDirectory context manager
mock_temp_dir.return_value.__enter__.return_value = str(tmp_path)

mock_disable_telemetry.return_value = None

# Mock the "subprocess.run" calls
run_side_effects = []
if dep_replacement:
Expand Down Expand Up @@ -205,6 +209,7 @@ def test_resolve_gomod(


@pytest.mark.parametrize("force_gomod_tidy", [False, True])
@mock.patch("cachito.workers.pkg_managers.gomod._disable_telemetry")
@mock.patch("cachito.workers.pkg_managers.gomod.Go.release", new_callable=mock.PropertyMock)
@mock.patch("cachito.workers.pkg_managers.gomod._get_gomod_version")
@mock.patch("cachito.workers.pkg_managers.gomod.get_golang_version")
Expand All @@ -220,6 +225,7 @@ def test_resolve_gomod_vendor_dependencies(
mock_golang_version: mock.Mock,
mock_get_gomod_version: mock.Mock,
mock_go_release: mock.PropertyMock,
mock_disable_telemetry: mock.Mock,
force_gomod_tidy: bool,
tmp_path: Path,
) -> None:
Expand All @@ -228,6 +234,8 @@ def test_resolve_gomod_vendor_dependencies(
# Mock the tempfile.TemporaryDirectory context manager
mock_temp_dir.return_value.__enter__.return_value = str(tmp_path)

mock_disable_telemetry.return_value = None

# Mock the "subprocess.run" calls
run_side_effects = []
run_side_effects.append(mock.Mock(returncode=0, stdout=None)) # go mod vendor
Expand Down Expand Up @@ -412,6 +420,7 @@ def test_set_local_modules_versions(mock_get_golang_version: mock.Mock) -> None:
)


@mock.patch("cachito.workers.pkg_managers.gomod._disable_telemetry")
@mock.patch("cachito.workers.pkg_managers.gomod.Go.release", new_callable=mock.PropertyMock)
@mock.patch("cachito.workers.pkg_managers.gomod._get_gomod_version")
@mock.patch("cachito.workers.pkg_managers.gomod.GoCacheTemporaryDirectory")
Expand All @@ -426,6 +435,7 @@ def test_resolve_gomod_strict_mode_raise_error(
mock_temp_dir: mock.Mock,
mock_get_gomod_version: mock.Mock,
mock_go_release: mock.PropertyMock,
mock_disable_telemetry: mock.Mock,
tmp_path: Path,
strict_vendor: bool,
) -> None:
Expand All @@ -439,6 +449,7 @@ def test_resolve_gomod_strict_mode_raise_error(
mock_golang_version.return_value = "v2.1.1"
mock_go_release.return_value = "go0.1.0"
mock_get_gomod_version.return_value = ("0.1.1", "0.1.2")
mock_disable_telemetry.return_value = None
mock_main_module_json = json.dumps(
{
"Path": "github.com/cachito-testing/gomod-pandemonium",
Expand Down Expand Up @@ -469,6 +480,7 @@ def test_resolve_gomod_strict_mode_raise_error(


@pytest.mark.parametrize("force_gomod_tidy", [False, True])
@mock.patch("cachito.workers.pkg_managers.gomod._disable_telemetry")
@mock.patch("cachito.workers.pkg_managers.gomod.Go.release", new_callable=mock.PropertyMock)
@mock.patch("cachito.workers.pkg_managers.gomod._get_gomod_version")
@mock.patch("cachito.workers.pkg_managers.gomod.get_golang_version")
Expand All @@ -484,6 +496,7 @@ def test_resolve_gomod_no_deps(
mock_golang_version: mock.Mock,
mock_get_gomod_version: mock.Mock,
mock_go_release: mock.PropertyMock,
mock_disable_telemetry: mock.Mock,
force_gomod_tidy: bool,
tmp_path: Path,
) -> None:
Expand Down Expand Up @@ -512,6 +525,8 @@ def test_resolve_gomod_no_deps(
# Mock the tempfile.TemporaryDirectory context manager
mock_temp_dir.return_value.__enter__.return_value = str(tmp_path)

mock_disable_telemetry.return_value = None

# Mock the "subprocess.run" calls
run_side_effects = []
run_side_effects.append(mock.Mock(returncode=0, stdout="")) # go mod download -json
Expand Down Expand Up @@ -565,6 +580,7 @@ def test_resolve_gomod_no_deps(


@pytest.mark.parametrize(("go_mod_rc", "go_list_rc"), ((0, 1), (1, 0)))
@mock.patch("cachito.workers.pkg_managers.gomod._disable_telemetry")
@mock.patch("cachito.workers.pkg_managers.gomod.Go.release", new_callable=mock.PropertyMock)
@mock.patch("cachito.workers.pkg_managers.gomod._get_gomod_version")
@mock.patch("cachito.workers.pkg_managers.gomod.GoCacheTemporaryDirectory")
Expand All @@ -576,6 +592,7 @@ def test_go_list_cmd_failure(
mock_temp_dir: mock.Mock,
mock_get_gomod_version: mock.Mock,
mock_go_release: mock.PropertyMock,
mock_disable_telemetry: mock.Mock,
tmp_path: Path,
go_mod_rc: int,
go_list_rc: int,
Expand All @@ -588,6 +605,7 @@ def test_go_list_cmd_failure(
mock_worker_config.return_value.cachito_gomod_download_max_tries = 1
mock_go_release.return_value = "go0.1.0"
mock_get_gomod_version.return_value = ("0.1.1", "0.1.2")
mock_disable_telemetry.return_value = None

# Mock the "subprocess.run" calls
mock_run.side_effect = [
Expand Down Expand Up @@ -1348,8 +1366,8 @@ def test_select_go_toolchain(
@pytest.mark.parametrize(
"unsupported_version",
[
pytest.param(("1.23.0", None), id="go_version_higher_than_max"),
pytest.param((None, "1.23.0"), id="toolchain_version_higher_than_max"),
pytest.param(("99.99.0", None), id="go_version_higher_than_max"),
pytest.param((None, "99.99.0"), id="toolchain_version_higher_than_max"),
],
)
@mock.patch("cachito.workers.pkg_managers.gomod._get_gomod_version")
Expand All @@ -1369,6 +1387,35 @@ def test_select_go_toolchain_failure(
gomod._select_go_toolchain(tmp_path / "go.mod")


@pytest.mark.parametrize(
"GOTELEMETRY, telemetry_disable",
[
pytest.param("", False, id="telemetry_not_set"),
pytest.param("off", False, id="telemetry_disabled"),
pytest.param("local", True, id="telemetry_enabled"),
],
)
@mock.patch("cachito.workers.pkg_managers.gomod.run_cmd")
def test_disable_telemetry(
mock_run: mock.Mock,
tmp_path: Path,
GOTELEMETRY: str,
telemetry_disable: bool,
) -> None:
mock_run.side_effect = [GOTELEMETRY, None]

go = gomod.Go()
cmd = [go._bin, "telemetry", "off"]
params = {"env": {"GOTOOLCHAIN": "auto"}}
gomod._disable_telemetry(go, params)

if not telemetry_disable:
assert mock_run.call_count == 1
else:
assert mock_run.call_count == 2
mock_run.assert_called_with(cmd, params)


class TestGo:
@pytest.mark.parametrize(
"bin_, params",
Expand Down