CentOS7 への Django アプリケーションデプロイを Gradle で半自動化
CentOS7 へ Python3 をインストールして Django REST framework アプリケーションのサンプルの動作確認ができたので、Gradleを使ってデプロイ手順の半自動化を試みる。
1.やりたいこと
とっかかりとして、最低限、以下程度のことをやりたい。
- GitからHEADリビジョンを取得
- Zip圧縮してアーカイブを作成
- SSH経由でサーバーへアーカイブをコピー
- アーカイブを展開
2.構成
ここまでで、Visual Studio Code上に作成した構造は以下のような感じ。あと、ワークスペース(django_api_lesson) 直下に以下を作成
- デプロイ用アーカイブ作成用のディレクトリ(buid)を作成
- Gradle用のビルドスクリプト(build.gradle)を作成
- SSH KEY ファイル(id_rsa) を配置。
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 ビルドスクリプトの記述
上記、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}" } } } }
Gradle ssh プラグインで reject HostKey エラー 発生時の対処
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