WIP
This commit is contained in:
parent
5f0bb90e2c
commit
6295c3f1a4
8 changed files with 113 additions and 17 deletions
69
distbuild/pkg/build/cmd.go
Normal file
69
distbuild/pkg/build/cmd.go
Normal file
|
@ -0,0 +1,69 @@
|
|||
package build
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
type JobContext struct {
|
||||
SourceDir string
|
||||
OutputDir string
|
||||
Deps map[ID]string
|
||||
}
|
||||
|
||||
// Render replaces variable references with their real value.
|
||||
func (c *Cmd) Render(ctx JobContext) (*Cmd, error) {
|
||||
var errs []error
|
||||
|
||||
var fixedCtx struct {
|
||||
SourceDir string
|
||||
OutputDir string
|
||||
Deps map[string]string
|
||||
}
|
||||
fixedCtx.SourceDir = ctx.SourceDir
|
||||
fixedCtx.OutputDir = ctx.OutputDir
|
||||
fixedCtx.Deps = map[string]string{}
|
||||
|
||||
for k, v := range ctx.Deps {
|
||||
fixedCtx.Deps[k.String()] = v
|
||||
}
|
||||
|
||||
render := func(str string) string {
|
||||
t, err := template.New("").Parse(str)
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
return ""
|
||||
}
|
||||
|
||||
var b strings.Builder
|
||||
if err := t.Execute(&b, fixedCtx); err != nil {
|
||||
errs = append(errs, err)
|
||||
return ""
|
||||
}
|
||||
|
||||
return b.String()
|
||||
}
|
||||
|
||||
renderList := func(l []string) []string {
|
||||
var result []string
|
||||
for _, in := range l {
|
||||
result = append(result, render(in))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
var rendered Cmd
|
||||
|
||||
rendered.CatOutput = render(c.CatOutput)
|
||||
rendered.CatTemplate = render(c.CatTemplate)
|
||||
rendered.WorkingDirectory = render(c.WorkingDirectory)
|
||||
rendered.Exec = renderList(c.Exec)
|
||||
rendered.Environ = renderList(c.Environ)
|
||||
|
||||
if len(errs) != 0 {
|
||||
return nil, fmt.Errorf("error rendering cmd: %w", errs[0])
|
||||
}
|
||||
|
||||
return &rendered, nil
|
||||
}
|
31
distbuild/pkg/build/cmd_test.go
Normal file
31
distbuild/pkg/build/cmd_test.go
Normal file
|
@ -0,0 +1,31 @@
|
|||
package build
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCmdRender(t *testing.T) {
|
||||
tmpl := Cmd{
|
||||
CatOutput: "{{.OutputDir}}/import.map",
|
||||
CatTemplate: `bytes={{index .Deps "6100000000000000000000000000000000000000"}}/lib.a`,
|
||||
}
|
||||
|
||||
ctx := JobContext{
|
||||
OutputDir: "/distbuild/jobs/b",
|
||||
Deps: map[ID]string{
|
||||
{'a'}: "/distbuild/jobs/a",
|
||||
},
|
||||
}
|
||||
|
||||
result, err := tmpl.Render(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
expected := &Cmd{
|
||||
CatOutput: "/distbuild/jobs/b/import.map",
|
||||
CatTemplate: "bytes=/distbuild/jobs/a/lib.a",
|
||||
}
|
||||
|
||||
require.Equal(t, expected, result)
|
||||
}
|
|
@ -83,9 +83,9 @@ type Job struct {
|
|||
// Все строки в описании команды могут содержать в себе на переменные. Перед выполнением
|
||||
// реальной команды, переменные заменяются на их реальные значения.
|
||||
//
|
||||
// {{OUTPUT_DIR}} - абсолютный путь до выходной директории джоба.
|
||||
// {{SOURCE_DIR}} - абсолютный путь до директории с исходными файлами.
|
||||
// {{DEP:f374b81d81f641c8c3d5d5468081ef83b2c7dae9}} - абсолютный путь до директории,
|
||||
// {{.OutputDir}} - абсолютный путь до выходной директории джоба.
|
||||
// {{.SourceDir}} - абсолютный путь до директории с исходными файлами.
|
||||
// {{index .Deps "f374b81d81f641c8c3d5d5468081ef83b2c7dae9"}} - абсолютный путь до директории,
|
||||
// содержащей выход джоба с id f374b81d81f641c8c3d5d5468081ef83b2c7dae9.
|
||||
type Cmd struct {
|
||||
// Exec описывает команду, которую нужно выполнить.
|
||||
|
@ -104,10 +104,6 @@ type Cmd struct {
|
|||
CatOutput string
|
||||
}
|
||||
|
||||
func (cmd Cmd) Render(outputDir, sourceDir string, deps map[ID]string) Cmd {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
type Graph struct {
|
||||
SourceFiles map[ID]string
|
||||
|
||||
|
|
4
distbuild/pkg/dist/schedule.go
vendored
4
distbuild/pkg/dist/schedule.go
vendored
|
@ -9,7 +9,7 @@ import (
|
|||
|
||||
type scheduledJob struct {
|
||||
job *build.Job
|
||||
finished *proto.FinishedJob
|
||||
finished *proto.JobResult
|
||||
|
||||
mu sync.Mutex
|
||||
done chan struct{}
|
||||
|
@ -22,7 +22,7 @@ func newScheduledJob(job *build.Job) *scheduledJob {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *scheduledJob) finish(f *proto.FinishedJob) {
|
||||
func (s *scheduledJob) finish(f *proto.JobResult) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ type MissingSources struct {
|
|||
}
|
||||
|
||||
type StatusUpdate struct {
|
||||
JobFinished *FinishedJob
|
||||
JobFinished *JobResult
|
||||
BuildFailed *BuildFailed
|
||||
BuildFinished *BuildFinished
|
||||
}
|
||||
|
|
|
@ -4,8 +4,8 @@ import (
|
|||
"gitlab.com/slon/shad-go/distbuild/pkg/build"
|
||||
)
|
||||
|
||||
// CompleteJob описывает результат работы джоба.
|
||||
type FinishedJob struct {
|
||||
// JobResult описывает результат работы джоба.
|
||||
type JobResult struct {
|
||||
ID build.ID
|
||||
|
||||
Stdout, Stderr []byte
|
||||
|
@ -44,9 +44,9 @@ type HeartbeatRequest struct {
|
|||
// FreeSlots сообщаяет, сколько еще процессов можно запустить на этом воркере.
|
||||
FreeSlots int
|
||||
|
||||
// FinishedJob сообщает координатору, какие джобы завершили исполнение на этом воркере
|
||||
// JobResult сообщает координатору, какие джобы завершили исполнение на этом воркере
|
||||
// на этой итерации цикла.
|
||||
FinishedJob []FinishedJob
|
||||
FinishedJob []JobResult
|
||||
|
||||
// AddedArtifacts говорит, какие артефакты появились в кеше на этой итерации цикла.
|
||||
AddedArtifacts []build.ID
|
||||
|
|
|
@ -18,7 +18,7 @@ func (w *Worker) buildHeartbeat() *proto.HeartbeatRequest {
|
|||
return req
|
||||
}
|
||||
|
||||
func (w *Worker) jobFinished(job *proto.FinishedJob) {
|
||||
func (w *Worker) jobFinished(job *proto.JobResult) {
|
||||
w.log.Debug("job finished", zap.String("job_id", job.ID.String()))
|
||||
|
||||
w.mu.Lock()
|
||||
|
|
|
@ -31,7 +31,7 @@ type Worker struct {
|
|||
mu sync.Mutex
|
||||
newArtifacts []build.ID
|
||||
newSources []build.ID
|
||||
finishedJobs []proto.FinishedJob
|
||||
finishedJobs []proto.JobResult
|
||||
}
|
||||
|
||||
func New(
|
||||
|
@ -118,7 +118,7 @@ func (w *Worker) Run(ctx context.Context) error {
|
|||
zap.Int("num_jobs", len(rsp.JobsToRun)))
|
||||
|
||||
for _, job := range rsp.JobsToRun {
|
||||
var finished proto.FinishedJob
|
||||
var finished proto.JobResult
|
||||
finished.ID = job.Job.ID
|
||||
|
||||
var stdout bytes.Buffer
|
||||
|
|
Loading…
Reference in a new issue