Carpe Diem

備忘録

CircleCIのsshで困ったこと

概要

CircleCIにはビルドが失敗した際のデバッグ手段としてRerun Job with SSHが提供されてます。

これを押すとEnable SSHというステップが挟まれ、そこに書いてあるsshコマンドをターミナルで実行することでCircleCIで実行中のジョブ内に入ることができます。

ただその中でいくつかハマった点があるので対処法とともにまとめます。

環境

  • CircleCI 2.1
  • circleci/golang:1.17

ハマったこと

go: command not found

circleci/golang:1.17というimageにsshしているはずなのに、goコマンドがないと怒られます。

root@xxx:~# go version
-bash: go: command not found
root@xxx:~# which go
root@xxx:~#

ローカルでは--loginを付けることで再現できます。

$ docker run -it circleci/golang:1.17 /bin/bash --login
circleci@2508ab566e1c:/go$ go version
bash: go: command not found

対処方法

goバイナリが置いてあるディレクトリをPATHに追加します。

デフォルトではPATHは以下ですが、

root@xxx:~# echo $PATH
/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

goバイナリは/usr/local/go/binにありました。

なので以下のコマンドでPATHを通すことで使えるようになります。

root@xxx:~# export PATH=/usr/local/go/bin:$PATH
root@xxx:~# go version
go version go1.17.5 linux/amd64

tabやbackspaceが効かない

tab補完が効かなかったり、backspaceで削除しようとしてもカーソルが前に進むだけで消えないという状態です。

これはsshの時にローカルのTERM環境変数の値を渡して変な状態になっていることで発生しました。

root@xxx:~# echo $TERM
tmux-256color

対処方法

なのでsshしているシェルの中で

root@xxx:~# export TERM=xterm

とするか、そもそもsshする際にTERMをxtermに設定するよう.bashrcにaliasを貼ります。

alias ssh='TERM=xterm ssh'

参考