目次
Gradle を使って、 Git で管理されているアプリケーションをデプロイするスクリプトを書きました。 Gradle でなくても良かったのですが、 偶然 Gradle でやったことがあったので、 Gradle で書きました。
前提
今回前提としたデプロイは、単純に git pull
をしてコードを更新した後、 サーバを再起動するものです。 サーバから Git の リモートリポジトリへの認証は、 鍵ファイルを使って行っているものとします。
また Rails を前提としているので、 Rails 専用 の処理もあります。 他の言語でも応用できます。
応用次第で、 git で管理されているコードの中の一部をサーバにコピーすることもできます。
環境
- Gradle 3.2.1
準備
gradle をインストールして、 gradle init
を実行します。 そうすると、 gradle のテンプレートが用意されます。 そこにデプロイのタスクを書いていきます。
コード
次のようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
import groovy.json.JsonSlurper buildscript { repositories { mavenCentral() jcenter() } dependencies { classpath 'org.hidetake:gradle-ssh-plugin:2.8.0' } } apply plugin: 'org.hidetake.ssh' ssh.settings { dryRun = project.hasProperty('dryRun') } repositories { mavenCentral() } def setupServer(serverRole) { // read and set servers JsonSlurper slurper = new JsonSlurper() def deployConfig = slurper.parse(new File('deploy_config.json')) deployConfig.hosts.each { if (it.role != serverRole) return; def serverHost = it.host remotes.create(serverHost) { role serverRole host = serverHost user = deployConfig.user identity = file(deployConfig.key) passphrase = deployConfig.pass_phrase } } } /** * deploy */ task deploy << { // set target server role if (!project.hasProperty("serverRole")) return def serverRole = project.properties['serverRole'] JsonSlurper slurper = new JsonSlurper() def deployConfig = slurper.parse(new File('deploy_config.json')) def gitUserName = deployConfig.git.user_name def gitPassword = deployConfig.git.password setupServer serverRole ssh.settings { knownHosts = allowAnyHosts } def railsRoot = "/program_root_path" def backupRoot = "/backup_root_path" ssh.run { session(remotes) { def exitFlag = false execute("df -h") { result -> def loop = true while (loop) { println "Continue? Y or N: " switch (System.in.newReader().readLine()) { case ~/^[Yy]$/: loop = false break case ~/^[Nn]$/: loop = false exitFlag = true break } } } if (exitFlag) return execute "rm -rf ${backupRoot}" execute "cp -prv ${railsRoot} ${backupRoot}" execute "cd ${railsRoot}; git checkout -- db/schema.rb" execute("cd ${railsRoot}; git pull") execute "rake db:migrate RAILS_ENV=production" executeSudo("apachectl -k graceful; echo $?") { result -> switch (result) { case "0": println "Success" break default: println "Failed" } } } } } |
処理説明
デプロイ部分の処理は次の通りです。 現場によって変えて使う部分です。
- ssh でサーバに接続します。
df
コマンドで空き容量をチェックします。 ここで Y または N をタイプして、後続の処理を実行するか否か決定します。- 古いコードをコピーします。
git pull
で新しいソースコードを取得・デプロイします。rake db:migrate
を実行します。 この部分は Rails 固有 の処理です。- Apache を再起動します。 このときの終了ステータスに応じて “Success” または “Failed” を表示します。
注意点
git pull
のためにサーバ側に秘密鍵を登録しておく必要があります。 SSH でのエージェントフォワードもできるので、 自分の秘密鍵を使って git pull
を行うこともできます。
SSH のエージェントフォワードをする場合は次の記述をリモートセッションの実行前に追加します。
1 2 3 4 |
ssh.settings { knownHosts = allowAnyHosts agent = true } |
sshのキーは ssh-add
で登録しておきます。 これで git で使用する秘密鍵を登録しておけばその鍵を使って git pull
が行われます。
GitHub
GitHub で公開しています。 gradle-deploy