【お題】下記条件を満たしたデプロイツールを作成せよ
- インスタンスの増減に対応
- ロールバックが可能
- 既存のデプロイツール(rsync)と融合
- 複数システムで使用
「SVN+Capistrano」のデプロイツールは実績があるものの下記課題があるため作り直す。
- バージョン管理でconflictすると面倒くさい
- デプロイ実行履歴がログからしか分からない
- デプロイしたコンテンツの差分がコマンドからしか分からない
- 世間的にお手製のツールは信頼性が低い
バージョン管理でconflictすると面倒くさい問題
→コマンド実行するサーバを絞る
デプロイ実行履歴がログからしか分からない問題
→Jenkinsで見やすく
デプロイしたコンテンツの差分がコマンドからしか分からない問題
→GitLabで見やすく
世間的にお手製のツールは信頼性が低い問題
→オープンソースをベースに
[1] GitLab
(1) GitLabの構築
(2) Projectの作成
(3) Repoの初期設定
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
作っている最中に気がついた。GitLab/JenkinsサーバがSPOFであることに。
「デプロイを実行したのに本番に反映されないんだけど」
見えた、未来が見えたぞ…!!
(*)「インスタンスの増減に対応」と「ロールバックが可能」は分ける方針に変更
rsyncするインスタンスをAmazon EC2のNameタグを元に判断する
[2] Jenkins
(1) Jenkinsの構築
(2) 各スクリプトの準備
1. devからコンテンツを持ってくるスクリプト
同期対象から「.git」を除外する。
#!/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}
2. 持ってきたコンテンツをGitLabにcommit/pushするスクリプト
commitする際に変更がないよ返り値が1になるようでJenkinsがFAILEDしてしまった。
スクリプトでまとめた。
#!/bin/bash ############## # Commit2Git # ############## git add -A git commit -m "`date --iso-8601=seconds`" git push
(3) Jobの登録
[3] 既存のデプロイツール
下記2つを既存のデプロイツールに組み込む。
(1) 「インスタンスの増減に対応」したスクリプト(*)
rsyncするインスタンスをAmazon EC2のNameタグを元に判断する
(2) Jenkinsのプロジェクトを起動するcurl
元記事はこちらです。
「Jenkins/GitLabでデプロイツールを作る」