14. September 2015
This article is Part 3 of a whole series called Xcode Server Hacks. Check out Part 2 first if you haven't already. New posts are always tweeted by me (@czechboy0.dev) on Bluesky.
In Tutorial 3: Prebuild & Postbuild Scripts we discussed running many useful tools like CocoaPods and fastlane with each Integration of our code. However, this became a bit more complicated with the introduction of the new rootless mode in OS X El Cap. Also, if you prefer to use version managers like rvm
, nvm
for your Ruby and Node versions, this will help you keep using them instead of having to install your CLI tools globally.
TL;DR? Login as
_xcsbuildd
, install your tools and then addsource ~/.bash_profile
to your bot scripts.
The goal is to get a prebuild script like this working again (where PROJECT_NAME
is your project’s name), which breaks if you’re using rvm
or are using El Cap.
cd PROJECT_NAME
fastlane prebuild
1. Installing rvm for _xcsbuildd
Many of us like to keep around multiple versions of Ruby and Node with version managers like rvm, nvm and other *vm
tools. These tend to install the tool in question into your home directory, e.g. ~/.rvm/...
for Ruby.
However, as we found in the last tutorial, environment config files like ~/.profile
, ~/.bash_profile
and ~/.zshrc
don’t get loaded for the _xcsbuildd
user before Xcode Server performs a build.
The way to fix that is to install rvm
(or any other version manager) when you’re logged-in as _xcsbuildd
. So let’s do that, log in as _xcsbuildd
with:
sudo su - _xcsbuildd
and install rvm
and the latest stable version of Ruby with
\curl -sSL https://get.rvm.io | bash -s stable
source ~/.profile
rvm autolibs read-only
rvm install ruby
(the second line will fixes a Homebrew permissions issue)
2. Force-load ~/.*profile in your scripts
There, _xcsbuildd
(Xcode Server’s build user) now has the same Ruby version that you need to run fastlane
(in our example). However, this alone won’t work, because _xcsbuildd
doesn’t load its environment config files like ~/.bash_profile
. We have to do that in our script manually, by adding source ~/.bash_profile
(if you’re using bash
, otherwise replace with your shell’s config file) to the prebuild script itself. The new prebuild script then looks like:
cd PROJECT_NAME
source ~/.bash_profile
fastlane prebuild
Help me help you
Don’t you absolutely hate this? I do. And I would greatly appreciate if you dupped my open radar requesting that _xcsbuildd
loads its config files properly. Let’s hope that this gets fixed ASAP!
I hope you found this useful or interesting. For criticism, praise and future articles, I’m @czechboy0.dev on Bluesky.