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

[Bug]: protoc-gen-validate module breaks if main repo is using newer rules_python #3291

Open
mikn opened this issue Dec 1, 2024 · 2 comments
Labels
bug Something isn't working

Comments

@mikn
Copy link

mikn commented Dec 1, 2024

What happened?

When using rules python 1.0.0-rc2 in the main repository, the module extension call to initiate the pypi repo used by the protoc-gen-validate module uses the older "name" instead of using the newer "hub_name", whilst at the same time the dependency chain resolution does not initiate its own rules_python version for protoc-gen-validate.

I tried fixing it using a patch in my root module against the MODULE.bazel of protoc-gen-validate, but it did not work, most likely because protoc-gen-validate was a transitive dependency.

Output from bazel mod tidy:

bazel mod tidy
ERROR: in tag at https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4/MODULE.bazel:64:10, unknown attribute name provided. Type 'bazel help mod' for syntax and help.

Version

Development (host) and target OS/architectures: linux, amd64

Output of bazel --version: bazel 7.4.1

Version of relevant rules from the WORKSPACE or MODULE.bazel file:
bazel_dep(name = "rules_python", version = "1.0.0-rc2")
bazel_dep(name = "protobuf", version = "29.0")
bazel_dep(name = "grpc", version = "1.68.0")
bazel_dep(name = "protoc-gen-validate", version = "1.0.4") // this is introduced as a dependency by grpc

Language(s) and/or frameworks involved: python, grpc, proto

How to reproduce

I tried to keep this as minimal as possible, it seems it is not triggered before you add an actual build target, so here it is:

MODULE.bazel

bazel_dep(name = "rules_python", version = "1.0.0-rc2")
bazel_dep(name = "protobuf", version = "29.0")
bazel_dep(name = "grpc", version = "1.68.0")

pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
    hub_name = "pypi",
    python_version = "3.11",
    requirements_lock = "//python:requirements.txt",
)
use_repo(pip, "pypi")

protos/BUILD.bazel

load("@grpc//bazel:python_rules.bzl", "python_grpc_library")
load("@protobuf//bazel:proto_library.bzl", "proto_library")
load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library")

proto_library(
    name = "greeter_proto",
    srcs = ["greeter.proto"],
    visibility = ["//visibility:public"],
)

py_proto_library(
    name = "greeter_py_proto",
    visibility = ["//visibility:public"],
    deps = [":greeter_proto"],
)

python_grpc_library(
    name = "greeter_py_grpc",
    srcs = [":greeter_proto"],
    deps = [":greeter_py_proto"],
)

protos/greeter.proto

syntax = "proto3";

package greeter;

option go_package = "github.com/molnett/the-bazel-pitch/protos/greeter";

// Greeter service provides simple greeting functionality
service Greeter {
  // Greet generates a personalized greeting for the given name
  rpc Greet(GreetRequest) returns (GreetResponse) {}
}

// GreetRequest contains the name to be greeted
message GreetRequest {
  // Name of the person to greet
  string name = 1;
}

// GreetResponse contains the greeting message
message GreetResponse {
  // The greeting message
  string message = 1;
}

python/BUILD.bazel

load("@pypi//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_binary", "py_test")

py_binary(
    name = "cli",
    srcs = ["main.py"],
    main = "main.py",
    visibility = ["//visibility:public"],
    deps = [
        "//protos:greeter_py_grpc",
        "//protos:greeter_py_proto",
        requirement("grpcio"),
        requirement("protobuf"),
    ],
)

python/main.py

import argparse
import grpc
from protos.greeter_pb2 import GreetRequest
from protos.greeter_pb2_grpc import GreeterStub

def main():
    parser = argparse.ArgumentParser(description='Greeter CLI client')
    parser.add_argument('--name', type=str, required=True, help='Name to greet')
    args = parser.parse_args()

    with grpc.insecure_channel('localhost:50051') as channel:
        stub = GreeterStub(channel)
        try:
            response = stub.Greet(GreetRequest(name=args.name))
            print(response.message)
        except grpc.RpcError as e:
            print(f"Error: {e.details()}")
            exit(1)

if __name__ == '__main__':
    main()

python/requirements.txt

grpcio==1.68.0
protobuf==5.29.0

Any other information?

I am not entirely sure where to file this bug, if it should go against the grpc repository, as they are the ones who introduce this transitive dependency, against the rules_python repository because their version compatibility setting seems wrong (it does not resolve a separate rules_python version for the protoc-gen-validate, despite my MODULE.bazel file having 1.0.0-rc2 and them having a 0.22.0 dependency) or if I should file it here? I chose here, as I suspect that this is the place easiest to fix it however.

I did fix it for now with a multiple_versions_override like this:

multiple_version_override(
    module_name = "rules_python",
    versions = [
        "1.0.0-rc2",
        "0.22.0",
    ],
)
@keith
Copy link
Member

keith commented Dec 2, 2024

to workaround this you can also do a patch like this:

single_version_override(
    module_name = "protoc-gen-validate",
    patch_strip = 1,
    patches = [
        # https://github.com/bufbuild/protoc-gen-validate/pull/1111
        "//bazel/third-party:protoc-gen-validate.patch",
    ],
)
diff --git a/MODULE.bazel b/MODULE.bazel
index 7a0a28c..b39f9ae 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -62,7 +62,8 @@ use_repo(
 
 pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
 pip.parse(
-    name = "pgv_pip_deps",
+    hub_name = "pgv_pip_deps",
+    python_version = "3.11",
     requirements_lock = "//python:requirements.txt",
 )
 use_repo(pip, "pgv_pip_deps")

As long as you have i think bazel 7.4 which allows you to patch MODULE.bazel files

@mikn
Copy link
Author

mikn commented Dec 2, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants