joppot

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

サーバ プログラミング

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

投稿日:

Pocket

8u90u90gr

概要

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

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

illust

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

fabricput

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

問題点

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

前提

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

SPONSORED LINK


サンプルリポジトリ

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

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

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

関連記事

Chart.js 2.0でy軸の最大値(scales max)と最小値を設定する

概要 みなさんこんにちはcandleです。今回はChart.js2.0でy軸の最大値、最小値を設定する方法を紹介します。 Chart.js 2.0では特に指定しないと自動的に、y軸の最大値を設定してく …

ec2からvimをアンインストールして削除する

概要 みなさんこんにちはcandleです。 今回はec2のデフォルトで入っているvimを削除してみたいと思います。 emacs使いの私としてはvimは、まぁ、いらないと考えました。 もちろんviが入っ …

Rails pluginでengineを使ったgemの作り方[6](config編)

概要 みなさんこんにちはcandleです。今回は前回に引き続き、gemの作成をやっていきます。 gemのconfigとは恐らく一般的に以下の様な状況の時に使う事になると思います。 例えば、gemのプロ …

processingで重複しないランダムな数を配列で取得する

概要 みなさんこんにちはcandleです。今回はprocessingで重複しないランダムな数を配列で取得する関数を作成したいとおもいます。 前提 なし

Rails pluginを使ったgemの作り方[4](controller helper編)

概要 みなさんこんにちはcandleです。今回はgemの中枢とも言えるhelperの作り方です。 helperというのは様はgemにすることで便利になる関数を作るとというイメージです。 例えば、con …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ