会社にProxyを立てていて、その中にGitサーバーがたっていて、
AWS内のサーバーと連携させたいんだけど当然AWS側からは参照できないときに使えるTips。
JenkinsをつかってProxy外のGitと同期をとる
ちょっと手間ですが、AWS内にJenkinsSlaveを構築することで、Jenkinsを仲介して(JenkinsのMaster-Slaveの関係をつかって)自動化することが可能です。
構成
Jenkins master (社内:Proxyない) --> Jenkins Slave (AWS VPC or Classic)
下準備1 Jenkins Master, Slave 設定
社内のJenkinsMasterから、AWS内のJenkinsSlaveサーバーにアクセスできるようにSSHの鍵設定、通常のJenkinsSlave用の設定を行い通常のJenkins Job連携(JobAが終わったらJobBをキックする)が動くことを確認しておきます。
下準備2 Git repository の初回転送
下記を参考にJenkins Slave サーバーの/opt/git 以下に 同期させたいリポジトリを転送しておく
事前に/opt/git を ssh user で rwx 権限を付けておくこと。
ローカルPCで実施
$ git clone --bare my_project my_project.git
$ scp -r my_project.git user@git.example.com:/opt/git
Jenkins Slave で実施
$ cd /opt/git/my_project.git/
$ git init --bare --shared
Reinitialized existing shared Git repository in /opt/git/my_project.git/
Jenkins の設定
いよいよJenkinsの設定ですが、2つジョブを作ります
各Jobで実行するインスタンスを指定することができるのでそれぞれMaster,Slaveを指定します。
Master側のJob1.Master側で社内Gitサーバーを監視、更新をPullして、Slave側にPushする、Job2をキック
Slave側のJob2. 自サーバー内のOpt/gitから 最新をPullして 望みの処理を実施する。
Jenkins Master 側のJob例
#!/bin/bash -xe
#echo "## current dir:"
pwd
ls -al
git checkout $BRANCH_NAME
git branch -a
git pull
export http_proxy="http://proxy.XXXyourproxyserverXXX/";
export https_proxy="http://proxy.XXXyourproxyserverXXX/";
git push ec2-user@XXXyour_jenkins_slave_server.com:/opt/git/$REPOSITORY.git
Jenkins Slave側のJob例
以下では例として、chefポジトリの更新に反応して,
knife solo を実行させる簡単な例です。
#!/bin/bash +e
ls -al
echo "check already cloned?"
echo $REPOSITORY
if [ -d $REPOSITORY ]
then
cd $REPOSITORY
echo "##Do git checkout"
git checkout $BRANCH_NAME
echo "##Do git pull"
git pull
else
echo "## git clone"
git clone /opt/git/$REPOSITORY.git
cd $REPOSITORY
echo "## git checkout"
git checkout $BRANCH_NAME
echo "## knife solo init"
knife solo init .
fi
git branch -a
ls -al
cd $TARGET_DIR
echo '## start'
##berks install skipped
chmod 755 ./echo_hosts.sh
./echo_hosts.sh | xargs -n 1 knife solo bootstrap
改善の余地
Slave側のJobの記述方法は通常のJenkinsのGitPluginを活用したほうがきれいになるでしょう。
やってることが分かりやすく伝えるためにスクリプトにしています。