From d8cdbde94022f4096a16c02b443201558e374c95 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Tue, 16 Sep 2025 10:58:16 -0400 Subject: [PATCH 1/7] .gitea/workflows, build: build release binary for keeper --- .gitea/workflows/release-keeper-ziren.yml | 31 +++++++++++++++++++++++ build/ci.go | 18 ++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 .gitea/workflows/release-keeper-ziren.yml diff --git a/.gitea/workflows/release-keeper-ziren.yml b/.gitea/workflows/release-keeper-ziren.yml new file mode 100644 index 00000000000..63557b52dc5 --- /dev/null +++ b/.gitea/workflows/release-keeper-ziren.yml @@ -0,0 +1,31 @@ +on: + push: + branches: + - "master" + tags: + - "v*" + workflow_dispatch: + +jobs: + keeper-ziren: + name: Keeper ZKVM Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.25 + cache: false + + - name: Install cross toolchain for MIPS + run: | + apt-get update + apt-get -yq --no-install-suggests --no-install-recommends install gcc-mipsel-linux-gnu libc6-dev-mipsel-cross + + - name: Build keeper with ziren tag (mipsle) + run: | + go run build/ci.go install -static -arch mipsle -os linux -cc mipsel-linux-gnu-gcc -tags ziren -dlgo ./cmd/keeper + env: + GOMIPS: "softfloat" diff --git a/build/ci.go b/build/ci.go index 6a9848876d5..500e204b689 100644 --- a/build/ci.go +++ b/build/ci.go @@ -183,14 +183,16 @@ func doInstall(cmdline []string) { var ( dlgo = flag.Bool("dlgo", false, "Download Go and build with it") arch = flag.String("arch", "", "Architecture to cross build for") + goos = flag.String("os", "", "Operating system to cross build for") cc = flag.String("cc", "", "C compiler to cross build with") staticlink = flag.Bool("static", false, "Create statically-linked executable") + tags = flag.String("tags", "", "Additional build tags (comma-separated)") ) flag.CommandLine.Parse(cmdline) env := build.Env() // Configure the toolchain. - tc := build.GoToolchain{GOARCH: *arch, CC: *cc} + tc := build.GoToolchain{GOARCH: *arch, GOOS: *goos, CC: *cc} if *dlgo { csdb := download.MustLoadChecksums("build/checksums.txt") tc.Root = build.DownloadGo(csdb) @@ -203,6 +205,20 @@ func doInstall(cmdline []string) { buildTags = append(buildTags, "ckzg") } + // Add custom tags if provided + if *tags != "" { + // Split by both comma and whitespace + customTags := strings.FieldsFunc(*tags, func(r rune) bool { + return r == ',' || r == ' ' || r == '\t' + }) + for _, tag := range customTags { + tag = strings.TrimSpace(tag) + if tag != "" { + buildTags = append(buildTags, tag) + } + } + } + // Configure the build. gobuild := tc.Go("build", buildFlags(env, *staticlink, buildTags)...) From 08c22e1c1e453912a9580cbaa1c8bfb3c52e98cf Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:59:00 +0200 Subject: [PATCH 2/7] use ci.go instead --- .gitea/workflows/release.yml | 21 ++++++++++++ build/ci.go | 63 ++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index f2dcc3ae96a..41defedd00b 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -122,6 +122,27 @@ jobs: LINUX_SIGNING_KEY: ${{ secrets.LINUX_SIGNING_KEY }} AZURE_BLOBSTORE_TOKEN: ${{ secrets.AZURE_BLOBSTORE_TOKEN }} + keeper: + name: Keeper Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.24 + cache: false + + - name: Install cross toolchain + run: | + apt-get update + apt-get -yq --no-install-suggests --no-install-recommends install gcc-multilib + + - name: Build (amd64) + run: | + go run build/ci.go keeper -dlgo + windows: name: Windows Build runs-on: "win-11" diff --git a/build/ci.go b/build/ci.go index 500e204b689..f60ac6e59c6 100644 --- a/build/ci.go +++ b/build/ci.go @@ -31,6 +31,8 @@ Available commands are: install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables test [ -coverage ] [ packages... ] -- runs the tests + install-keeper [ -dlgo ] + archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -signify key-envvar ] [ -upload dest ] -- archives build artifacts importkeys -- imports signing keys from env debsrc [ -signer key-id ] [ -upload dest ] -- creates a debian source package @@ -80,6 +82,33 @@ var ( executablePath("clef"), } + keeperArchiveFiles = []string{ + "COPYING", + executablePath("keeper"), + } + + keeperTargets = []struct { + Name string + GOOS string + GOARCH string + CC string + Tags string + Env map[string]string + }{ + { + Name: "ziren", + GOOS: "linux", + GOARCH: "mipsle", + CC: "mipsel-linux-gnu-gcc", + Tags: "ziren", + Env: map[string]string{"GOMIPS": "softfloat"}, + }, + { + Name: "example", + Tags: "example", + }, + } + // A debian package is created for all executables listed here. debExecutables = []debExecutable{ { @@ -172,6 +201,8 @@ func main() { doPurge(os.Args[2:]) case "sanitycheck": doSanityCheck() + case "keeper": + doInstallKeeper(os.Args[2:]) default: log.Fatal("unknown command ", os.Args[1]) } @@ -244,6 +275,38 @@ func doInstall(cmdline []string) { } } +// doInstallKeeper builds keeper binaries for all supported targets. +func doInstallKeeper(cmdline []string) { + var dlgo = flag.Bool("dlgo", false, "Download Go and build with it") + + flag.CommandLine.Parse(cmdline) + env := build.Env() + + for _, target := range keeperTargets { + log.Printf("Building keeper for %s/%s (tags: %s)", target.GOOS, target.GOARCH, target.Tags) + + // Configure the toolchain. + tc := build.GoToolchain{GOARCH: target.GOARCH, GOOS: target.GOOS, CC: target.CC} + if *dlgo { + csdb := download.MustLoadChecksums("build/checksums.txt") + tc.Root = build.DownloadGo(csdb) + } + + gobuild := tc.Go("build", buildFlags(env, true, []string{target.Tags})...) + gobuild.Args = append(gobuild.Args, "-trimpath", "-v") + + for key, value := range target.Env { + gobuild.Env = append(gobuild.Env, key+"="+value) + } + outputName := fmt.Sprintf("keeper-%s", target.Name) + + args := slices.Clone(gobuild.Args) + args = append(args, "-o", executablePath(outputName)) + args = append(args, "./cmd/keeper") + build.MustRun(&exec.Cmd{Path: gobuild.Path, Args: args, Env: gobuild.Env}) + } +} + // buildFlags returns the go tool flags for building. func buildFlags(env build.Environment, staticLinking bool, buildTags []string) (flags []string) { var ld []string From 51b9b5827c0df0ab5dc14e0b4f34f00b35e28960 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:01:11 +0200 Subject: [PATCH 3/7] remove changes to doInstall --- .gitea/workflows/release-keeper-ziren.yml | 31 ----------------------- build/ci.go | 18 +------------ 2 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 .gitea/workflows/release-keeper-ziren.yml diff --git a/.gitea/workflows/release-keeper-ziren.yml b/.gitea/workflows/release-keeper-ziren.yml deleted file mode 100644 index 63557b52dc5..00000000000 --- a/.gitea/workflows/release-keeper-ziren.yml +++ /dev/null @@ -1,31 +0,0 @@ -on: - push: - branches: - - "master" - tags: - - "v*" - workflow_dispatch: - -jobs: - keeper-ziren: - name: Keeper ZKVM Build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: 1.25 - cache: false - - - name: Install cross toolchain for MIPS - run: | - apt-get update - apt-get -yq --no-install-suggests --no-install-recommends install gcc-mipsel-linux-gnu libc6-dev-mipsel-cross - - - name: Build keeper with ziren tag (mipsle) - run: | - go run build/ci.go install -static -arch mipsle -os linux -cc mipsel-linux-gnu-gcc -tags ziren -dlgo ./cmd/keeper - env: - GOMIPS: "softfloat" diff --git a/build/ci.go b/build/ci.go index f60ac6e59c6..71d18ce5e52 100644 --- a/build/ci.go +++ b/build/ci.go @@ -214,16 +214,14 @@ func doInstall(cmdline []string) { var ( dlgo = flag.Bool("dlgo", false, "Download Go and build with it") arch = flag.String("arch", "", "Architecture to cross build for") - goos = flag.String("os", "", "Operating system to cross build for") cc = flag.String("cc", "", "C compiler to cross build with") staticlink = flag.Bool("static", false, "Create statically-linked executable") - tags = flag.String("tags", "", "Additional build tags (comma-separated)") ) flag.CommandLine.Parse(cmdline) env := build.Env() // Configure the toolchain. - tc := build.GoToolchain{GOARCH: *arch, GOOS: *goos, CC: *cc} + tc := build.GoToolchain{GOARCH: *arch, CC: *cc} if *dlgo { csdb := download.MustLoadChecksums("build/checksums.txt") tc.Root = build.DownloadGo(csdb) @@ -236,20 +234,6 @@ func doInstall(cmdline []string) { buildTags = append(buildTags, "ckzg") } - // Add custom tags if provided - if *tags != "" { - // Split by both comma and whitespace - customTags := strings.FieldsFunc(*tags, func(r rune) bool { - return r == ',' || r == ' ' || r == '\t' - }) - for _, tag := range customTags { - tag = strings.TrimSpace(tag) - if tag != "" { - buildTags = append(buildTags, tag) - } - } - } - // Configure the build. gobuild := tc.Go("build", buildFlags(env, *staticlink, buildTags)...) From e5293beda6587c9081a0fa14cfa2db548af65821 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:02:01 +0200 Subject: [PATCH 4/7] more nice stuff --- .gitignore | 3 ++- build/ci.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 269455db7a7..293359a6695 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,5 @@ cmd/ethkey/ethkey cmd/evm/evm cmd/geth/geth cmd/rlpdump/rlpdump -cmd/workload/workload \ No newline at end of file +cmd/workload/workload +cmd/keeper/keeper diff --git a/build/ci.go b/build/ci.go index 71d18ce5e52..c9fe80549a7 100644 --- a/build/ci.go +++ b/build/ci.go @@ -31,7 +31,7 @@ Available commands are: install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables test [ -coverage ] [ packages... ] -- runs the tests - install-keeper [ -dlgo ] + keeper [ -dlgo ] archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -signify key-envvar ] [ -upload dest ] -- archives build artifacts importkeys -- imports signing keys from env From 485de9cd8c260417a1e9cfdfb79a56a783e38563 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:09:23 +0200 Subject: [PATCH 5/7] more noiceties --- build/ci.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/build/ci.go b/build/ci.go index c9fe80549a7..dbc53b1b7d3 100644 --- a/build/ci.go +++ b/build/ci.go @@ -237,9 +237,6 @@ func doInstall(cmdline []string) { // Configure the build. gobuild := tc.Go("build", buildFlags(env, *staticlink, buildTags)...) - // We use -trimpath to avoid leaking local paths into the built executables. - gobuild.Args = append(gobuild.Args, "-trimpath") - // Show packages during build. gobuild.Args = append(gobuild.Args, "-v") @@ -266,18 +263,22 @@ func doInstallKeeper(cmdline []string) { flag.CommandLine.Parse(cmdline) env := build.Env() - for _, target := range keeperTargets { - log.Printf("Building keeper for %s/%s (tags: %s)", target.GOOS, target.GOARCH, target.Tags) + // Configure the toolchain. + tc := build.GoToolchain{} + if *dlgo { + csdb := download.MustLoadChecksums("build/checksums.txt") + tc.Root = build.DownloadGo(csdb) + } - // Configure the toolchain. - tc := build.GoToolchain{GOARCH: target.GOARCH, GOOS: target.GOOS, CC: target.CC} - if *dlgo { - csdb := download.MustLoadChecksums("build/checksums.txt") - tc.Root = build.DownloadGo(csdb) - } + for _, target := range keeperTargets { + log.Printf("Building keeper-%s", target.Name) + // Configure the build. + tc.GOARCH = target.GOARCH + tc.GOOS = target.GOOS + tc.CC = target.CC gobuild := tc.Go("build", buildFlags(env, true, []string{target.Tags})...) - gobuild.Args = append(gobuild.Args, "-trimpath", "-v") + gobuild.Args = append(gobuild.Args, "-v") for key, value := range target.Env { gobuild.Env = append(gobuild.Env, key+"="+value) @@ -329,6 +330,8 @@ func buildFlags(env build.Environment, staticLinking bool, buildTags []string) ( if len(buildTags) > 0 { flags = append(flags, "-tags", strings.Join(buildTags, ",")) } + // We use -trimpath to avoid leaking local paths into the built executables. + flags = append(flags, "-trimpath") return flags } From f3979cbcf1532c04528b2ba447fd1b11ad525fda Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:32:51 +0200 Subject: [PATCH 6/7] add archive function for keeper --- build/ci.go | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/build/ci.go b/build/ci.go index dbc53b1b7d3..d168070ee87 100644 --- a/build/ci.go +++ b/build/ci.go @@ -32,6 +32,7 @@ Available commands are: test [ -coverage ] [ packages... ] -- runs the tests keeper [ -dlgo ] + keeper-archive [ -signer key-envvar ] [ -signify key-envvar ] [ -upload dest ] archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -signify key-envvar ] [ -upload dest ] -- archives build artifacts importkeys -- imports signing keys from env @@ -82,11 +83,7 @@ var ( executablePath("clef"), } - keeperArchiveFiles = []string{ - "COPYING", - executablePath("keeper"), - } - + // Keeper build targets with their configurations keeperTargets = []struct { Name string GOOS string @@ -203,6 +200,8 @@ func main() { doSanityCheck() case "keeper": doInstallKeeper(os.Args[2:]) + case "keeper-archive": + doKeeperArchive(os.Args[2:]) default: log.Fatal("unknown command ", os.Args[1]) } @@ -660,6 +659,32 @@ func doArchive(cmdline []string) { } } +func doKeeperArchive(cmdline []string) { + var ( + signer = flag.String("signer", "", `Environment variable holding the signing key (e.g. LINUX_SIGNING_KEY)`) + signify = flag.String("signify", "", `Environment variable holding the signify key (e.g. LINUX_SIGNIFY_KEY)`) + upload = flag.String("upload", "", `Destination to upload the archives (usually "gethstore/builds")`) + ) + flag.CommandLine.Parse(cmdline) + + var ( + env = build.Env() + vsn = version.Archive(env.Commit) + keeper = "keeper-" + vsn + ".tar.gz" + ) + maybeSkipArchive(env) + files := []string{"COPYING"} + for _, target := range keeperTargets { + files = append(files, executablePath(fmt.Sprintf("keeper-%s", target.Name))) + } + if err := build.WriteArchive(keeper, files); err != nil { + log.Fatal(err) + } + if err := archiveUpload(keeper, *upload, *signer, *signify); err != nil { + log.Fatal(err) + } +} + func archiveBasename(arch string, archiveVersion string) string { platform := runtime.GOOS + "-" + arch if arch == "arm" { From 6002b61014ee5a4694553a01a40b7202533f56a9 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet <3272758+gballet@users.noreply.github.com> Date: Wed, 17 Sep 2025 16:00:31 +0200 Subject: [PATCH 7/7] disable cgo for now --- build/ci.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build/ci.go b/build/ci.go index d168070ee87..262b3462e7d 100644 --- a/build/ci.go +++ b/build/ci.go @@ -96,9 +96,10 @@ var ( Name: "ziren", GOOS: "linux", GOARCH: "mipsle", - CC: "mipsel-linux-gnu-gcc", - Tags: "ziren", - Env: map[string]string{"GOMIPS": "softfloat"}, + // enable when cgo works + // CC: "mipsel-linux-gnu-gcc", + Tags: "ziren", + Env: map[string]string{"GOMIPS": "softfloat", "CGO_ENABLED": "0"}, }, { Name: "example",