If your CI has
<tool_name> installed already:
brew update || brew update brew outdated <tool_name> || brew upgrade <tool_name>
brew update || brew update brew install <tool_name>
Ideally you would have everything your scripts depend upon checked in with the repo, but let's be honest, this is sometimes not practical.
Some tools, for example
xctool, can either be fetched as a git submodule, with all the problems coming with this approach, or via Homebrew in a simpler way.
What the two lines at the start of the post do is downloading the latest version of
<tool_name>. Let's look at them in more detail.
brew update will fetch the latest formulae, making sure that if you are running on the latest version of a tool, but your CI isn't, the latest version will be the one downloaded by the upgrade command later.
brew update || brew update
We are doing
brew update || brew update because sometimes a formula might break the first run of the update command, but running it a second time will succeed. More on this issue here.
|| is the logical OR that we use in everyday programming as well. Every command line operation has a return code of
0 if everything went fine, non
0 otherwise. This means that if your execute
command a || command b and
command a returns fails returning something that is not
command b is executed. If instead
command a succeeds then the OR is already true, and
command b will not run. This is quite a neat trick.
|| in the first line makes sure that if the first update fails, then a second attempt will be made.
brew install <tool_name>
The second line differs depending on whether your CI provider gives you a box with the tool you are after already installed. If that's not the case then you'll simply have to install it yourself with
brew install, otherwise you will need to update it, or in Homebrew terminology
brew outdated <tool_name> || brew upgrade <tool_name>
Since attempting to upgrade and up to date formula would result in a failure, you'll have to check if the local version is outdated. This can be done using the same
|| expedient. If
brew outdated doesn't return
0 then it means that the tool is not up to date, and should be updates using
That's all folks. If you have any questions please do leave a comment below, or even better, reach me out on Twitter @mokagio.
Happy coding, and leave the codebase better than you found it.