CentOS7 への Django アプリケーションデプロイを Gradle で半自動化

CentOS7 へ Python3 をインストールして Django REST framework  アプリケーションのサンプルの動作確認ができたので、Gradleを使ってデプロイ手順の半自動化を試みる。

1.やりたいこと

とっかかりとして、最低限、以下程度のことをやりたい。

  1. GitからHEADリビジョンを取得
  2. Zip圧縮してアーカイブを作成
  3. SSH経由でサーバーへアーカイブをコピー
  4. アーカイブを展開

2.構成

ここまでで、Visual Studio Code上に作成した構造は以下のような感じ。あと、ワークスペース(django_api_lesson) 直下に以下を作成

  • デプロイ用アーカイブ作成用のディレクトリ(buid)を作成
  • Gradle用のビルドスクリプト(build.gradle)を作成
  • SSH KEY ファイル(id_rsa) を配置。

django_gradle01

SSH KEYファイルの作成

Gradle から SSHでログインするために、SSH KEYファイルを、ログイン先のサーバーで作成する。

[root@ganzin ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
28:90:51:e4:6d:a7:ae:8b:36:95:67:f2:83:b5:bf:fc root@ganzin
The key's randomart image is:
+--[ RSA 2048]----+
|  .oo            |
|   + .           |
|  o . o .        |
|   . . +         |
|    ..o S        |
|    +o+          |
|   . B..         |
|  o...+.         |
| ...o. o+oE      |
+-----------------+

ホームディレクトリの .ssh ディレクトリ配下に、id_rsa ファイルが生成されるので、FTPなどで、ローカルに取得する。

[root@ganzin .ssh]# ls 
id_rsa id_rsa.pub 

3.Gradle ビルドスクリプトの記述

Gradleインストール手順 に従いインストール。

上記、build.gradle に以下のようなスクリプトを記述。

buildscript{
    repositories {
        jcenter()
    }
    dependencies {
        // SSHプラグインの設定
        // https://gradle-ssh-plugin.github.io/
        classpath 'org.hidetake:gradle-ssh-plugin:2.9.0'
    }
}

plugins {
  // SSHプラグインの設定
  id 'org.hidetake.ssh' version '2.9.0'
}

// SSHプラグインの設定
apply plugin: 'org.hidetake.ssh'

// デフォルトで実行するタスク順に指定
defaultTasks 'clean', 'export', 'zip', 'deploy'

// 各種設定
final APP_NAME = 'firstapi' // アプリケーション名
final REOMOTE_PATH = '/home/piroto/djangoapp' // デプロイ先ディレクトリ
final BUID_DIR = 'build' // デプロイ用アーカイブ作成先ディレクトリ
final EXPORT_DIR = 'repo' // GITリポジトリExport先ディレクトリ

// SSH接続情報
// $ ssh-keygen -t rsa
// C:\Users\pppiroto\.ssh\known_hosts
remotes {
    web01 {
        host = '192.168.0.36'
        user = 'root'
        password = 'password'
        // SSH KEYファイルを指定(サーバーで、ssh-keygenで生成し、プロジェクトルートディレクトリに配置)
        identity = file('id_rsa')
    }
}

// デプロイ用アーカイブ作成先ディレクトリのクリーン
task clean {
    doLast {
        exec {
            executable 'cmd'
            args 'rmdir', '/S', '/Q', "${BUID_DIR}\\${EXPORT_DIR}"
        }
        exec {
            executable 'cmd'
            args 'del', "${BUID_DIR}\\${APP_NAME}.zip"
        }
    }
}

// ローカルGitリポジトリからHEADリビジョンをExport
// http://sakebook.hatenablog.com/entry/2014/09/03/084456
// http://qiita.com/scalper/items/1905b47209989dda5648
task export {
    doLast {
        exec {
            executable 'git'
            args 'checkout-index', '-a', '-f', "--prefix=${BUID_DIR}/${EXPORT_DIR}/"
        }
    }
}

// GitリポジトリからExportしたプログラムをZipに圧縮
task zip(type: Zip) {
    baseName = "${APP_NAME}"
    destinationDir = file("${BUID_DIR}")
    exclude "${APP_NAME}\\__pycache__"
    into("${APP_NAME}") {
        from ("${BUID_DIR}/${EXPORT_DIR}/${APP_NAME}") {
            include '**/*.*'
        }
    }
}

// SSHを利用してデプロイ用アーカイブを送信後、展開
task deploy {
    doLast {
        ssh.run {
            session(remotes.web01) {
                execute "rm -R -f ${REOMOTE_PATH}/${APP_NAME}"
                execute "rm -f ${REOMOTE_PATH}/${APP_NAME}.zip"
                put from:"${projectDir}\\${BUID_DIR}\\${APP_NAME}.zip", into:"${REOMOTE_PATH}/${APP_NAME}.zip"
                execute "unzip ${REOMOTE_PATH}/${APP_NAME}.zip -d ${REOMOTE_PATH}"
            }
        }
    }
}

4.実行

PS C:\workspaces\vscode\django_api_lesson> gradle
:clean
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\workspaces\vscode\django_api_lesson>Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\workspaces\vscode\django_api_lesson>:export
:zip UP-TO-DATE
:deploy
web01#53|Archive:  /home/piroto/djangoapp/firstapi.zip
web01#53|   creating: /home/piroto/djangoapp/firstapi/
web01#53|  inflating: /home/piroto/djangoapp/firstapi/db.sqlite3
web01#53|   creating: /home/piroto/djangoapp/firstapi/firstapi/
web01#53|  inflating: /home/piroto/djangoapp/firstapi/firstapi/settings.py
web01#53|  inflating: /home/piroto/djangoapp/firstapi/firstapi/urls.py
web01#53|  inflating: /home/piroto/djangoapp/firstapi/firstapi/wsgi.py
web01#53|  inflating: /home/piroto/djangoapp/firstapi/firstapi/__init__.py
web01#53|  inflating: /home/piroto/djangoapp/firstapi/manage.py

BUILD SUCCESSFUL

Total time: 4.73 secs

OK OK