Jenkinsfile からコマンドを sudo で実行させたいときがあります。
そういうときの対処法を askpass をはじめ数パターンまとめてみました。
ユーザjenkinsの設定
まずはそもそもユーザ jenkins がsudoできるように設定が必要です。 下記のコマンドでまずユーザjenkins のパスワードを設定します。 パスワードは任意のパスワードでOKです。
| |
つぎに jenkins を sudo できるグループに追加します。Ubuntuのときは下記でOKです。
他のディストリビューションについてはググってみてください。
| |
ここまで来たら jenkins で sudo できるはずです。下記のように jenkinsにスイッチして whoami してみてください。 root と返ってくるはずです。
| |
ここまでは下記のどの方法をするにしても必要な作業です。
パスワード無しでsudoできるようにする
1つ目の方法は、ユーザ jenkins でパスワードなしでsudoできるようにしてしまう方法です。
乱暴すぎるのであまりおすすめはしませんが、まずは紹介します。
sudo の設定を変更する下記のコマンドを実行します。
| |
すべてのコマンドをパスワード無しで実行するには下記のように記述します。
| |
全部のコマンドは必要ない場合は必要なコマンドだけパスワードなしにもできます。
下記の例ではコマンド /path/to/command だけパスワードなしにする設定です。
詳細は「sudoers NOPASSWD」でググるといろいろ出てきます。
| |
expectコマンドを使う
対話的コマンドを自動化するツールにexpectがあります。
対話的なコマンドを自動化できるすぐれものです。ベースがTclなので結構とっつきにくいです。
Jenkinsfile にかくときはシェバンを /usr/bin/expect にすればOKです。下記の例はsudoするときの例です。
spawnがプロセス実行、expectがコマンドからのレス待ち、sendがコマンドへの入力です。
下記のコードを見ればなんとなくわかるかと思います。
最後のexpectはプロンプトの\$が表示されるのを待っています。
| |
askpassを使う
これが一番おすすめです。
askpassについてはなんかかきたい - askpassのことを書いておくに紹介記事がありました。
パスワードを標準出力に吐くスクリプトを作って、環境変数SUDO_ASKPASS にそのスクリプトのパスを設定すればOKです。
sudo するときに -A をつけます。
Jenkinsfile の例
Jenkinsで書くと下記のようになります。
パスワードを吐くスクリプトをワークスペースにおいてしまうと、ブラウザからアクセスできてしまうのでWORKSPACE_TMP を利用します。
| |
まとめ
Jenkinsfile から sudo する方法を説明しました。expect か askpass を使うのがいいかなと思います!