なっく日報

技術やら生活やらのメモ

Jenkinsにdeploy keysをリポジトリ毎に設定するのが面倒くさい

m(__)m

yukidarake.hateblo.jp

の記事で

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github-foo.pem
    IdentityFile ~/.ssh/github-bar.pem

みたいに書けばJenkinsの鍵をいちいち~/.ssh/configに追記しないでOKだと書いたけど、これだとgit pushできないという指摘がありました。

実際、複数リポジトリにdeploy keysを設定していると、git push先のリポジトリで、最初にsshの認証が通った鍵で権限があるか判定されてしまい、(違う場合)権限がないよと怒られます。

申し訳ありませんm(__)m

が、このままだと悔しいので何か方法がないか探してみました。

GIT_SSHという環境変数

qiita.com

で知ったのですが、GIT_SSH=./git-ssh.sh git push origin master みたいにsshコマンドをラップさせたりできると。

これでpush先のリポジトリ名が取れれば、秘密鍵を使い分けできそうです。

ラッパースクリプト

こんな感じで書いてみました。sedは使えないのでperlです。

#!/bin/sh
KEY=$(echo "$@" | perl -pe "s{.+'/?(.+?)/(.+?)\.git'}{~/.ssh/github.com/\$1/\$2.pem}")
exec ssh -i "$KEY" "$@"

これで、~/.ssh/github.com/yukidarake/chau.pem みたいなdeploy keys用の秘密鍵を配置して、下記コマンドを実行します。

GIT_SSH=./git-ssh.sh git clone git@github.com:yukidarake/chau.git

# 何か編集して、git commit
GIT_SSH=./git-ssh.sh git push origin master

いけました!

export GIT_SSH=~/git-ssh.sh

とかを.bashrcに足しておけば、もはや~/.ssh/configの設定も必要なくなってしまいます。

まとめ

多分、大丈夫だと思いますが、うまくいかない場合コメントいただければと。

どなたかの参考になれば幸いです。