CircleCIでbatsによるbashのテストがエラー #Bash #CircleCI

概要

CircleCIでbatsによるBashのテストをしてたんだけど、特に改修していないのにCIがコケるようになってしまった。

どうもbatsがtputなるコマンドを使っているようで、 tput$TERM という環境変数が必要なようだ。

CircleCIの使ってるビルド環境から $TERM 変数がアップデートとかでいなくなってしまったのだろうか。

config.yml

batsファイルをリストアップしてbatsコマンドで実行しているだけである

version: 2
jobs:
  build:
    machine:
      enabled: true
    steps:
      - checkout
      - run: find . -type f -name "*\.bats" | xargs bats -p

エラーメッセージ

Hangupとか言われているのが気になるが、 tput: No value for $TERM and no -T specified を解決してあげると動くみたい。

#!/bin/bash -eo pipefail
find . -type f -name "*\.bats" | xargs bats -p
tput: No value for $TERM and no -T specified
/usr/local/libexec/bats-exec-test: line 321:  6811 Hangup                  "$0" $BATS_EXTENDED_SYNTAX "$BATS_TEST_FILENAME" "$test_name" "$test_number"
Exited with code 123

原因

どうも tput はTerminalを操作するコマンドらしい。

表示する色を変えたりできるみたい。

んで、batsは結果表示するときなんかに tput を使用しているっぽくって、そこで ${TERM} 変数がなくてエラーになっているのではないかと。

github.com

対応

${TERM}環境変数に設定する。

export TERM="dumb"

意識したことないけど、 screen だとか tmux とかもこの変数に入ったりするみたい。

自分のローカルMacだと xterm-256color だった。

dumbは「ダム端末 - Wikipedia」に由来しているようだけど、何もしないターミナルってことを表現しているのだろうか。

余談

discuss.circleci.com

CircleCIのフォーラムっぽいので語られていたのが解決の糸口になった。

これ少し前の投稿なので、デグレかな?とも思ったけど、TerminalのことCIが気にするのも何か変な気がする。。

デグレだとしたらそのうち直る気がするけど、直らない可能性も十分にありそう。

いずれにせよ、CircleCIでは結構こういうこと(ユーザ側で何も変更していなくても、CI側の変更でCIが通らなくなってしまうようなこと)が多い気がする。

他のCIツールだとどうなんだろ。自前コンテナ作ってCI環境安定させたほうがいい気がしてきた。

参考