Released Xcode 11.2 and macOS 10.15 (Catalina)

We have released Xcode 11.2, which will replace the beta release.

The new image contains Xcode 11.2, running on Catalina.

You can select this image by selecting 11.2.0 as follows:

jobs:
  build:
    macos:
      xcode: 11.2.0

This is the first image that we’ve built with Catalina, so there might be some bugs – please let us know if you find anything out of the ordinary.

Highlights

  • The OS has been upgraded to macOS 10.15 (19A602) Catalina.
  • The timezone is changed to GMT. We used to set the timezone to PDT/PST, which caused some problems each time there was a daylight saving change.
  • Ruby is 2.6.3
  • The default shell is bash --login.
  • Xcode 11.2 Build 11B52
  • The runtimes installed are:
  • iOS 12.2
  • iOS 12.4
  • iOS 13.2
  • tvOS 12.4
  • tvOS 13.2
  • watchOS 5.3
  • watchOS 6.1

The manifest of installed software is here.

Ruby

The last few releases of Xcode on CircleCI were problematic for Ruby users, due to issues with how Xcode 11 shipped the macOS SDK. This forced us to make some breaking changes with Ruby. My hope is that upgrading to Catalina will resolve these issues, and using Ruby will be more straight forward.

Shells

Catalina ships with zsh as the default shells, but with CircleCI, the default shell is still bash. By default, commands on macOS run with /bin/bash --login -eo pipefail -c $COMMAND.

You can customize the shell for an executor, job or run command, which will allow you too run a command with zsh, should you wish:

jobs:
  build:
    macos:
      xcode: 11.2.0
    shell: zsh
    steps:
      - run: echo Hello from zsh.

We’ll be needing Xcode 11.2.1 Build 11B53

I think you mean this contains Xcode 11.2 release (GM)?

which is not a useful version as you cannot submit releases to apple with this release.
Xcode 11.2.1 Build 11B53 is required

Yes, thanks, that was a copy-paste error from the previous announcement. Thanks for flagging, I’ve edited the post to fix it.

Hi Mike,

Thanks for pointing that out – I didn’t realise there was an issue with 11.2.0.

I’m building an 11.2.1 image now, and I’ll keep this thread updated with the progress.

Marc

1 Like

Thanks @marc. We’re waiting on this new image!

Cheers

@marc Is there a reason chruby auto-switching was disabled?

We use .ruby-version to keep our interpreters on the same version across our team and CI, which works great, or at least it did until now. Now I have to go back and add extra scripting to turn it on everywhere that our build scripts use ruby.

1 Like

Hi Josh,

Sorry about the change with Ruby. It’s was my doing.

I’m trying to find a delicate balance with how much customization to do to macOS when we create the images. Here is a short history of the recent Ruby changes for context:

  • Our policy with Ruby has been to ship the system Ruby as the default Ruby, and to install the latest stable versions of Ruby as listed on ruby-lang.org. Switching was up to the user.
  • The images prior to Xcode 11 all had the system Ruby as the default image. chruby and the auto-switcher were installed, and sourced in ~/.bash_profile. Since we used a non-login shell by default on all operating systems, this mean that auto-switching didn’t run out of the box. If you changed your shell to bash --login, this would trigger ~/.bash_profile to be run before each step, and auto-switching would work.
  • When Xcode 11 shipped, things broke for our users. Xcode 11 included the macOS 10.15 SDK, which had the system headers for Catalina, including the Ruby 2.6 headers (rather than Ruby 2.3 that shipped with Mojave). This left our customers unable to install gems that had native dependencies. To work around this, I changed the default Ruby to be 2.6. To do this, I had to enable the chruby autoswitcher, by changing the default shell to be bash --login. I also created a ~/.ruby-version file with ruby 2.6 specified. This change to the shell broke a bunch of folk’s builds (sorry!), but it was the only way to make Ruby work with Xcode 11 on Mojave without major changes on our side. Most of the problems that caused people’s builds to break were because the autoswitcher was enabled when it wasn’t before. This change in behaviour affected people using all images, not just Xcode 11, which was frustrating for us and our users.
  • Our Xcode 11.2 image ships on Catalina, which solves the macOS SDK and Ruby header issue, so the system Ruby works again. So I’ve left the system Ruby as the default on Catalina (this change has broken people’s builds who are upgrading from 11.0 and 11.1, since they expected to be able to install gems out of the box without requiring sudo).

I decided to not include the auto-switcher by default on Xcode 11.2. With the autoswitcher enabled by default or off by default, peoples build will break when upgrading from earlier images.

The reason that I decided to leave it off by default, is that it’s easier for users who don’t expect it to understand the system. There is no “magic” happening in the default image. To enable autoswitching, you will have to add an explicit step to your build. In my opinion (and I’m not claiming to be right), it’s easier to explain to someone that they need to enable the autoswitcher to select different versions of Ruby, than to explain to someone that they need to remove the autoswitcher from their bash profile to disable it.

I’m trying to thing of the neatest way to enable autoswitching using a command. Maybe something like this (I might publish a macOS orb to do this):

version: 2.1

commands:
  enable_ruby_switcher:
    steps:
      - run:
          name: Install Ruby Switcher
          command: echo 'source /usr/local/share/chruby/auto.sh' >> ~/.bash_profile

jobs:
  build:
    macos:
      xcode: 11.2.0
   steps:
    - checkout
    - enable_ruby_switcher
    - run: bundle install

Using a command like this will mean that you don’t need to specify the Ruby version in your config.yml, you can keep the information in .ruby-version.

Sorry again for all of these changes – we’re reacting to the changes as Apple makes them – ideally yhe build environment would be stable and predictable – I know that’s what you need from us.

Marc

2 Likes

@marc Thanks. I’ve always used a --login shell to run scripts on circle, so I guess I never noticed the changes you mentioned before.

I’m sure moving the VM over to a new OS is not easy for you guys. Just please, whatever config you decide works best for everyone, try to stick to it for future releases. (Easier said than done, I know… fingers crossed)

I was leaning towards putting it into .bash_profile as well, by just copying a profile out of my project and into ~/ right after code is checked out. (I never checked but I’m presuming a clean CircleCI VM has no ~/.bash_profile when it starts?)

@marc should we expect the new image today?

Hi Kevin,

It won’t be today – I’ve just started the copy of the image, it will run overnight and I’ll enable it in my morning (I’m based in Ireland).

Marc

Hi Josh,

The ~/.bash_profile, ~/.bashrc and ~/.zshrc are all the same, they contain this:

export LC_CTYPE=en_US.UTF-8
source /usr/local/share/chruby/chruby.sh

Marc

@marc Good to know. Rather than overwrite ~/.bash_profile, I’ll just concatenate my changes on the end so I don’t clobber CircleCI’s settings.

Thanks @marc. I’ll look for it in the morning.

This is live now - Xcode 11.2.1 GM Seed 1 Released