worker: pass build environment to osbuild

Detect it from the host using the distro package.
This commit is contained in:
Lars Karlitski 2019-11-28 21:05:31 +01:00
parent 85e6182bdc
commit 5dad3bfc8e
6 changed files with 48 additions and 6 deletions

View file

@ -9,6 +9,7 @@ import (
"net"
"net/http"
"github.com/osbuild/osbuild-composer/internal/distro"
"github.com/osbuild/osbuild-composer/internal/jobqueue"
)
@ -74,7 +75,7 @@ func (c *ComposerClient) UpdateJob(job *jobqueue.Job, status string) error {
return nil
}
func handleJob(client *ComposerClient) {
func handleJob(client *ComposerClient, distro distro.Distro) {
fmt.Println("Waiting for a new job...")
job, err := client.AddJob()
if err != nil {
@ -84,7 +85,7 @@ func handleJob(client *ComposerClient) {
client.UpdateJob(job, "RUNNING")
fmt.Printf("Running job %s\n", job.ID.String())
err, errs := job.Run()
err, errs := job.Run(distro)
if err != nil {
client.UpdateJob(job, "FAILED")
return
@ -101,9 +102,13 @@ func handleJob(client *ComposerClient) {
}
func main() {
client := NewClient()
distro, err := distro.FromHost()
if err != nil {
panic(err)
}
client := NewClient()
for {
handleJob(client)
handleJob(client, distro)
}
}

View file

@ -31,6 +31,9 @@ type Distro interface {
// output format with all packages and customizations specified in the
// given blueprint.
Pipeline(b *blueprint.Blueprint, outputFormat string) (*pipeline.Pipeline, error)
// Returns a osbuild runner that can be used on this distro.
Runner() string
}
var registered map[string]Distro

View file

@ -343,6 +343,10 @@ func (r *Fedora30) Pipeline(b *blueprint.Blueprint, outputFormat string) (*pipel
return p, nil
}
func (r *Fedora30) Runner() string {
return "org.osbuild.fedora30"
}
func (r *Fedora30) buildPipeline() *pipeline.Pipeline {
packages := []string{
"dnf",

View file

@ -373,6 +373,10 @@ func (r *RHEL82) Pipeline(b *blueprint.Blueprint, outputFormat string) (*pipelin
return p, nil
}
func (r *RHEL82) Runner() string {
return "org.osbuild.rhel82"
}
func (r *RHEL82) buildPipeline() *pipeline.Pipeline {
packages := []string{
"dnf",

View file

@ -36,3 +36,7 @@ func (d *TestDistro) FilenameFromType(outputFormat string) (string, string, erro
func (d *TestDistro) Pipeline(b *blueprint.Blueprint, outputFormat string) (*pipeline.Pipeline, error) {
return nil, errors.New("invalid output format: " + outputFormat)
}
func (d *TestDistro) Runner() string {
return "org.osbuild.test"
}

View file

@ -3,10 +3,12 @@ package jobqueue
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"os/exec"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/distro"
"github.com/osbuild/osbuild-composer/internal/pipeline"
"github.com/osbuild/osbuild-composer/internal/target"
"github.com/osbuild/osbuild-composer/internal/upload/awsupload"
@ -22,8 +24,28 @@ type JobStatus struct {
Status string `json:"status"`
}
func (job *Job) Run() (error, []error) {
cmd := exec.Command("osbuild", "--store", "/var/cache/osbuild-composer/store", "--json", "-")
func (job *Job) Run(d distro.Distro) (error, []error) {
build := pipeline.Build{
Runner: d.Runner(),
}
buildFile, err := ioutil.TempFile("", "osbuild-worker-build-env-*")
if err != nil {
return err, nil
}
defer os.Remove(buildFile.Name())
err = json.NewEncoder(buildFile).Encode(build)
if err != nil {
return err, nil
}
cmd := exec.Command(
"osbuild",
"--store", "/var/cache/osbuild-composer/store",
"--build-env", buildFile.Name(),
"--json", "-",
)
cmd.Stderr = os.Stderr
stdin, err := cmd.StdinPipe()