osbuild-worker/osbuild: move out execution helper
Move the execution helper for osbuild into the osbuild2 package so it can be reused. In the process, generalise it slightly.
This commit is contained in:
parent
6ae65f1951
commit
1b924ae30c
3 changed files with 30 additions and 20 deletions
|
|
@ -10,6 +10,7 @@ import (
|
|||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/osbuild/osbuild-composer/internal/common"
|
||||
"github.com/osbuild/osbuild-composer/internal/osbuild2"
|
||||
"github.com/osbuild/osbuild-composer/internal/upload/koji"
|
||||
"github.com/osbuild/osbuild-composer/internal/worker"
|
||||
"github.com/osbuild/osbuild-composer/internal/worker/clienterrors"
|
||||
|
|
@ -144,7 +145,7 @@ func (impl *OSBuildKojiJobImpl) Run(job worker.Job) error {
|
|||
result.JobError = clienterrors.WorkerClientError(clienterrors.ErrorBuildJob, err.Error())
|
||||
return err
|
||||
}
|
||||
result.OSBuildOutput, err = RunOSBuild(args.Manifest, impl.Store, outputDirectory, exports, os.Stderr)
|
||||
result.OSBuildOutput, err = osbuild2.RunOSBuild(args.Manifest, impl.Store, outputDirectory, exports, nil, true, os.Stderr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/osbuild/osbuild-composer/internal/container"
|
||||
"github.com/osbuild/osbuild-composer/internal/osbuild2"
|
||||
"github.com/osbuild/osbuild-composer/internal/upload/oci"
|
||||
|
||||
"github.com/google/uuid"
|
||||
|
|
@ -21,7 +22,6 @@ import (
|
|||
"github.com/osbuild/osbuild-composer/internal/cloud/awscloud"
|
||||
"github.com/osbuild/osbuild-composer/internal/cloud/gcp"
|
||||
"github.com/osbuild/osbuild-composer/internal/common"
|
||||
osbuild "github.com/osbuild/osbuild-composer/internal/osbuild2"
|
||||
"github.com/osbuild/osbuild-composer/internal/target"
|
||||
"github.com/osbuild/osbuild-composer/internal/upload/azure"
|
||||
"github.com/osbuild/osbuild-composer/internal/upload/koji"
|
||||
|
|
@ -202,7 +202,7 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error {
|
|||
// Initialize variable needed for reporting back to osbuild-composer.
|
||||
var osbuildJobResult *worker.OSBuildJobResult = &worker.OSBuildJobResult{
|
||||
Success: false,
|
||||
OSBuildOutput: &osbuild.Result{
|
||||
OSBuildOutput: &osbuild2.Result{
|
||||
Success: false,
|
||||
},
|
||||
UploadStatus: "failure",
|
||||
|
|
@ -306,7 +306,7 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error {
|
|||
}
|
||||
|
||||
// Run osbuild and handle two kinds of errors
|
||||
osbuildJobResult.OSBuildOutput, err = RunOSBuild(jobArgs.Manifest, impl.Store, outputDirectory, exports, os.Stderr)
|
||||
osbuildJobResult.OSBuildOutput, err = osbuild2.RunOSBuild(jobArgs.Manifest, impl.Store, outputDirectory, exports, nil, true, os.Stderr)
|
||||
// First handle the case when "running" osbuild failed
|
||||
if err != nil {
|
||||
osbuildJobResult.JobError = clienterrors.WorkerClientError(clienterrors.ErrorBuildJob, "osbuild build failed")
|
||||
|
|
|
|||
|
|
@ -1,72 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os/exec"
|
||||
|
||||
"github.com/osbuild/osbuild-composer/internal/distro"
|
||||
osbuild "github.com/osbuild/osbuild-composer/internal/osbuild2"
|
||||
)
|
||||
|
||||
// Run an instance of osbuild, returning a parsed osbuild.Result.
|
||||
//
|
||||
// Note that osbuild returns non-zero when the pipeline fails. This function
|
||||
// does not return an error in this case. Instead, the failure is communicated
|
||||
// with its corresponding logs through osbuild.Result.
|
||||
func RunOSBuild(manifest distro.Manifest, store, outputDirectory string, exports []string, errorWriter io.Writer) (*osbuild.Result, error) {
|
||||
cmd := exec.Command(
|
||||
"osbuild",
|
||||
"--store", store,
|
||||
"--output-directory", outputDirectory,
|
||||
"--json", "-",
|
||||
)
|
||||
|
||||
for _, export := range exports {
|
||||
cmd.Args = append(cmd.Args, "--export", export)
|
||||
}
|
||||
cmd.Stderr = errorWriter
|
||||
|
||||
stdin, err := cmd.StdinPipe()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error setting up stdin for osbuild: %v", err)
|
||||
}
|
||||
|
||||
var stdoutBuffer bytes.Buffer
|
||||
cmd.Stdout = &stdoutBuffer
|
||||
|
||||
err = cmd.Start()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error starting osbuild: %v", err)
|
||||
}
|
||||
|
||||
_, err = stdin.Write(manifest)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error writing osbuild manifest: %v", err)
|
||||
}
|
||||
|
||||
err = stdin.Close()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error closing osbuild's stdin: %v", err)
|
||||
}
|
||||
|
||||
err = cmd.Wait()
|
||||
|
||||
// try to decode the output even though the job could have failed
|
||||
var result osbuild.Result
|
||||
decodeErr := json.Unmarshal(stdoutBuffer.Bytes(), &result)
|
||||
if decodeErr != nil {
|
||||
return nil, fmt.Errorf("error decoding osbuild output: %v\nthe raw output:\n%s", decodeErr, stdoutBuffer.String())
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
// ignore ExitError if output could be decoded correctly
|
||||
if _, isExitError := err.(*exec.ExitError); !isExitError {
|
||||
return nil, fmt.Errorf("running osbuild failed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return &result, nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue