fabricでSVNやGitを使わないデプロイツールを作成中

久しぶりのメモです。

最近、仕事でモチベーションというかテンションが下がるようなことが多くて、

なかなか書く気になれませんでした・・・

 

以前書いたように

誰もやってくれないならシステムにやってもらおう!

ということで、第一弾として・・・

 

まだ未完成ですが、作ってみました。

SVNとかGitとかで同期コマンド叩くだけなら楽チンだったんでしょうが、

社内でしかアクセスできないリポジトリをおいそれと移行できなかったりと色々あるので、

リリース対象に一意な識別子をつけてもらい、

万が一切り戻したい場合には、

その識別子を入力すると元に戻るようなものを考えました。

 

こんな感じです。

import cuisine
from fabric.api import run, cd, abort, require, sudo, env, put, prompt, local
from fabric.decorators import runs_once, roles
from fabric.contrib.console import confirm

env.user = ''
env.password = ''
env.hosts = ['']
env.site_directory_name = ''                 #リリース対象ディレクトリ
env.site_directory_path = '/var/www/html'    #リリース対象ディレクトリへのパス

#リリース
def release():
    identifier = prompt('Enter The Identifier: ')                #識別子を入力

    bakup_target = "/tmp/backupTarget" +identifier;              #バックアップリストファイル名

    local('find * | grep ".*/.\+\..*" > %s' % bakup_target)   #バックアップリストファイルに今回のリリース対象を書き出し
    put(bakup_target, bakup_target)                              #バックアップリストファイルを転送

    deploy_dir = '/tmp/deploy';                                  #作業ディレクトリパス
    deploy_dir_revision = deploy_dir + '/' +identifier;          #今回の作業ディレクトリ

    #作業ディレクトリ作成
    if not cuisine.file_exists(deploy_dir) :
        run('mkdir ' + deploy_dir)
    if not cuisine.file_exists(deploy_dir_revision) :
        run('mkdir ' + deploy_dir_revision)

    #リリース対象をtarで固める
    local('tar -cvf deploy.tar %(site_directory_name)s' % env)
    put('deploy.tar', deploy_dir_revision + '/deploy.tar')

    #リリース
    with cd('%(site_directory_path)s' % env) :
        run('cat ' + bakup_target + ' | xargs tar -rvf ' + deploy_dir_revision + '/backup.tar')  #バックアップリストに記載されているファイル群をtarで固めてバックアップ
        run('tar -xvf' + deploy_dir_revision + '/deploy.tar')                                    #上書きリリース

    local('rm -f deploy.tar')

#切り戻し
def rollback():
    identifier= prompt('EnterThe Identifier: ')  #識別子を入力

    #対応する識別子の作業ディレクトリ上にあるtarバックアップを元の場所に展開する
    deploy_dir = '/tmp/deploy';
    deploy_dir_revision = deploy_dir + '/' +identifier;
    backup_file_path = deploy_dir_revision + '/backup.tar';
    if cuisine.file_exists(backup_file_path) :
        with cd('%(site_directory_path)s' % env) :
            sudo('tar -xvf' + backup_file_path)

あとは、上書きじゃなくて削除する場合にバックアップと削除ができる方法があれば良い感じなんですが・・・

fabricはpythonっていうよりも、

pythonの構文でシェルを書けてリモートで実行できるツールって感じです。

個人的にシェルスクリプトの特殊な構文よりも書きやすいので、

日々のちょっとした作業にも使っていきたいです。