13

I'm using xcodebuild inside a bash script on a continuous integration server.

I would like to know when a build as failed in the script, so I can exit prematurely from it and mark the build as failed.

xcodebuild displays a BUILD FAILED message to the console, but I don't succeed in getting a return value.

How can I achieve this?

Thanks in advance

Emidee
  • 1,245
  • 1
  • 14
  • 33

7 Answers7

18

You can use the "$?" variable to get the return code of the previous command.

xcodebuild -...
if [[ $? == 0 ]]; then
    echo "Success"
else
    echo "Failed"
fi
yoAlex5
  • 29,217
  • 8
  • 193
  • 205
Dmitry
  • 7,300
  • 6
  • 32
  • 55
17

I solved my problem using this command: xcodebuild -... || exit 1

Emidee
  • 1,245
  • 1
  • 14
  • 33
15

xcodebuild always returns 0, regardless of the actual test result. You should check for either ** BUILD FAILED ** or ** BUILD SUCCEEDED ** in the output to know whether tests pass or not.

Javier Soto
  • 4,840
  • 4
  • 26
  • 46
8

Xcodebuild can return any of the error codes listed below and not restricted to EX_OK (or int 0).

However, I learnt from solution provided by Dmitry and modified as following. It works for me and I hope it could be helpful.

xcodebuild -project ......
     if test $? -eq 0
     then
        echo "Success"
     else
        echo "Failed"
     fi

Error codes

The following are the error codes that can be returned by sysexits archive:

  • EX_OK (0): Successful exit.
  • EX_USAGE (64): The command was used incorrectly, e.g., with the wrong number of arguments, a bad flag, a bad syntax in a parameter, or whatever.
  • EX_DATAERR (65): The input data was incorrect in some way. This should only be used for user's data and not system files.
  • EX_NOINPUT (66): An input file (not a system file) did not exist or was not readable. This could also include errors like ``No message'' to a mailer (if it cared to catch it).
  • EX_NOUSER (67): The user specified did not exist. This might be used for mail addresses or remote logins.
  • EX_NOHOST (68): The host specified did not exist. This is used in mail addresses or network requests.
  • EX_UNAVAILABLE (69): A service is unavailable. This can occur if a support program or file does not exist. This can also be used as a catchall message when something you wanted to do doesn't work, but you don't know why.
  • EX_SOFTWARE (70): An internal software error has been detected. This should be limited to non-operating nonoperating operating system related errors as possible.
  • EX_OSERR (71): An operating system error has been detected. This is intended to be used for such things as cannot fork'',cannot create pipe'', or the like. It includes things like getuid returning a user that does not exist in the passwd file.
  • EX_OSFILE (72): Some system file (e.g., /etc/passwd, /var/run/utmp, etc.) does not exist, cannot be opened, or has some sort of error (e.g., syntax error).
  • EX_CANTCREAT (73): A (user specified) output file cannot be created.
  • EX_IOERR (74): An error occurred while doing I/O on some file.
  • EX_TEMPFAIL (75): Temporary failure, indicating something that is not really an error. In send-mail, sendmail, mail, this means that a mailer (e.g.) could not create a connection, and the request should be reattempted later.
  • EX_PROTOCOL (76): The remote system returned something that was ``not possible'' during a protocol exchange.
  • EX_NOPERM (77): You did not have sufficient permission to perform the operation. This is not intended for file system problems, which should use EX_NOINPUT or EX_CANTCREAT, but rather for higher level permissions.
  • EX_CONFIG (78): Something was found in an unconfigured or misconfigured state.

For more info click here.

Ian Boyd
  • 246,734
  • 253
  • 869
  • 1,219
Hitesh Savaliya
  • 1,336
  • 13
  • 15
2

Maybe it's not because of the xcodebuild not returning non-zero when build failed. Your shell script continuing to run regardless of the returning-error line might be the result of that you didn't run the script with a "-e" option.

Try put #!/bin/bash -e ahead of the script file.

partyspy
  • 31
  • 4
0

Generally, you can always check the exist value for the last run process in Unix bash by:

$ echo $?

where $? is a built-in placeholder of the exist value of last executed command. For more details about other bash's built-in variables see here.

So, first run your command you want to investigate its return code, then run echo as above.

MoeNeuron
  • 78
  • 8
-1

Whether the compiled product (.a or .ipa file)exists

shede333
  • 1,105
  • 10
  • 7