一次 Git 将 jar 误认为文本文件自动替换换行符引发的血案
早上起来 Renovate 提 PR 帮我把 Gradle 更新到了 8.5, 我并没有看为什么 CI 报错直接合了, 毕竟 Gradle 从 8.4 更新到 8.5 大概率不会出现什么大问题可以合了之后再改, 只不过,:

报错的详情为 Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain, 因此大概率是运行 ./gradlew 时, ./gradle/wrapper/gradle-wrapper.jar 有问题. 果然拉回本地后, 第一次 ./gradlew 报了同样的错, 删除 ./gradlew, ./gradlew.bat, ./gradle/wrapper/gradle-wrapper.jar 之后运行 gradle wrapper --gradle-version 8.5 --distribution-type all 后再次运行 ./gradlew 就可以了. 果断 add, commit 再 push, 于是再次报了 Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain.
之后尝试了很多, 包括 revert 前面升级 actions/setup-java 的 commit, 去掉 actions.yml 中保留 Gradle 缓存的步骤等. 但唯一有效的是 revert 升级 Gradle 的 commit.
机缘巧合下, 在 actions 中添加 gradle/wrapper-validation-action 后, 报错为 ./gradle/wrapper/gradle-wrapper.jar 的 sha256 的校验和为 c7b7b1c 开头而非预期的 d3b261c 开头 (可以再这里找到 Gradle 各版本 bin, all 和 wrapper jar 的 sha256 checksum), 但我本地的校验和又是正确的. 于是删除本地重新拉远程, 发现远程的校验和确实是错误的, 于是又重新拉 Gradle wrapper, 本地确认 sha256 校验和无误后 commit 上传, 但 CI 仍然报错误校验和. 但发现在 commit 的时候报了这个警告: warning: CRLF will be replaced by LF in gradle/wrapper/gradle-wrapper.jar. 校验和对不上的原因算是找到了, 于是在 .gitattributes 中添加 *.jar -text 规则, 再重新拉 Gradle wrapper commit push 就正常了.
咱也不知道为啥 Git 把 gradle-wrapper.jar 认成了文本文件修改其换行符, 不过以后 gradle/wrapper-validation-action 和 *.jar -txt 大概会在我的 Actions 和 .gitattributes 中常驻了…