Search code examples
gradleandroid-buildcircleci-2.0

How to resolve $TERM not set on gradlew ./assembleRelease on CIrcleCI?


I'm building a workflow on circleci 2.0 and so far jobs are running until it gets to android job.

At the build step ./gradlew assembleRelease it fails stating that an ENV VAR is not set:

Unzipping /home/circleci/.gradle/wrapper/dists/gradle-2.14.1-all/8bnwg5hd3w55iofp58khbp6yv/gradle-2.14.1-all.zip to /home/circleci/.gradle/wrapper/dists/gradle-2.14.1-all/8bnwg5hd3w55iofp58khbp6yv
Set executable permissions for: /home/circleci/.gradle/wrapper/dists/gradle-2.14.1-all/8bnwg5hd3w55iofp58khbp6yv/gradle-2.14.1/bin/gradle

FAILURE: Build failed with an exception.

* What went wrong:
Could not open terminal for stdout: $TERM not set

What I did try according to this post is setting the $TERM variable is a run command prior to the gradle invocation. But the build still fails looking for this variable.

Question:

How can you resolve $TERM not set on gradlew ./assembleRelease on CIrcleCI?

I did verify that I'm using the correct docker image according to this SO post:

https://stackoverflow.com/a/45744987/1829251

Here is the config.yml gist of the android CI Job:

 android:
    working_directory: ~/repo/android
    docker:
      - image: circleci/android:api-25-node8-alpha
    steps:
      - checkout:
          path: ~/repo
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - attach_workspace:
          at: ~/repo
      - run: ./gradlew androidDepedencies    
      - run: export TERM=xterm   
      - run: sudo chmod +x ./gradlew
      - run: ./gradlew assembleRelease
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - store_test_results:
path: ~/repo/android/reports

Solution

  • disclaimer: Developer Evangelist at CircleCI

          - run: export TERM=xterm
    

    That line sets the variable $TERM only for that specific shell. Each run step starts a brand new shell.

    Your solution of running gradlew in the same step is one possible solution:

     - run: export TERM=xterm && ./gradlew androidDepedencies  
    

    Another would be to properly export $TERM so that all subsequent steps can see the variable. This would be done like this:

          - run: echo 'export TERM=xterm' >> $BASH_ENV
    

    $BASH_ENV contains the path to the Bash file that is sourced at the beginning of every CircleCI step. Here's where this came from: https://circleci.com/docs/2.0/env-vars/#setting-path