Jenkins/GitLabでデプロイツールを作る

【お題】下記条件を満たしたデプロイツールを作成せよ

  1. インスタンスの増減に対応
  2. ロールバックが可能
  3. 既存のデプロイツール(rsync)と融合
  4. 複数システムで使用

「SVN+Capistrano」のデプロイツールは実績があるものの下記課題があるため作り直す。

  • バージョン管理でconflictすると面倒くさい
  • デプロイ実行履歴がログからしか分からない
  • デプロイしたコンテンツの差分がコマンドからしか分からない
  • 世間的にお手製のツールは信頼性が低い

バージョン管理でconflictすると面倒くさい問題
→コマンド実行するサーバを絞る

デプロイ実行履歴がログからしか分からない問題
→Jenkinsで見やすく

デプロイしたコンテンツの差分がコマンドからしか分からない問題
→GitLabで見やすく

世間的にお手製のツールは信頼性が低い問題
→オープンソースをベースに

[1] GitLab
(1) GitLabの構築
http://blog.tmkn.jp/gitlab-install/
(2) Projectの作成
(3) Repoの初期設定

[code]
mkdir (プロジェクト名)
cd (プロジェクト名)
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@127.0.0.1:cloudpack/sample-project.git
git push -u origin master
[/code]

作っている最中に気がついた。GitLab/JenkinsサーバがSPOFであることに。

「デプロイを実行したのに本番に反映されないんだけど」
見えた、未来が見えたぞ…!!

(*)「インスタンスの増減に対応」と「ロールバックが可能」は分ける方針に変更
http://blog.tmkn.jp/ec2-rsync/

[2] Jenkins
(1) Jenkinsの構築
http://blog.tmkn.jp/jenkins-install/
(2) 各スクリプトの準備
1. devからコンテンツを持ってくるスクリプト
同期対象から「.git」を除外する。

[code]
#!/bin/bash
#############
# Sync2Repo #
#############

SYNCHOST=(`aws ec2 describe-instances –filters Name=tag-value,Values=”(devのEC2 NameTag)” |jq ‘.Reservations[].Instances[]|{PrivateIpAddress}’ | grep “PrivateIpAddress” | awk ‘{print $NF}’ | sed -e “s/”//g”`)

SRCDIR=”(コンテツのあるディレクトリ)”
DSTDIR=”(リポジトリのディレクトリ)”

rsync -avc –delete –exclude=’.git’ -e ‘ssh -c arcfour256 -o StrictHostKeyChecking=no’ ${USER}@${SYNCHOST}:${SRCDIR} ${DSTDIR}
[/code]

2. 持ってきたコンテンツをGitLabにcommit/pushするスクリプト
commitする際に変更がないよ返り値が1になるようでJenkinsがFAILEDしてしまった。
スクリプトでまとめた。

[code]
#!/bin/bash
##############
# Commit2Git #
##############

git add -A
git commit -m “`date –iso-8601=seconds`”
git push
[/code]

(3) Jobの登録

[3] 既存のデプロイツール
下記2つを既存のデプロイツールに組み込む。
(1) 「インスタンスの増減に対応」したスクリプト(*)
http://blog.tmkn.jp/ec2-rsync/
(2) Jenkinsのプロジェクトを起動するcurl
http://blog.tmkn.jp/jenkins-kick/

CentOSにJenkinsをインストールする

みんな大好きJenkinsおじさんをインストールします。

Javaまわりのインストール
[code]
yum -y install java-1.7.0-openjdk java-1.7.0-openjdk-devel
[/code]

リポジトリの取得
[code]
cd /etc/yum.repos.d/
curl -OL http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm –import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
[/code]

Jenkinsのインストール
[code]
yum -y install jenkins
[/code]

Jenkinsの設定
・ProcessTreeKillerの無効+Timezoneの設定
・起動ポートの変更(8080->8000)
・サブディレクトリの変更 http://(IPアドレス)/jenkins

/etc/sysconfig/jenkins
[code]
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.util.ProcessTree.disable
=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo"
JENKINS_PORT="8000"
JENKINS_ARGS="–prefix=/jenkins"
[/code]

Jenkinsの起動と自動起動設定
[code]
/etc/init.d/jenkins start
chkconfig jenkins on
[/code]

ttyなしでsudoできるように+jenkinsユーザにsudo権限を与える
visudo
[code]
#Defaults requiretty
jenkins ALL=(ALL) NOPASSWD:ALL
[/code]

nginxに80から8000へ飛ばす設定を追加
[code]
location ~ /jenkins {

proxy_pass http://localhost:8000;
}
[/code]

Jenkinsへアクセス
http://(IPアドレス)/jenkins