initial
This commit is contained in:
111
runner/runner.go
Normal file
111
runner/runner.go
Normal file
@ -0,0 +1,111 @@
|
||||
package runner
|
||||
|
||||
import (
|
||||
"code.icod.de/dalu/gomanager/ent"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Runner struct {
|
||||
client *ent.Client
|
||||
}
|
||||
|
||||
func NewRunner(client *ent.Client) *Runner {
|
||||
r := new(Runner)
|
||||
r.client = client
|
||||
return r
|
||||
}
|
||||
|
||||
// Run checks all projects sequentially
|
||||
func (r *Runner) Run() error {
|
||||
ms, e := r.client.Project.Query().All(context.Background())
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
if len(ms) == 0 {
|
||||
return nil
|
||||
}
|
||||
v, e := getCurrentGoVersion()
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
for _, m := range ms {
|
||||
fv, e := getVersionOfFile(fmt.Sprintf("%s/%s", m.RootPath, m.BinaryPath))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
if v != fv {
|
||||
l, e := goBuildBinary(m.RootPath)
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
if e := chownBinary(m.User, m.Group, fmt.Sprintf("%s/%s", m.RootPath, m.BinaryPath)); e != nil {
|
||||
return e
|
||||
}
|
||||
_, e = r.client.Logentry.
|
||||
Create().
|
||||
SetContent(l).
|
||||
Save(context.Background())
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// getCurrentGoVersion returns the version of the installed go package or a non-nil error
|
||||
func getCurrentGoVersion() (string, error) {
|
||||
cmd := exec.Command("go", "version")
|
||||
var out strings.Builder
|
||||
cmd.Stdout = &out
|
||||
if e := cmd.Run(); e != nil {
|
||||
return "", e
|
||||
}
|
||||
split := strings.Split(out.String(), " ")
|
||||
version := split[2]
|
||||
return version, nil
|
||||
}
|
||||
|
||||
// getVersionOfFile returns the version of a go binary or an non-nil error
|
||||
func getVersionOfFile(file string) (string, error) {
|
||||
cmd := exec.Command("go", "version", file)
|
||||
var out strings.Builder
|
||||
cmd.Stdout = &out
|
||||
if e := cmd.Run(); e != nil {
|
||||
return "", e
|
||||
}
|
||||
split := strings.Split(out.String(), " ")
|
||||
version := split[1]
|
||||
return version, nil
|
||||
}
|
||||
|
||||
// goBuildBinary does a go build in the root directory, then "cd"s back to the previous working directory.
|
||||
func goBuildBinary(root string) (string, error) {
|
||||
cwd, e := os.Getwd()
|
||||
if e != nil {
|
||||
return "", e
|
||||
}
|
||||
if e := os.Chdir(root); e != nil {
|
||||
return "", e
|
||||
}
|
||||
|
||||
cmd := exec.Command("go", "build")
|
||||
var out strings.Builder
|
||||
cmd.Stdout = &out
|
||||
if e := cmd.Run(); e != nil {
|
||||
return "", e
|
||||
}
|
||||
if e := os.Chdir(cwd); e != nil {
|
||||
return "", e
|
||||
}
|
||||
return out.String(), nil
|
||||
}
|
||||
|
||||
func chownBinary(user, group, file string) error {
|
||||
cmd := exec.Command("chown", fmt.Sprintf("%s:%s", user, group), file)
|
||||
return cmd.Run()
|
||||
}
|
Reference in New Issue
Block a user