Ember + Travis CI Broken Builds

Posted on

If you’re suddenly getting this warning:

No command 'ember' found, did you mean:
 Command 'enber' from package 'asn1c' (universe)
ember: command not found

you’re not alone. This article will show you how to fix to fix it.

Fixed Upstream (for now)

Travis-CI has deployed a fix on their end to restore the previous behavior (PR). However, it is likely that this will change again, so making a change below is probably a safe idea.

The Problem

The problem stems from this change to Travis CI. It removes node_modules/.bin from the system path. When ember-cli is installed from package.json, it places a link to the ember binary in that directory. Since ember-cli isn’t installed globally, the system can’t find the executable.

The good news is that npm run automatically adds node_modules/.bin to the path at runtime. From their docs:

In addition to the shell’s pre-existing PATH, npm run adds node_modules/.bin to the PATH provided to scripts. Any binaries provided by locally-installed dependencies can be used without the node_modules/.bin prefix

Ember Apps

If you’re experiencing this problem, you’re likely a legacy user who hasn’t run ember init in a while. To fix the problem, simply make sure you have ember test defined in your package.json:

{
  ...

  "scripts": {
    "start": "ember server",
    "build": "ember build",
    "test": "ember test"
  }

  ...
}

Then, change your .travis.yml to match the newer blueprint, by running npm test vs. ember test.

  script:
    - npm test

If you’re using any special options, you can pass them like this:

  script:
    - npm test -- --launch Chrome

Ember Addons

This is a little more complex since ember-try is called directly. It sounds like the ember-cli team is updating the blueprint as we speak. As a temporary workaround, you can do something like this.

In your package.json create a test script that looks like this:

{
  ...

  "scripts": {
    "start": "ember server",
    "build": "ember build",
    "test-ci": "ember try:one"
  }

  ...
}

Then, call it like this from your .travis.yml:

  script:
    - npm run test-ci -- $EMBER_TRY_SCENARIO test --skip-cleanup

I’ll update this issue once the core team updates the blueprint, if it differs from this solution.

Upstream PR to Ember CLI

A PR is open for this issue. It uses a slightly different strategy, by calling the binary directly in travis.yml:

  script:
    - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup

Problems?

If you run into problems, let me know on the ember community slack.

Find an issue?
Open a pull request against my blog on GitHub.
Ben Limmer