목차

Gant Tasks

Ant Task Override

기본 Ant 태스크에 공통 옵션을 적용해두고 호출할 수 있는 속임수 기법이 있다. Ant 태스크와 동일한 이름으로 함수를 만들고 거기서 ant.태스크이름으로 명시적으로 Ant 태스크를 호출하면서 기본값을 지정해주면 된다. exec 참조.

body에 값 넣기

Ant 태스크 중에는 XML Attribute가 아닌 body에 값을 넣도록 처리하는 경우가 있다. 이 때 이것을 gant로 변경할 때는, 태스크 호출 맨 마지막에 바디의 내용을 문자열로 넣어주면 된다.

<echo level="error">
이런 저런 메시지들을
출력해 봅시다!
</echo>

변환하면

ant.echo(level: 'error', """이런 저런 메시지들을
출력해 봅시다!""")

taskname

Ant에서 표준출력으로 내보낼 때 [echo] blah.. blah.. 처럼 맨 앞에 태스크 이름이 나온다. taskname 속성을 통해 이를 조정할 수 있다.

ant.echo(message: 'Hello World', taskname: 'echo:hello')

결과는..

[echo:hello] Hello World

TaskDef

클래스 이름 기반 taskdef

groovyc 태스크를 등록하는 것으로 알아본다. classpath 혹은 classpathref로 해당 태스크가 속한 라이브러리의 클래스패스를 지정할 수 있다.

taskdef(name: 'groovyc', classname: 'org.codehaus.groovy.ant.Groovyc')
 
target(compile: 'Compile Groovy sources') {
    File dest = new File('classes')
    dest.mkdirs()
    File lib = new File('lib')
    lib.mkdirs()
 
    groovyc(srcdir: 'src', destdir: 'classes') {
        classpath {
            fileset(dir: 'lib') {
                include(name: '*.jar')
            }
            pathelement(path: 'classes')
        }
    }
}

input

// 비밀번호를 입력 받아서 server.password Ant 프라퍼티로 저장한다.
 
input(message: '비밀번호를 입력해주세요.', addproperty: 'server.password')

exec

명령을 받아서 파싱해서 ant.exec로 자동 넘기기

문자열 하나에 명령과 인자를 모두 넣은 상태에서 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')
}

sshexec

명령 사용자명/비밀번호 직접 지정방식

target(remotels: 'Remote list files') {
    ant.sshexec(host: '호스트네임/IP주소',
        username: '계정명',
        password: '비밀번호',
        failonerror: true,
        trust: true,
        command: 'ls /etc')
}

Key 기반 로그인

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

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')
}

여러개의 명령 실행

scp

로컬 파일을 리모트로 복사하기

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')
        }
    }
}

복사 대상과 목표 지점 등록하기

SSH 관련 보안

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')
}