share facebook facebook twitter menu hatena pocket slack

2014.11.28 FRI

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

田村 謙介

WRITTEN BY 田村 謙介

こんにちは、cloudpack田村です。

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

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

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

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

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

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

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

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

Jenkins と GitLab を使ったデプロイツールを構築: 構成図 (改良前)

[1] GitLab

(1) GitLabの構築

CentOS に 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タグを元に判断する
Jenkins と GitLab を使ったデプロイツールを構築: 構成図 (改良後)

[2] Jenkins

(1) Jenkinsの構築

CentOS に 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の登録

Jenkins と GitLab を使ったデプロイツールを構築: Jobの登録

[3] 既存のデプロイツール

下記2つを既存のデプロイツールに組み込む。

(1) 「インスタンスの増減に対応」したスクリプト(*)

rsyncするインスタンスをAmazon EC2のNameタグを元に判断する

(2) Jenkinsのプロジェクトを起動するcurl

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

元記事はこちらです。
Jenkins/GitLabでデプロイツールを作る

田村 謙介

田村 謙介

構築運用(虎)セクションのリーダー/ソリューションアーキテクトとして、コンサルティング・設計・構築を主に担当しています。 使用するプロダクトやサービスの思想を尊重しつつお客様の要望に応えられる「美しい設計」を日々追い求めています。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。