рдореБрдЭреЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ
WAR рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
grails war
рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ WAR рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ WAR рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЯреЙрдордХреИрдЯ рд╣реИред рдореИрдиреБрдЕрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрджреНрд░рд╡ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ:
- рд╕рд░реНрд╡рд░ рдмрдВрдж рдХрд░реЛред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░ рдбрд╛рд▓реЛ рдЕрдЧрд░ рдпрд╣ рдЦреБрдж рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред
- рдкреБрд░рд╛рдиреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣рдЯрд╛рдПрдВ (рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ)
- рд╕рд░реНрд╡рд░ рдкрд░ рдирдП WAR рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБред рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЬреИрд╕реЗ, ROOT.war рдореЗрдВ)
рдорд╛рд╡реЗрди рдореЗрдВ, рдпрд╣ рдПрдХ рдХрд╛рд░реНрдЧреЛ рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╛рд╣рд╕рд┐рдХ рдФрд░ рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ, рдФрд░ рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред
рд╣рдо рдПрдХ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдПрдХ рдЕрджреНрднреБрдд рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЧреНрд░реВрд╡реА рднрд╛рд╖рд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╢реЗрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ?
рдЧреНрд░реВрд╡реА рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдирд╛
рдЧреНрд░рд┐рд▓реНрд╕ рдЧреНрд░реВрд╡реА рдкрд░ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдм рдХрдВрд╕реЛрд▓ рдХрдВрд╕реЛрд▓
рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рдо
Deploy.groovy рдирд╛рдордХ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рд▓рд┐рдЦреЗрдВрдЧреЗ ред
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ рдЖрдк рд╣рдорд╛рд░реЗ рдЧреНрд░реЗрд▓реНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдирд╛рдо рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкрд░реНрдпрд╛рд╡рд░рдг-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред рдЧреНрд░рд┐рд▓реНрд╕ 1.3.7 рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
depends(compile) depends(createConfig) def host = ConfigurationHolder.config?.deploy.host def username = ConfigurationHolder.config?.deploy.username
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рдкрд░
рдЧреНрд░реЗрди-рдПрдк / рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ / рдХреЙрдиреНрдлрд┐рдЧ.рдЧреНрд░реЙрд╡реЛрд╡реА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрдЧрд╛:
... environments { production { ... deploy { host = 'www1.shards.intra' username = 'deployer' } } }
рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ
config.groovy рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛
рд╣реЛрдЧрд╛ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛
(рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) , рдЬрд╣рд╛рдВ
рд╕рдВрдХрд▓рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд рдХрдорд╛рдВрдб (рдХрд╛рд░реНрдп) рд╣реИред
рд╣рдо SSH рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рд╣рдореЗрдВ SSH рдкрд╣реБрдВрдЪ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдореБрдлреНрдд JSch рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реА рдФрд░ рдЦреБрдж рдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдХрд▓реНрдк рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд▓рд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рддрд░рд╣ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ:
@GrabResolver(name='jcraft', root='http://jsch.sourceforge.net/maven2') @Grab(group='com.jcraft', module='jsch', version='0.1.44') import com.jcraft.jsch.*
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо JSch рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЬрд╛рджреБрдИ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рдЪрд╛рд╣рд┐рдП:
- рд╕рд░реНрд╡рд░ рдкрд░ рдпреВрдирд┐рдХреНрд╕ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ
- рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдЧреНрд░реВрд╡реА рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рдиреА-рдбреАрдПрд╕рдПрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ (JSch рд╕реЗ) рдореЗрдВ рдХреБрдЫ рдирдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдПрдХ SSH рд╕рддреНрд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд░реНрд╡рд░ рдкрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рдзрд┐:
Session.metaClass.exec = { String cmd -> Channel channel = this.openChannel("exec") channel.command = cmd channel.inputStream = null channel.errStream = System.err InputStream inp = channel.inputStream channel.connect() int exitStatus = -1 StringBuilder output = new StringBuilder() try { while (true) { output << inp if (channel.closed) { exitStatus = channel.exitStatus break } try { sleep(1000) } catch (Exception ee) { } } } finally { channel.disconnect() } if (exitStatus != 0) { println output throw new RuntimeException("Command [${cmd}] returned exit-status ${exitStatus}") } output.toString() }
рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рддрд╛рдХрд┐ рд╕рдлрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░, рд╡рд┐рдзрд┐ рдХреБрдЫ рднреА рдЖрдЙрдЯрдкреБрдЯ рди рдХрд░реЗ, рдФрд░ рдЬрдм рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рдкреВрд░реЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдореИрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ рднреА рд▓рд┐рдЦреВрдВрдЧрд╛:
Session.metaClass.scp = { sourceFile, dst -> ChannelSftp channel = (ChannelSftp) openChannel("sftp") channel.connect() println "${sourceFile.path} => ${dst}" try { channel.put(new FileInputStream(sourceFile), dst, new SftpProgressMonitor() { private int max = 1 private int points = 0 private int current = 0 void init(int op, String src, String dest, long max) { this.max = max this.current = 0 } boolean count(long count) { current += count int newPoints = (current * 20 / max) as int if (newPoints > points) { print '.' } points = newPoints true } void end() { println '' } }) } finally { channel.disconnect() } }
рджрд░рдЕрд╕рд▓, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рднреА рдореБрдЦреНрдп рднрд░рдирд╛ рдкреНрд░рдЧрддрд┐ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рдкреВрд░реНрдг-рдкреВрд░реНрдг рдбреАрдПрд╕рдПрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ (
doRemote рд╡рд┐рдзрд┐ рд╕реЗ
рдЬреБрдбрд╝рд╛ ):
Session.metaClass.doRemote = { Closure closure -> connect() try { closure.delegate = delegate closure.call() } finally { disconnect() } }
DoRemote рдкрджреНрдзрддрд┐ "рдХреЛрд╖реНрдардХ" рдмрдирд╛рддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╣рдо
рдирд┐рд╖реНрдкрд╛рджрди рдФрд░
scp рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рддреИрдирд╛рддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦреЗрдВ
рджрд░рдЕрд╕рд▓, рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
// . grails help. target(main: " WAR- .") { .. JSch JSch jsch = new JSch() Properties config = new Properties() config.put("StrictHostKeyChecking", "no") config.put("HashKnownHosts", "yes") jsch.config = config // , host username . ... String password = new String(System.console() .readPassword("Enter password for ${username}@${host}: ")) Session session = jsch.getSession(username, host, 22) session.setPassword(password) session.doRemote { exec "- " ... scp warFile, '/opt/tomcat/latest/webapps/ROOT.war' ... } }
рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдбрдмреНрд▓реНрдпреВрдПрдЖрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╣рд╛рдВ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреИрд╕реЗ рдмрддрд╛рдПрдВ рдХрд┐ рддреИрдирд╛рддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдЧрдг рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ
рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ :
depends(clean) depends(war)
рдкрд╣рд▓реЗ рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдбрдмреНрд▓реНрдпреВрдПрдЖрд░ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред WAR рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдХреБрдЫ рднреА рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
GrailsSettings рдЪрд░ рд╕рднреА рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдк рдпрд╣ рднреА рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдБ рд╣реИ:
File warFile = grailsSettings.projectWarFile
рджрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВред
рджрд░рдЕрд╕рд▓, рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдЖрдЦрд┐рд░реА рд╕реНрдкрд░реНрд╢ рдмрдирд╛ рд╣реБрдЖ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдореБрдЦреНрдп) рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд╣реИ, рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:
setDefaultTarget(main)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдирд┐рд░реНрдорд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
рд╕рдВрдХрд▓рди ,
рдпреБрджреНрдз , рдЖрджрд┐ред рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ
рдирд┐рд░реНрднрд░ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ), рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:
includeTargets << grailsScript("Clean") includeTargets << grailsScript("Init") includeTargets << grailsScript("War")
рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рдЯреЙрдордХрдЯ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ ред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╣рдордиреЗ SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
grails deploy
рдПрдХ рд╣реА рдЪрд▓ рд░рд╣рд╛ рд╣реИ
grails help deploy
рд╣рдо рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :)
рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдпрд╣ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИ:
- рдПрдХ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрдЯрдХрдерд╛ рднрд╛рд╖рд╛ред
- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЧреНрд░рд┐рд▓реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдЧреНрд░реЗрд▓реНрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреИрдирд╛рддреА рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
grails prod deploy
ред - рд╣рдореЗрдВ рдЧреИрдВрдЯ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рд╛рдзрди (рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЪреАрдВрдЯреА) рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓рддреА рд╣реИред
- рдЖрдк рдХрд┐рд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ GORM рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕реЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред