Skip to content

Commit 3921f08

Browse files
authored
Merge pull request github#332 from xenoscopic/validation-disk-space
ci: add clean task and update validation script to use it
2 parents e2887a8 + 16d8014 commit 3921f08

File tree

3 files changed

+125
-18
lines changed

3 files changed

+125
-18
lines changed

Taskfile.yml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,33 @@ tasks:
44
create:
55
desc: Create a new mcp server definition
66
cmd: go run ./cmd/create {{.CLI_ARGS}}
7-
7+
88
build:
99
desc: Build a server image
1010
cmd: go run ./cmd/build {{.CLI_ARGS}}
1111

1212
catalog:
1313
desc: Generate a test catalog
1414
cmd: go run ./cmd/catalog {{.CLI_ARGS}}
15-
15+
1616
wizard:
1717
desc: Run the wizard
1818
cmd: go run ./cmd/wizard {{.CLI_ARGS}}
19-
19+
2020
validate:
2121
desc: Validate a server
2222
cmd: go run ./cmd/validate {{.CLI_ARGS}}
23-
23+
24+
clean:
25+
desc: Clean build artifacts for servers
26+
cmd: go run ./cmd/clean {{.CLI_ARGS}}
27+
2428
import:
2529
desc: Import a server into the registry
2630
cmd: docker mcp catalog import ./catalogs/{{.CLI_ARGS}}/catalog.yaml
27-
31+
2832
reset:
2933
desc: Reset the catalog
3034
cmds:
3135
- docker mcp catalog reset
32-
- docker mcp catalog init
36+
- docker mcp catalog init

cmd/clean/main.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
"os/exec"
8+
"path/filepath"
9+
"strings"
10+
11+
"github.com/docker/mcp-registry/pkg/servers"
12+
)
13+
14+
// main processes the provided server names and cleans build artifacts for each.
15+
func main() {
16+
flag.Parse()
17+
18+
if flag.NArg() == 0 {
19+
fmt.Fprintln(os.Stderr, "Usage: task clean -- <server> [server...]")
20+
os.Exit(1)
21+
}
22+
23+
var failed bool
24+
for _, name := range flag.Args() {
25+
if err := cleanServer(name); err != nil {
26+
fmt.Fprintf(os.Stderr, "cleanup failed for %s: %v\n", name, err)
27+
failed = true
28+
}
29+
}
30+
31+
if failed {
32+
os.Exit(1)
33+
}
34+
}
35+
36+
// cleanServer removes generated artifacts and Docker images for the server.
37+
func cleanServer(name string) error {
38+
serverPath := filepath.Join("servers", name, "server.yaml")
39+
server, err := servers.Read(serverPath)
40+
if err != nil {
41+
return fmt.Errorf("reading server file: %w", err)
42+
}
43+
44+
removeCatalog(name)
45+
removeDockerImage(server.Image)
46+
removeDockerImage("check")
47+
pruneDockerBuilder()
48+
pruneDockerImages()
49+
50+
return nil
51+
}
52+
53+
// removeCatalog deletes the generated catalog directory if it exists.
54+
func removeCatalog(name string) {
55+
path := filepath.Join("catalogs", name)
56+
if err := os.RemoveAll(path); err != nil {
57+
fmt.Fprintf(os.Stderr, "warning: removing %s: %v\n", path, err)
58+
}
59+
}
60+
61+
// removeDockerImage removes the specified Docker image, ignoring missing images.
62+
func removeDockerImage(image string) {
63+
if image == "" {
64+
return
65+
}
66+
67+
out, err := exec.Command("docker", "image", "rm", "-f", image).CombinedOutput()
68+
if err != nil {
69+
msg := string(out)
70+
if strings.Contains(msg, "No such image") {
71+
return
72+
}
73+
fmt.Fprintf(os.Stderr, "warning: removing image %s: %v\n%s", image, err, msg)
74+
} else {
75+
fmt.Print(string(out))
76+
}
77+
}
78+
79+
// pruneDockerBuilder removes unused builder cache entries.
80+
func pruneDockerBuilder() {
81+
cmd := exec.Command("docker", "builder", "prune", "--force")
82+
cmd.Stdout = os.Stdout
83+
cmd.Stderr = os.Stderr
84+
if err := cmd.Run(); err != nil {
85+
fmt.Fprintf(os.Stderr, "warning: pruning builder cache: %v\n", err)
86+
}
87+
}
88+
89+
// pruneDockerImages removes dangling Docker images.
90+
func pruneDockerImages() {
91+
cmd := exec.Command("docker", "image", "prune", "--force")
92+
cmd.Stdout = os.Stdout
93+
cmd.Stderr = os.Stderr
94+
if err := cmd.Run(); err != nil {
95+
fmt.Fprintf(os.Stderr, "warning: pruning images: %v\n", err)
96+
}
97+
}

scripts/ci-validation.sh

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,42 @@ process_server() {
1111
local file="$1"
1212
local dir=$(dirname "$file")
1313
local name=$(basename "$dir")
14-
14+
1515
echo "Processing server: $name"
1616
echo "================================"
17-
17+
1818
# Run each command and check for failures
1919
if ! task validate -- --name "$name"; then
2020
echo "ERROR: Validation failed for $name"
21+
task clean -- "$name" >/dev/null 2>&1 || true
2122
return 1
2223
fi
23-
24+
2425
if ! task build -- --tools --pull-community "$name"; then
2526
echo "ERROR: Build failed for $name"
27+
task clean -- "$name" >/dev/null 2>&1 || true
2628
return 1
2729
fi
28-
30+
2931
echo "--------------------------------"
30-
32+
3133
if ! task catalog -- "$name"; then
3234
echo "ERROR: Catalog generation failed for $name"
35+
task clean -- "$name" >/dev/null 2>&1 || true
3336
return 1
3437
fi
35-
38+
3639
echo "--------------------------------"
37-
40+
3841
cat "catalogs/$name/catalog.yaml"
39-
42+
4043
echo "--------------------------------"
4144
echo "Successfully processed: $name"
4245
echo ""
43-
46+
if ! task clean -- "$name"; then
47+
echo "WARNING: Cleanup encountered issues for $name"
48+
fi
49+
4450
return 0
4551
}
4652

@@ -54,10 +60,10 @@ while IFS= read -r file; do
5460
echo "Skipping already processed server: $name (from file: $file)"
5561
continue
5662
fi
57-
63+
5864
# Mark this server as processed
5965
processed_servers="${processed_servers}|$name|"
60-
66+
6167
if ! process_server "$file"; then
6268
echo "FAILED: Processing server from file: $file"
6369
overall_success=false
@@ -71,4 +77,4 @@ if [ "$overall_success" = true ]; then
7177
else
7278
echo "One or more servers failed to process!"
7379
exit 1
74-
fi
80+
fi

0 commit comments

Comments
 (0)