문서의 이전 판입니다!
기본 Ant 태스크에 공통 옵션을 적용해두고 호출할 수 있는 속임수 기법이 있다. Ant 태스크와 동일한 이름으로 함수를 만들고 거기서 ant.태스크이름
으로 명시적으로 Ant 태스크를 호출하면서 기본값을 지정해주면 된다. exec
참조.
Ant 태스크 중에는 XML Attribute가 아닌 body
에 값을 넣도록 처리하는 경우가 있다. 이 때 이것을 gant로 변경할 때는, 태스크 호출 맨 마지막에 바디의 내용을 문자열로 넣어주면 된다.
<echo level="error"> 이런 저런 메시지들을 출력해 봅시다! </echo>
변환하면
ant.echo(level: 'error', """이런 저런 메시지들을 출력해 봅시다!""")
sshexec
등에서 사용)// 비밀번호를 입력 받아서 server.password Ant 프라퍼티로 저장한다. input(message: '비밀번호를 입력해주세요.', addproperty: 'server.password')
exec(executable: '명령어', failonerror: true) { arg value: '명령행 인자 1' arg value: '명령행 인자 2' arg line: '명령행인자를 한 줄로 쭉..' env key: '환경변수이름', value: '환경변수값' }
faileonerror
: 오류 발생시 빌드 즉시 실패dir
: 명령을 실행한 디렉토리 명시resultproperty
: faileonerror=false
일 때 리턴값을 저장할 프라퍼티 이름문자열 하나에 명령과 인자를 모두 넣은 상태에서 failonerror를 항상 true로 한 기본 exec를 만들어 두고 호출 할 수 있다.
def exec(command, dir = '.') { def splittedCommand = command.split(' ') def executable = splittedCommand[0] ant.exec(executable: executable, failonerror: true, dir: dir) { if (splittedCommand.size() > 1) { splittedCommand[1..-1].each { arg value: it } } } } target(hello: 'world') { // ant.exec보다 로컬에 선언한 함수 exec가 우선된다. exec('cmd /c dir') }
target(remotels: 'Remote list files') { ant.sshexec(host: '호스트네임/IP주소', username: '계정명', password: '비밀번호', failonerror: true, trust: true, command: 'ls /etc') }
target(remotels: 'Remote list files') { ant.sshexec(host: '호스트네임/IP주소', username: '계정명', keyfile: '${user.home}/.ssh/id_dsa', passphrase: '패스프레이즈', failonerror: true, trust: true, command: 'ls /etc') }
sudo -S
는 stdin
으로 부터 비밀번호를 입력받도록 해주는 옵션이다.inputstring
(문자열), inputproperty
(지정된 프라퍼티에 있는 값), input
(파일의 내용) 등의 옵션은 stdin
으로 보낼 내용을 적는 방법들이다.usepty
는 가상의 TTY를 생성해준다(ssh -t
). Ant 1.8.3 이상 버전이 필요하다.sudo
사용이 가능해진다.target(remotels: 'Remote list files') { ant.sshexec(host: '호스트네임/IP주소', username: '계정명', keyfile: '${user.home}/.ssh/id_dsa', passphrase: '패스프레이즈', failonerror: true, trust: true, inputstring: 'sudo비밀번호\n', // \n로 엔터치게 해준다. usepty: true, command: 'sudo -S ls /var/log/httpd') }
echo
를 이용하는 방법도 있다. usepty: true
로 둔 상태에서 command: 'echo “비밀번호” | sudo -S 명령
' 형태로 사용한다. input* 계열의 경우 가끔 입력 시점과 그걸 받아들이는 시점에 약간의 시간차가 발생하여 제대로 작동 안하는 경우가 있다. echo
가 더 완벽하게 작동하는 듯./etc/sudoers
파일을 편집하여 아예 접속 계정에 비밀번호 없이 명령 실행 권한을 주는 방법도 있다. sudoers 참조.command: 'cmd1; cmd2; cmd3; …
' : 여러 명령어를 실행한다.command: 'cmd1 & cmd2 & cmd3 & …
' : 여러 명령어를 실행하되 앞의 명령이 성공해야만(and 조건) 다음 명령을 실행한다.commandResource: '명령이 줄 단위로 들어있는 파일명
' : 파일에서 명령을 읽어서 실행한다.commandResource
를 사용하면 inputstring
등의 stdin
으로 지정한 입력이 명령 실행시마다 반복 입력된다.sshexec
와 동일하다. 단, 'username' 인자는 없다.사용자명[:비밀번호]@호스트명:/some/path
형태로 지정한다. 비밀번호는 keyfile
혹은 password
로 대체 가능하다.target(remoteCopy: 'Remote Copy files') { ant.scp(host: '${host}', keyfile: '../id_rsa', failonerror: true, trust: true, toDir: 'username@${host}:/some/directory') { fileset(dir: '/local/directory') { include(name: '**/*.jar') } } }
file
단일 파일 지정. 로컬/원격 가능. @
가 들어있으면 원격으로 간주.localFile
: 단일 파일 지정. 무조건 로컬 파일.remoteFile
: 단일 파일 지정. 무조건 리모트 파일. 사용자명@hostname:/some/path/..
형태.fileset (dir: '로컬 경로') …
: 로컬 파일셋 지정.toDir
: 파일이 복사돼 들어갈 디렉토리. 로컬/원격 가능.localTodir
: 파일이 복사돼 들어갈 디렉토리. 무조건 로컬 디렉토리.localToFile
: 이하 생략…remoteToDir
remoteToFile
sshexec
와 scp
사용시 빌드 파일에 사용자명과 비밀번호 passphrase
를 직접 넣어 두는 것은 보안상 좋지 않다.input
태스크를 사용하여 프라퍼티로 만든 뒤에, 사용자명, 비밀번호 등은 실행시 입력 받아서 Ant 프라퍼티로 전달하는 것이 좋다. - 제일 좋다.gant -D username=사용자명 -D password=비밀번호
형태로 명령행에서 Ant 프라퍼티를 입력받고, 이 값을 사용한다. - 다른 사용자가 ps
명령으로 명령행 옵션을 보는 것이 가능하다.target(inputSudoPassword: 'Input sudo password') { input(message: 'Input sudo password', addproperty: 'sudopassword') } target(remoteSudoLs: 'Remote sudo list files') { depends(inputSudoPassword) ant.sshexec(host: '${host}', username: '사용자명', keyfile: '/some/dir/id_rsa', failonerror: true, trust: true, usepty: true, command: 'echo "${sudopassword}" | sudo -S ls /var/log/httpd') }