Simplify CI

This commit is contained in:
Fangliding
2026-10-28 00:36:54 +08:00
parent f45f546654
commit a1be7c52f3
2 changed files with 59 additions and 52 deletions
+3 -37
View File
@@ -35,43 +35,7 @@ jobs:
if: steps.check-assets.outputs.missing == 'true' if: steps.check-assets.outputs.missing == 'true'
run: sleep 90 run: sleep 90
check-proto: check-format-and-proto:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
steps:
- name: Checkout codebase
uses: actions/checkout@v7
- name: Set up Go
uses: actions/setup-go@v7
with:
go-version-file: go.mod
- name: Cache protoc
id: cache-protoc
uses: actions/cache@v6
with:
path: ${{ runner.temp }}/protoc
key: protoc-linux-x86_64-33.5
- name: Download protoc
if: steps.cache-protoc.outputs.cache-hit != 'true'
working-directory: ${{ runner.temp }}
run: |
curl -fsSL --retry 3 -o protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v33.5/protoc-33.5-linux-x86_64.zip
unzip -q protoc.zip -d protoc
- name: Install pinned protobuf tools
run: |
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.36.11
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.6.0
- name: Check generated protobuf files
run: |
export PATH="$RUNNER_TEMP/protoc/bin:$PATH"
# Remove old outputs so orphaned pb files are also detected.
git ls-files -z -- '*.pb.go' | xargs -0 -r rm --
go run ./infra/vprotogen
# Include newly generated files in the diff without committing.
git add --intent-to-add --force -- '*.pb.go'
git diff --exit-code HEAD -- '*.pb.go'
check-format:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
permissions: permissions:
@@ -87,6 +51,8 @@ jobs:
cache: false cache: false
- name: Check Format - name: Check Format
run: go run ./infra/vformat/main.go -mode check -pwd ./ run: go run ./infra/vformat/main.go -mode check -pwd ./
- name: Check Protobuf
run: go run ./infra/vprotogen/main.go -mode check -pwd ./
test: test:
needs: check-assets needs: check-assets
+45 -4
View File
@@ -19,7 +19,10 @@ import (
"google.golang.org/protobuf/types/pluginpb" "google.golang.org/protobuf/types/pluginpb"
) )
var directory = flag.String("pwd", "", "Working directory of Xray vprotogen.") var (
directory = flag.String("pwd", "", "Working directory of Xray vprotogen.")
mode = flag.String("mode", "generate", "Execution mode. 'generate' (default) compiles and saves changes. 'check' reports out-of-date files and exits with non-zero.")
)
// topoSort sorts file descriptors so each dependency appears before files importing it. // topoSort sorts file descriptors so each dependency appears before files importing it.
func topoSort(files []protoreflect.FileDescriptor) []*descriptorpb.FileDescriptorProto { func topoSort(files []protoreflect.FileDescriptor) []*descriptorpb.FileDescriptorProto {
@@ -98,6 +101,21 @@ func main() {
} }
pwd := *directory pwd := *directory
isCheck := false
switch *mode {
case "generate", "":
isCheck = false
case "check":
isCheck = true
default:
fmt.Fprintf(os.Stderr, "Unrecognized 'mode': %s. Use 'generate' or 'check'.\n", *mode)
os.Exit(1)
}
if isCheck {
fmt.Println("Checking for out-of-date Protobuf generated files...")
}
var protoFiles []string var protoFiles []string
err := filepath.WalkDir(pwd, func(path string, d fs.DirEntry, err error) error { err := filepath.WalkDir(pwd, func(path string, d fs.DirEntry, err error) error {
if err != nil || d.IsDir() { if err != nil || d.IsDir() {
@@ -147,6 +165,7 @@ func main() {
}, },
} }
var diffCount int
for _, plugin := range []string{"protoc-gen-go", "protoc-gen-go-grpc"} { for _, plugin := range []string{"protoc-gen-go", "protoc-gen-go-grpc"} {
resp, err := runPlugin(plugin, pwd, req) resp, err := runPlugin(plugin, pwd, req)
if err != nil { if err != nil {
@@ -158,14 +177,26 @@ func main() {
targetPath := filepath.Join(pwd, filepath.FromSlash(f.GetName())) targetPath := filepath.Join(pwd, filepath.FromSlash(f.GetName()))
content := []byte(f.GetContent()) content := []byte(f.GetContent())
if existing, err := os.ReadFile(targetPath); err == nil { hasDiff := false
existing, err := os.ReadFile(targetPath)
if err != nil {
hasDiff = true
} else {
oldNorm := bytes.ReplaceAll(existing, []byte("\r\n"), []byte("\n")) oldNorm := bytes.ReplaceAll(existing, []byte("\r\n"), []byte("\n"))
newNorm := bytes.ReplaceAll(content, []byte("\r\n"), []byte("\n")) newNorm := bytes.ReplaceAll(content, []byte("\r\n"), []byte("\n"))
if bytes.Equal(oldNorm, newNorm) { if !bytes.Equal(oldNorm, newNorm) {
continue hasDiff = true
} }
} }
if hasDiff {
diffCount++
fmt.Println(targetPath)
if isCheck {
continue
}
if err := os.MkdirAll(filepath.Dir(targetPath), 0o755); err != nil { if err := os.MkdirAll(filepath.Dir(targetPath), 0o755); err != nil {
fmt.Fprintf(os.Stderr, "Error creating directory: %v\n", err) fmt.Fprintf(os.Stderr, "Error creating directory: %v\n", err)
os.Exit(1) os.Exit(1)
@@ -181,3 +212,13 @@ func main() {
} }
} }
} }
if isCheck {
if diffCount > 0 {
fmt.Println("Protobuf generated file problem(s) found.")
fmt.Println("Please run 'go run ./infra/vprotogen' to regenerate them.")
os.Exit(1)
}
fmt.Println("All Protobuf generated file check has been passed.")
}
}