BitBucketのpushフックで,Jenkins経由でOpenShiftにデプロイしてみたかった.
想定する環境はjenkinsと,push先の2つのgear.
前者が1234@j-hoge.rhcloud.com
,後者を5678@p-hoge.rhcloud.com
とする.
p-hoge.rhcloud.com
のIPは1.2.3.4
とする.
それぞれ公開鍵を登録して,ssh接続できる状態.
秘密鍵と公開鍵の作成
OpenShiftの環境では~/.ssh/id_rsa
を書き込めないので,$OPENSHIFT_DATA_DIR
の下に作る.
j-hoge.rhcloud.comでの作業
> echo $OPENSHIFT_DATA_DIR /var/lib/openshift/1234/app-root/data/ > ssh-keygen # id_rsaのパスを聞かれた時に$OPENSHIFT_DATA_DIR/.ssh/id_rsaにあたる場所を指定する. # この例では /var/lib/openshift/1234/app-root/data/.ssh/id_rsa
ここで作成した$OPENSHIFT_DATA_DIR/.ssh/id_rsa.pub
をOpenShiftの鍵に追加する.BitBucketにも同様に鍵を追加する.
known_hostsの作成
GIT_SSHの設定を書いて呼び出すとこんなエラーが出る.
Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
鍵と同様に~/.ssh/known_hosts
を参照も書き込みもできないので,$OPENSHIFT_DATA_DIR
の下にknown_hosts
を作成する.
j-hoge.rhcloud.comでの作業
> ssh-keyscan -H p-hoge.rhcloud.com,1.2.3.4 >> $OPENSHIFT_DATA_DIR/.ssh/known_hosts > ssh-keyscan -H 1.2.3.4 >> $OPENSHIFT_DATA_DIR/.ssh/known_hosts > ssh-keyscan -H p-hoge.rhcloud.com >> $OPENSHIFT_DATA_DIR/.ssh/known_hosts > ssh-keyscan -H bitbucket.org,131.103.20.167 >> $OPENSHIFT_DATA_DIR/.ssh/known_hosts > ssh-keyscan -H 131.103.20.167 >> $OPENSHIFT_DATA_DIR/.ssh/known_hosts > ssh-keyscan -H bitbucket.org >> $OPENSHIFT_DATA_DIR/.ssh/known_hosts
gitのsshをラップする
gitが使うsshをラップする$OPENSHIFT_DATA_DIR/wrapper
を書いて実行権限を与える.
UserKnownHostsFile
オプションでknown_hostsの場所を指定できる.
#!/bin/bash ssh -o UserKnownHostsFile=$OPENSHIFT_DATA_DIR/.ssh/known_hosts -i $OPENSHIFT_DATA_DIR/.ssh/id_rsa $1 $2
これでssh接続できることを確認する.接続できなければ,公開鍵を登録し忘れてないか確認する.
[j-hoge.rhcloud.com 1234]\> ssh -o UserKnownHostsFile=$OPENSHIFT_DATA_DIR/.ssh/known_hosts -i $OPENSHIFT_DATA_DIR/.ssh/id_rsa 5678@p-hoge.rhcloud.com (略) [p-hoge.rhcloud.com 5678]\>
Jenkinsでpullとかpushとかする
ジョブの設定でリモートリポジトリはbitbucketにしてあるので,cloneされる. OpenShiftのリポジトリをリモートに追加して,ジョブのビルドスクリプトにpullとpushを書いた.
- OpenShiftのリポジトリを追加
cd $OPENSHIFT_DATA_DIR/workspace/reponame git remote add p-hoge ssh://5678@p-hoge.rhcloud.com/~/git/reponame.git/
- ジョブでpullとpush
(追記 :date "2015/08/25" :contents "認証情報がなかったのpullできなかった。あと、Jenkinsがorigin/masterはfetchしてくれてるのでmasterにマージすればよかった。")
git checkout master git merge origin/master GIT_SSH=$OPENSHIFT_DATA_DIR/wrapper.sh git push p-hoge master
だいたいこんな感じ