@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

BitBucketにpushしたらOpenShiftのJenkinsから別のOpenShiftにgit pushする

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.

serverfault.com

鍵と同様に~/.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を書いた.

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

だいたいこんな感じ