Github Actions: xcpretty is not found despite being installed

3.3k Views Asked by At

I'm trying to replace our iOS project's horrible Jenkins setup with Github Actions. I think I have all the pieces in place, but I'm getting a failure I don't understand. In the step where I run xcodebuild to build and test the app, I'm getting an error that xcpretty is an unknown command, despite being installed via bundler in a previous step. Here are the relevant files:

build-and-run.yml

---
name: Build & Test
on:
  # Run tests when a PR merges.
  push:
    branches:
      - develop

  # Run tests when PRs are created or updated.
  pull_request:
    types: [opened, synchronize, reopened]

  # Allow the workflow to be run manually.
  workflow_dispatch:

env:
  DEVELOPER_DIR: /Applications/Xcode_12.app/Contents/Developer

jobs:
  test:
    name: Build & Test
    runs-on: 'macos-latest'

    steps:
      - name: Checkout Project
        uses: actions/checkout@v2
        with:
          ref: develop

      - name: Setup Ruby
        uses: ruby/[email protected]
        with:
            ruby-version: 2.7.1

      - name: Restore Ruby Cache
        uses: actions/cache@v1
        with:
          path: vendor/bundle
          key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gem-

      - name: Restore Pod Cache
        uses: actions/cache@v1
        with:
          path: Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-

      - name: Bundle Install
        run: |
          bundle config path vendor/bundle
          bundle install --without=documentation --jobs 4 --retry 3

      - name: Install Cocoapods
        run: pod install --repo-update

      - name: Show Xcode Version
        run: xcode-select -p

      - name: Show Build Settings
        run: xcodebuild -workspace ./MyApp.xcworkspace -scheme 'MyApp-Test' -destination 'platform=iOS Simulator,name=iPhone 11' -showBuildSettings

      - name: Test MyApp
        run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -workspace MyApp.xcworkspace -scheme MyApp-Test -destination 'platform=iOS Simulator,name=iPhone 11' -enableCodeCoverage YES -derivedDataPath build/derived-data clean test | xcpretty -s

      - name: Run Danger
        env:
          DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }}
        run: bundle exec danger

Gemfile (we don't use fastlane in the action, but I have to keep it in the Gemfile for now so the builds don't break on our Jenkins box):

source 'https://rubygems.org'

ruby '2.7.1'

gem 'cocoapods'
gem 'danger'
gem 'fastlane'
gem 'xcpretty'
gem 'danger-slather'
gem 'danger-swiftlint'
gem 'danger-xcode_summary'
gem 'xcpretty-json-formatter'

plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

In the Bundle Install step, the xcpretty gem is being installed:

Fetching xcpretty 0.3.0
Installing xcpretty 0.3.0

The Install Cocoapods step also works fine (probably because Cocoapods is pre-installed). When it gets to the Test MyApp step, the invocation creates an error:

Run set -o pipefail && env NSUnbufferedIO=YES xcodebuild -workspace MyApp.xcworkspace -scheme MyApp-Test -destination 'platform=iOS Simulator,name=iPhone 11' -enableCodeCoverage YES -derivedDataPath build/derived-data clean test | xcpretty -s

/Users/runner/work/_temp/9d3633bf-6dae-45d7-a303-1c68abb63d53.sh: line 1: xcpretty: command not found

And then the workflow hangs for a very long time, so I usually cancel it. Any idea why xcpretty is not being found? My thought is, the directory where the gem is installed isn't in the search path, but I'm not sure about how I would do that. I'm sure there's a reasonable solution to this, but I'm having trouble finding it and am tired of banging my head against a wall.

3

There are 3 best solutions below

0
On BEST ANSWER

Unfortunately, my solution was not at all tidy. I had to path into the gem installation directory and directly reference the gem executable. Thankfully, the relative path doesn't change, so I could just hardcode it into the test script. Maybe there's a more elegant solution, but once I got it working, I just dropped it.

And sorry if you're trying to reproduce this, but it was over a year ago and I left the company, so I don't have access to what the path was.

0
On
  1. I was facing the same issue while setting up fastlane to run my Xcode tests.
  2. Finally, solved the issue by adding PATH in Jenkinsfile as below.
  3. Note that SampleProject-TestCase-Executions is Sample app on my Desktop.
  4. Please find GitHub Demo App for more info.
node {
    stage "Run Fast file"    
    sh '''
    cd /Users/bhooshanpatil/Desktop/SampleProject-TestCase-Executions
    export PATH="$PATH:/usr/local/bin:/usr/local/bin:/usr/local/sbin$:"
    fastlane scan
    '''
}
0
On

Jenkins -> Manage Jenkins -> Configure System -> Global properties -> Environment variables -> Name: LC_ALL, Value: en_US.UTF-8