사용자 도구

사이트 도구


gant:tasks

문서의 이전 판입니다!


Gant Tasks

Ant Task Override

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

TaskDef

input

  • 사용자로부터 문자열을 입력받아서 Ant 프라퍼티로 저장한다.
  • 비밀번호 등을 gant 스크립트에 직접 넣지말고 초기에 한 번 직접 입력하도록 하여, 프라퍼티에서 값을 뽑아 사용하도록 설계한다.(특히 sshexec 등에서 사용)
// 비밀번호를 입력 받아서 server.password Ant 프라퍼티로 저장한다.
 
input(message: '비밀번호를 입력해주세요.', addproperty: 'server.password')

exec

  • 예시
    exec(executable: '명령어', failonerror: true) {
      arg value: '명령행 인자 1'
      arg value: '명령행 인자 2'
      arg line: '명령행인자를 한 줄로 쭉..'
      env key: '환경변수이름', value: '환경변수값'
    }
    • faileonerror : 오류 발생시 빌드 즉시 실패
    • dir : 명령을 실행한 디렉토리 명시
    • resultproperty : faileonerror=false일 때 리턴값을 저장할 프라퍼티 이름

명령을 받아서 파싱해서 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

  • JSch 0.1.42 이상 버전 필요. Ant 1.8.3 이상 권장. $GANT_HOME/lib에 라이브러리를 복사해 둔다.
  • Ant의 sshexec는 리눅스간 뿐만 아니라 Windows에서 리눅스로의 접속도 매우 잘 지원한다.
  • Key 생성은 Linux SSH 참조
  • 실행시 com.jcraft.jsch.JSchException: reject HostKey: 오류가 발생한다면 trust: true 옵션을 지정한다.
  • ant.sshexec로 명시적으로 ant 를 지정해야만 작동한다.

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

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

  • sudo -Sstdin으로 부터 비밀번호를 입력받도록 해주는 옵션이다.
  • 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으로 지정한 입력이 명령 실행시마다 반복 입력된다.

scp

  • 대부분의 SSH 관련 설정은 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

SSH 관련 보안

  • sshexecscp에 사용자명과 비밀번호 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')
}

ant-contrib

  • 설치. 파일을 다운로드 하여 Gant가 인지하는 라이브러리 디렉토리에 복사한다.
    // 태스크들을 동록한다.
    taskdef(resource: "net/sf/antcontrib/antlib.xml")
gant/tasks.1350886322.txt.gz · 마지막으로 수정됨: 2012/10/22 15:12 저자 kwon37xi