I use Travis CI to do unit testing for my open source project. While configuring my .travis.yml
file I’ve seen examples on several other projects.
When the statement is executed as a conditional, I understand the need for || true
to ensure the command returns “success” and allows the script to continue. A non-match on the name would be false, omit execution of later commands after &&
, but eventually return successful after || true
.
- '[ "${TRAVIS_OS_NAME}" = "osx" ] && brew install ant || true'
However, I have also seen the conditional applied after if ... fi
conditionals, such as this example:
- if [ "${TRAVIS_CPU_ARCH}" == "arm64" ]; then
sudo apt-get install openjdk-11-jdk libltdl-dev;
export JAVA_HOME=/usr/lib/jvm/SolarUltima/java-11-openjdk-arm64;
export PATH=$JAVA_HOME:$PATH;
fi || true
My own testing indicates it makes no difference whether that’s included or not. For example, this conditional does not stop the test, even when it evaluates to false. Like below:
if [ "${TRAVIS_BRANCH}" == "coverity_scan" ]; then exit 0; fi
Travis produces this output, showing a “true” result, so for me it begs the question when is the proper time to use || in bash.
Hey Ultima,
This answer is a little nebulous, but I’ll do my best. When the script is executed in an environment variable when its execution will stop if any of the expressions will return with nonzero exit status. Such examples are with set -e
or say in Python, an example would be *args
and or **kwargs
. This is true with mostly all CI/CD tools.
The hierarchy would look like this:
false && true
# $?Montana is 1
This will ultimately exit with a nonzero
exit status. I find people, including myself using the || true
iterator, or tersed, ||:
in such scripts to make the commands lists with &&
(on some exclusions grep
can be in there). This will exit with zero
status even if one of the commands fail, this can be avoided occasionally by using the skip
flag. Typically:
[ -e "env_file" ] && . "env_file" ||:
I have also seen the conditional applied after if
, so something like fi
conditionals. You’ll see similar things in bash scripts with more complex Docker instructions. I do this when setting more complex Docker environments up.
Really in this niche case when concerning Travis CI, this certain usage you showed seems to be some left-over or inserted conditions by some SecOps programmer I’d have to assume on he/she wrote the script, remember export
always returns with a zero
exit status.
If the expression in if
will exit with zero
exit status then the if
body will usually execute. The exit status of if
command is the exit status of last command executed (as useall look at the manpage for more information in groups).
if true; then
montana dont care;
montana dont care;
false
fi
# exits with exit status of false
Thus the programmer him/herself can insert || true
to make the exit status of if
expression to zero
. Once writing bash scripts for build instructions as it seems you are you’ll run into this more and more.
1 Like
thanks for the code examples, this makes sense now, even looking at manage could not find this as Montana thank you