summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/images/build.go18
-rw-r--r--cmd/podman/utils/error.go26
-rw-r--r--test/e2e/build_test.go21
-rw-r--r--test/system/070-build.bats2
4 files changed, 64 insertions, 3 deletions
diff --git a/cmd/podman/images/build.go b/cmd/podman/images/build.go
index 4c563ed27..751db099f 100644
--- a/cmd/podman/images/build.go
+++ b/cmd/podman/images/build.go
@@ -1,9 +1,11 @@
package images
import (
+ "fmt"
"io"
"io/ioutil"
"os"
+ "os/exec"
"path/filepath"
"strings"
"time"
@@ -289,7 +291,23 @@ func build(cmd *cobra.Command, args []string) error {
}
report, err := registry.ImageEngine().Build(registry.GetContext(), containerFiles, *apiBuildOpts)
+
if err != nil {
+ exitCode := buildahCLI.ExecErrorCodeGeneric
+ if registry.IsRemote() {
+ // errors from server does not contain ExitCode
+ // so parse exit code from error message
+ remoteExitCode, parseErr := utils.ExitCodeFromBuildError(fmt.Sprint(errors.Cause(err)))
+ if parseErr == nil {
+ exitCode = remoteExitCode
+ }
+ }
+
+ if ee, ok := (errors.Cause(err)).(*exec.ExitError); ok {
+ exitCode = ee.ExitCode()
+ }
+
+ registry.SetExitCode(exitCode)
return err
}
diff --git a/cmd/podman/utils/error.go b/cmd/podman/utils/error.go
index 2d58bc70d..aab1da675 100644
--- a/cmd/podman/utils/error.go
+++ b/cmd/podman/utils/error.go
@@ -1,8 +1,13 @@
package utils
import (
+ "errors"
"fmt"
"os"
+ "strconv"
+ "strings"
+
+ buildahCLI "github.com/containers/buildah/pkg/cli"
)
type OutputErrors []error
@@ -17,3 +22,24 @@ func (o OutputErrors) PrintErrors() (lastError error) {
}
return
}
+
+/* For remote client, server does not returns error with exit code
+ instead returns a message and we cast it to a new error.
+
+ Following function performs parsing on build error and returns
+ exit status which was exepected for this current build
+*/
+func ExitCodeFromBuildError(errorMsg string) (int, error) {
+ if strings.Contains(errorMsg, "exit status") {
+ errorSplit := strings.Split(errorMsg, " ")
+ if errorSplit[len(errorSplit)-2] == "status" {
+ tmpSplit := strings.Split(errorSplit[len(errorSplit)-1], "\n")
+ exitCodeRemote, err := strconv.Atoi(tmpSplit[0])
+ if err == nil {
+ return exitCodeRemote, nil
+ }
+ return buildahCLI.ExecErrorCodeGeneric, err
+ }
+ }
+ return buildahCLI.ExecErrorCodeGeneric, errors.New("error message does not contains a valid exit code")
+}
diff --git a/test/e2e/build_test.go b/test/e2e/build_test.go
index 9a9dec191..5ed873f78 100644
--- a/test/e2e/build_test.go
+++ b/test/e2e/build_test.go
@@ -273,6 +273,23 @@ RUN printenv http_proxy`, ALPINE)
os.Unsetenv("http_proxy")
})
+ It("podman build relay exit code to process", func() {
+ if IsRemote() {
+ podmanTest.StopRemoteService()
+ podmanTest.StartRemoteService()
+ }
+ podmanTest.AddImageToRWStore(ALPINE)
+ dockerfile := fmt.Sprintf(`FROM %s
+RUN exit 5`, ALPINE)
+
+ dockerfilePath := filepath.Join(podmanTest.TempDir, "Dockerfile")
+ err := ioutil.WriteFile(dockerfilePath, []byte(dockerfile), 0755)
+ Expect(err).To(BeNil())
+ session := podmanTest.Podman([]string{"build", "-t", "error-test", "--file", dockerfilePath, podmanTest.TempDir})
+ session.Wait(120)
+ Expect(session).Should(Exit(5))
+ })
+
It("podman build and check identity", func() {
session := podmanTest.Podman([]string{"build", "--pull-never", "-f", "build/basicalpine/Containerfile.path", "--no-cache", "-t", "test", "build/basicalpine"})
session.WaitWithDefaultTimeout()
@@ -646,7 +663,7 @@ RUN ls /dev/fuse`, ALPINE)
Expect(err).To(BeNil())
session := podmanTest.Podman([]string{"build", "--pull-never", "-t", "test", "--file", containerfilePath, podmanTest.TempDir})
session.WaitWithDefaultTimeout()
- Expect(session).Should(Exit(125))
+ Expect(session).Should(Exit(1))
session = podmanTest.Podman([]string{"build", "--pull-never", "--device", "/dev/fuse", "-t", "test", "--file", containerfilePath, podmanTest.TempDir})
session.WaitWithDefaultTimeout()
@@ -662,7 +679,7 @@ RUN ls /dev/test1`, ALPINE)
Expect(err).To(BeNil())
session := podmanTest.Podman([]string{"build", "--pull-never", "-t", "test", "--file", containerfilePath, podmanTest.TempDir})
session.WaitWithDefaultTimeout()
- Expect(session).Should(Exit(125))
+ Expect(session).Should(Exit(1))
session = podmanTest.Podman([]string{"build", "--pull-never", "--device", "/dev/zero:/dev/test1", "-t", "test", "--file", containerfilePath, podmanTest.TempDir})
session.WaitWithDefaultTimeout()
diff --git a/test/system/070-build.bats b/test/system/070-build.bats
index 3c47b1f5b..5e920506d 100644
--- a/test/system/070-build.bats
+++ b/test/system/070-build.bats
@@ -115,7 +115,7 @@ FROM $IMAGE
RUN echo $rand_content
EOF
- run_podman 125 --runtime-flag invalidflag build -t build_test $tmpdir
+ run_podman 1 --runtime-flag invalidflag build -t build_test $tmpdir
is "$output" ".*invalidflag" "failed when passing undefined flags to the runtime"
}