forgepb/build.go

162 lines
4.2 KiB
Go
Raw Normal View History

2024-12-01 10:44:29 -06:00
package forgepb
// for golang repos, this is an attempt to build the package
// there might be some 'standard' ways to implement a build
// that make sense.
// Additions to 'go build' that are attempted here:
//
// * detect packages that are plugins
// * autogen packages that have .proto protobuf files
// * define some 'standard' ldflags
//
import (
"errors"
"fmt"
"os"
2024-12-01 22:23:02 -06:00
"path/filepath"
"strings"
2024-12-01 10:44:29 -06:00
"time"
2024-12-10 01:48:29 -06:00
"go.wit.com/lib/gui/shell"
2024-12-01 10:44:29 -06:00
"go.wit.com/lib/protobuf/gitpb"
"go.wit.com/log"
)
func (f *Forge) Build(repo *gitpb.Repo, userFlags []string) error {
2024-12-01 22:23:02 -06:00
return f.doBuild(repo, userFlags, "build")
}
func (f *Forge) Install(repo *gitpb.Repo, userFlags []string) error {
return f.doBuild(repo, userFlags, "install")
}
func (f *Forge) doBuild(repo *gitpb.Repo, userFlags []string, goWhat string) error {
2024-12-07 16:50:04 -06:00
if repo == nil {
log.Warn("forge.doBuild repo == nil")
return errors.New("forge.doBuild repo == nil")
}
2024-12-10 01:48:29 -06:00
if f.IsGoWork() {
// when building using a go.work file, never use GO111MODULE=off
os.Unsetenv("GO111MODULE")
} else {
// when building from ~/go/src, always use GO111MODULE=off
os.Setenv("GO111MODULE", "off")
defer os.Unsetenv("GO111MODULE")
}
2024-12-01 10:44:29 -06:00
// get the version
version := repo.GetCurrentBranchVersion()
2024-12-01 22:23:02 -06:00
/*
loop := repo.Tags.SortByRefname()
for loop.Scan() {
t := loop.Next()
log.Info("Build() tag:", t.Refname)
}
*/
2024-12-01 10:44:29 -06:00
if repo.GoDeps == nil {
repo.RedoGoMod()
}
if repo.GoDeps.Len() == 0 {
2024-12-01 22:23:02 -06:00
// eh, potentially runs it twice. don't care right now
2024-12-01 10:44:29 -06:00
log.Info("redo go.mod", repo.GetGoPath())
repo.RedoGoMod()
f.Repos.ConfigSave()
}
loop1 := repo.GoDeps.SortByGoPath()
for loop1.Scan() {
t := loop1.Next()
2024-12-01 22:23:02 -06:00
found := f.Repos.FindByGoPath(t.GetGoPath())
if found.RepoType() == "protobuf" {
if err := f.runAutogenpb(found); err != nil {
return err
}
}
2024-12-01 10:44:29 -06:00
}
if repo.CheckDirty() {
version = version + "-dirty"
}
2024-12-01 22:23:02 -06:00
cmd := []string{"go", goWhat, "-v"}
2024-12-01 10:44:29 -06:00
// set standard ldflag options
now := time.Now()
datestamp := now.UTC().Format("2006/01/02_1504_UTC")
2024-12-01 22:23:02 -06:00
// log.Info("datestamp =", datestamp)
2024-12-01 10:44:29 -06:00
// add some standard golang flags
ldflags := "-X main.VERSION=" + version + " "
ldflags += "-X main.BUILDTIME=" + datestamp + " "
ldflags += "-X main.GUIVERSION=" + version + "" // todo: git this from the filesystem
cmd = append(cmd, "-ldflags", ldflags)
// add any flags from the command line
// this might not actually work
// todo: test this
for _, flag := range userFlags {
cmd = append(cmd, "-ldflags", "-X "+flag)
}
2024-12-10 01:48:29 -06:00
testenv := os.Getenv("GO111MODULE")
if testenv == "off" {
log.Info("GO111MODULE=off", "f.goWork =", f.IsGoWork(), "f.gosrc =", f.GetGoSrc())
} else {
log.Info("GO111MODULE=", testenv, "f.goWork =", f.IsGoWork(), "f.gosrc =", f.GetGoSrc())
}
2024-12-01 22:23:02 -06:00
log.Info("running:", cmd)
2024-12-03 13:24:41 -06:00
result := repo.RunRealtime(cmd)
if result.Exit == 0 {
log.Info(strings.Join(result.Stdout, "\n"))
2024-12-01 10:44:29 -06:00
return nil
} else {
2024-12-03 13:24:41 -06:00
log.DaemonMode(true)
log.Info(strings.Join(result.Stdout, "\n"))
log.Info(strings.Join(result.Stderr, "\n"))
log.DaemonMode(false)
2024-12-01 22:23:02 -06:00
log.Warn("go build failed", cmd)
2024-12-07 16:50:04 -06:00
pwd, _ := os.Getwd()
log.Warn("go build pwd", pwd)
2024-12-10 01:48:29 -06:00
res2 := shell.RunEcho(cmd)
2024-12-07 16:50:04 -06:00
if res2.Exit == 0 {
log.Info("again failed", res2.Exit)
log.Info("again failed cmd", strings.Join(cmd, "a"))
log.Info("again failed", strings.Join(res2.Stdout, "\n"))
}
2024-12-03 13:24:41 -06:00
return errors.New("go build failed: " + fmt.Sprint(result.Error))
2024-12-01 10:44:29 -06:00
}
}
2024-12-01 22:23:02 -06:00
func (f *Forge) runAutogenpb(repo *gitpb.Repo) error {
// log.Info("run autogenpb here:", repo.GetGoPath())
files, err := repo.GetProtoFiles()
if err != nil {
log.Info("gitpb.GetProtoFiles()", err)
return err
}
for _, s := range files {
_, filename := filepath.Split(s)
pbfile := strings.TrimSuffix(filename, ".proto") + ".pb.go"
cmd := []string{"autogenpb", "--proto", filename}
if repo.Exists(pbfile) {
// log.Info("skip running:", cmd)
continue
}
log.Info("running:", cmd)
r := repo.RunRealtime(cmd)
if r.Error != nil {
log.Warn("")
log.Warn("autogenpb error", r.Error)
log.Warn("")
log.Warn("You might be missing autogenpb?")
log.Warn("")
log.Warn("To install it run: go install go.wit.com/apps/autogenpb@latest")
log.Warn("")
log.Sleep(2)
return r.Error
}
}
return nil
}