Jenkins に持たせた認証情報を シェルの実行 (Execute shell) 機能で実行するシェルスクリプト内から使う方法を紹介。

今回僕が出会ったケースは、GitHub からリポジトリを checkout して走るジョブがあり (Git plugin を使ってる) 、シェルスクリプトの中で checkout 時に使った認証情報を使い git push を実行したい、というものでした。

別途、鍵ファイルをサーバ上のどこかに置くのは避けたかったので何か方法はないか調べてみたところ、Credentials Binding Plugin を使うことで資格情報を環境変数に bind させることができるようでした。

今回は git コマンドの例を紹介していますが、 Jenkins のクレデンシャル管理機能を使っていれば他のツールなどにも応用できるかと思います。

まずはジョブのリポジトリ設定から。 ソースコード管理認証情報 からリポジトリの取得に使用する SSH 秘密鍵を登録する。

鍵の登録が終わったら 認証情報 のプルダウンメニューで登録した鍵を選択しておく。

そして、登録した秘密鍵を環境変数にバインドする設定を追加します。 ビルド環境秘密テキストや秘密ファイルを使用する にチェックを入れると バインディング という設定項目が現れます。 SSH User Private Key を選び、 Key File Variable と先程追加した 認証情報 を選択します。 ここで指定した変数名をファイルパスとして参照することで、シェルスクリプト実行時に Jenkins 管理下の認証情報を利用することができるようになります。

あとは ビルド 設定項目の シェルの実行 の中にシェルスクリプトを記述するだけ。

#!/bin/bash
## チェックアウトされたリポジトリのディレクトリへ移動
cd $WORKSPACE/hugahuga-repo
## なにか変更を加えて、
git checkou -b foo_branch
## 環境変数で指定した認証情報を使い git push
GIT_SSH_COMMAND="ssh -i $GIT_SSH_KEYS_PATH -F /dev/null" \
  git push git@github.com:hogehoge/hugahuga-repo.git foo_branch

今回のケースでは $GIT_SSH_KEYS_PATH という環境変数で参照できるようになっています。 git コマンド実行時に使用する秘密鍵を指定するのには $GIT_SSH_COMMAND 環境変数を記述することで指定可能です。

Qiita
~~git の支援が弱くて変なやり方しかない。~~ EDIT: [git 2.3](https://github.com/blog/1957-git-2-3-has-been-released) 以降で `GIT_SSH_COMMA...