JenkinsでCygwinを使う


仕事で Windows にインストールした Jenkins を使う機会があったのでまとめ
Jenkins x Cygwin に関する記事があまりなかったので備忘のために書きます

※Windows を使いなれていない人向け

環境

Windows10
64bit

インストール

インストールについてはいろいろ記事があるので簡単に

Windows にJenkinsをインストール

https://qiita.com/4_mio_11/items/de90df3682323c30319a
とかわかりやすいです

Cygwinのインストール

https://cygwin.com/install.html
setup-x86_64.exe をダウンロードして実行
言われるがままにOKを押してインストールします(自己責任で)

C:\cygwin64\bin\sh.exe が作られたことを確認します
※64bitマシンの場合、ディレクトリ名に 64 がついてますね

Jenkins設定

Jenkinsを開き、 Jenkins -> Manage Jenkins -> Configure System と選択

Shell -> Shell executable の欄に、先ほど確認した Cygwin の実行ファイル(C:\cygwin64\bin\sh.exe)を指定

ジョブ作成

通常の手順でジョブを作ります
Build 項目でビルドステップを追加します。このとき Execute shell を追加。
これにより、先ほど設定した C:\cygwin64\bin\sh.exe をシェルとしてコマンドが実行できるようになります。
Execute Windows batch command は選択するな!絶対にだ! Windows batch なんて書きたくない

サンプルコード

実行環境を確認するために、試しに以下のように書いて動かしてみましょう

大まか、以下のようなログがでます

Started by user <yourname>
Running as SYSTEM
Building in workspace C:\Program Files (x86)\Jenkins\workspace\<job_name>
[cygwin] $ C:\cygwin64\bin\sh.exe -xe C:\windows\TEMP\jenkins5658594975380388795.sh
+ PATH='/cygdrive/c/cygwin64/bin:hogehoge...'
+ echo /cygdrive/c/cygwin64/bin:hogehoge...
+ /cygdrive/c/cygwin64/bin:hogehoge...
+ pwd
/cygdrive/c/Program Files (x86)/Jenkins/workspace/<job_name>
+ ls
+ whoami
SYSTEM
Finished: SUCCESS

解説

PATH=/cygdrive/c/cygwin64/bin:$PATH

これを先頭に書いておきます
Cygwin にパスを通しておくことで、Cygwin のあらゆるコマンドが使えるようになります

echo $PATH でパスが正しく入っているか確認します。確認できたらこの行は消しておきましょう

pwd

自分のいる位置は、jenkinsのworkspace の中ですね

ls

ファイルはまだ空っぽ
Cygwin のコマンドが使えていることがわかりますね(Windows batch だと dir です)

whoami

SYSTEM さんになっています
権限の問題もあるので、できればちゃんと自分のユーザになりたいところですが、Cygwin には su コマンドがないのです
調べたのですが、ちゃんとした解決方法がないようです(情報知りたいです)
(ポートを開けて ssh コマンドで localhost にログインするという手段などが取られているようです)

OK

これにて Cygwin が使えることが確認できました
bash とか zsh で使ってたコマンドがwindowsでも使えるようになって一安心ですね
(windows batch マジめんどい)

注意点

パスの指定方法に注意がいります
「windows から Cygwin は認識できない」ということです(表現が正確じゃないですが)

windows のパス指定は C:\...
Cygwin のパス指定は /cygdrive/c/... という感じですよね

Cygwin コマンド(ls, pwd, find...)を使うんであれば cygdrive 方式のパス指定をすれば問題ないのですが
Windows のプログラム (Program Files (x86)の中の物とか)に引数としてパスを渡す場合は、 C:\... 形式にしておかないと、認識してくれない場合があります
ここ、気をつけて使い分けないと、「パスが存在しません」的なエラーが出て頭を悩ますことになります

Cygwin用のディストリビューションが用意されているソフトウェアの場合は、そちらを使った方がいろいろと楽になると思います

Program Files (x86) のディレクトリ名にスペースが含まれているのが悪い