joppot

コピペで絶対動く。説明を妥協しない

サーバ プログラミング

fabricを使ってgit のdiffで指定のバージョンからのファイルをアップロード

投稿日:


8u90u90gr

概要

皆さんこんにちはcandleです。今回はfabricを使ってgit のpush pullを使わないデプロイを実装します。

一般にgit管理されているプロジェクトのデプロイは下の様な図式でデプロイすることが多い様に思います。

illust

小さいプロジェクトで共同開発とかしてないなら、別にリモートプライベートリポジトリからpull pushなんかしなくても良いと思います。
そこで、以下の様な図式でデプロイできれば便利ですよね。

fabricput

任意のバージョンからの変更されたファイルを、自分のプロジェクトから公開サーバへfabricのputでデプロイできればはやいですね。

問題点

もちろん、これの難点はあります。
それは画像などのメディアファイルもgitの管理下に置かないとサーバに送信されません。
何も記述されていない空のファイルはたとえgitの管理下においてもgit diffで探知できないので、サーバーに送信できません。
gemやcomposerなどのサードパーティは普通gitの管理下に置かないので、それらはサーバ側で改めてインストールする必要などがあります。

前提

fabricが導入されている
cuisineが導入されている



サンプルリポジトリ

試しに以下のようなサンプルプロジェクトを作成しました。

index.html
css/index.css
js/index.js

これをコミットしてタグを付けました

git add .
git commit
git tag ver0.0.1

index.htmlを何も書かないと違いがわかりづいので、index.htmlに以下の内容を書き込みました。

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="UTF-8"/>
    <title>Document</title>
    <link href="css/index.css" rel="stylesheet"/>
    <script src="js/index.js"></script>
  </head>
  <body>
    <h1>hello world</h1>
    <p>fabricを使ったデプロイ</p>
  </body>
</html>

indexhtml

index.cssには下のように記述しておきましょう。

body{
  font-family: Helvetica, serif;
  color: white;
  background-color: #2b2b2b;
}
p{
  color: gray;
}

index.jsには下の内容を追加しておきます。

window.onload = function() {
  var ptag = document.createElement("p");
  var str = document.createTextNode("簡単でしょ");
  ptag.appendChild(str);
  document.body.appendChild(ptag);
};

保存したらコミットしておきます。

git add .
git commit

これで準備が出来ました。


デプロイプログラムを書く

同じプロジェクト内にdeployフォルダを作ります。

mkdir deploy
touch deploy/fabfile.py

deployフォルダを間違ってgitの管理下に置くと大変な事になるので.gitignoreに書き込みます。

touch .gitignore

エディタか何かで.gitignoreを開いて、下の内容を書き込みましょう。

/deploy

(.gitignore)
igonore

保存したら、同じ様にコミットしておきます。

git add .
git commit

gitigonoredeploy

そしたらdeployフォルダのfabifile.pyに下の内容を記述します。

# -*- encoding:utf-8 -*-
from fabric.api import env, settings,local,run,sudo,cd
from fabric.decorators import task,roles
from fabric.contrib.files import *
from cuisine import dir_exists

@task
def deploy():
  """gitの指定のバージョンから変更されたファイルをアップロード"""
  #gitのバージョンを指定
  tag="ver0.0.1"
  #指定のバージョンから変更されたファイル名を保存
  local("git diff "+tag+" --name-only > filename.txt")

  #ファイルの中身を取得
  f = open('filename.txt')
  lines = f.readlines()
  f.close()
  
  #ファイル名をそれぞれ取得
  for line in lines:
    #改行コードを削除
    line = line.rstrip()

    local_path="../"
    remote_path='/var/www/html/'
    
    #ファイルとディレクトリを分割
    dir_path=line.split("/")
    #ファイルがディレクトリ以下にある場合は
    if len(dir_path) > 1:
      #配列の最後に入っているファイル名を削除
      dir_path.pop()
      create_dir_name=""
      #ディレクトリの深さ分繰り返す
      for index,dir_name in enumerate(dir_path):
        #分割されたディレクトリを組みあせわせる
        if (index != 0):
          create_dir_name += "/"+dir_name
        else:
          create_dir_name += dir_name

        #リモート先にそのディレクトリが無ければ作成
        if not dir_exists(remote_path+create_dir_name):
          sudo("mkdir "+remote_path+create_dir_name)

    #サーバにアップロード
    put(local_path+line ,remote_path+line,use_sudo=True)
  
  #ローカルのファイル名のファイルを削除
  local("rm -f ./filename.txt")

リモート先の公開ディレクトリは各自変更してください。
私はCentOS6.5のapacheのデフォルト公開ディレクトリにしています。

これを保存したら、fabfile.pyがある所で下のコマンドをでまず確認します。

fab -l

fabll

実行してみます。

fab deploy

deploytool

いけますね。

サーバ側を見てみる

サーバ側を見るとアップロードされています。

filesdirgitdiffupload

ブラウザからアクセスしてみました。
uploadDocumentsucces

まとめ

pythonのソースコードが洗練されていないのですね。もうすこし、pythonうまくなって、綺麗なソースコードかければね。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ, プログラミング
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

grepコマンドを使って正規表現を色々試してみるその1

概要 みなさんこんにちはcandleです。今回からgrepコマンドを使って正規表現を色々試してみます。 正規表現って、使えると便利ですが、それを勉強して使いこなせている人って少ないと思います。この機会 …

react0.14 + gulp + express + babelでReactのチュートリアル環境構築をする

概要 みなさんこんにちはcandleです。今回は、react0.14のnodeの環境構築をします。 react0.14はまだまだ、開発段階にあり、しばしば仕様変更が行われています。 0.13の時では使 …

phpmyadminでmysqlデータベースの照合順序を変更する

概要 みなさんこんにちはcandleです。 ちょっとした事なのですが、意外に分からなかったのでまとめました。 phpmyadminを使ってデータベースを作ると、うっかり、utf8_general_ci …

railsのcoffee scriptをurl判定をして実行をする方法

概要 みなさんこんにちはcandleです。 今回はcoffeescriptを任意のURLで実行する様にする関数を作ります。 というのはrailsは最終的にassetspiplineでjavascrip …

apache2.4でvirtualhost毎に環境変数を定義しphpで使用する方法

English 日本語 概要 みなさんこんにちはcandleです。 今回はapache2.4でバーチャルホスト毎に環境変数を定義して、それをphp側で受け取る方法を紹介します。 例えば、wordpre …

  • English
  • 日本語

ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー