로컬에서 lint 검사 까지 마치고 서버로 push 했는데, 로컬에서 보이지 않았던 "redundant referece" 경고가 뜨면서 clippy를 수행하는 Rust용 CI가 실패 했다. 현재 프로젝트에서 Rust용 CI는 경고만 떠도 실패로 간주하는 -D warnings 파라미터를 설정하고 있는데 이것 때문에 CI 전체가 실패하는 문제가 생겼다.

로컬과의 차이점을 살펴 보니, local에서는 Cargo 1.94.1 버전을 사용하는데 반해, CI 서버에는 stable latest를 사용하도록 설정해 두어서 2026년 7월 현재 가장 최신 안정버전인 1.97.1을 사용하고 있었다.
이 버전에는 useless_borrow_in_formatting이라는 새로운 lint 항목이 추가 되었는데, 이것은 이미 reference인 변수에 중복해서 borrowing을 시도하는 경우 경고를 띄우는 검사항목이다.
문제가 발생하는 코드는 proto 파일로 부터 자동으로 serde Serialize / Deserialize 항목을 생성해 주는 pbjson이 만든 것으로, clippy는 원래 다른 모듈에 의해 생성되는 코드는 검사하지 않아야 하지만, 이 결과물을 include!() 매크로에 의해 현재 코드에 포함하기 때문에 clippy의 눈에 띄어서 문제가 되고 있는 것이다.
pub(crate) mod <모듈 이름> {
// Include gRPC proto file.
tonic::include_proto!("<proto 패키지 이름>");
// Include pbjson-generated Serialize/Deserialize impls for the same type.
include!(concat!(env!("OUT_DIR"), "/<생성된 proto 패키지 serde 파일>"));
}
혹시나 이 문제에 대한 pbjon의 해결 패치가 있을까 해서 찾아 봤더니 2025년 12월 이후로는 버전 태그가 없었다.
결국 이 문제는 해결 하려면 3가지 정도의 해결 방법 있을 텐데,
- CI의 버전을 stable latest가 이닌 로컬 버전과 같은
1.94.1로 고정한다. - 경고를 출력하더라도 실패로 보고 하지 않도록 clippy의
-D warning파라미터를 제거한다. - 경고를 출력하지 않도록 surpress한다.
이 중 3번을 적용하되 전체 범위가 아닌 include!() 구문에만 적용되도록 했다.
#[allow(unknown_lints)]
#[allow(clippy::useless_borrows_in_formatting)]
pub(crate) mod <모듈 이름> {
// Include gRPC proto file.
tonic::include_proto!("<proto 패키지 이름>");
// Include pbjson-generated Serialize/Deserialize impls for the same type.
include!(concat!(env!("OUT_DIR"), "/<생성된 proto 패키지 serde 파일>"));
}
#[allow(unknown_lints)]는 현재 버전의 clippy가 이해하지 못하는 lint feature가 있더라도 경고를 출력하지 말라는 의미이고, #[allow(clippy::useless_borrows_in_formatting)]가 바로 중복된 referrence를 발견하면 경고를 띄우는 해당 lint를 무시하도록 하는 디렉티브이다.