Ant 에서 원격서버의 명령을 실행할 때 그 명령이 백그라운드로 계속 돌아가는 프로세스를 생성한다면 약간 골치아픈 일이 벌어진다.  대표적인게 WAS시작 스크립트를 원격으로 실행하는 건데, WAS를 띄우면 WAS는 계속해서 console에 정보를 출력하고 이는 WAS가 죽기 전에는 끝나지 않는다.
 
       <sshexec host="${wasserver.ip}" username="${wasserver.username}"
         password="${wasserver.password}" trust="true"  command="start.sh" />

아무 생각없이 이렇게 타스크를 정의했다간 서버단의 콘솔메시지가 로컬의 ant를 실행시킨 커맨드 창에 주루룩 나오면서 ant 실행이 끝나지 않을 것이다. (이게 WAS 시작 스크립트에서 흔히 볼 수 있는 nohup과 관련된 것인지는 잘 모르겠다)

그래서 sshexec 옵션에 timeout="2초" failonerror="false"을 추가하면 timeout 후 빌드가 실패한다.(maven으로 돌렸는데 메이븐이 그 이후의 단계를 더이상 진행하지 않고 그냥 끝나버렸다)

안타까워하다가 혹시나하고 의존라이브러리인 ant-jsch와 jsch 버전을 업그레이드했더니 다행히 timeout후 빌드결과가 성공으로 나온다.

    <dependencies>
     <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant-jsch</artifactId>
      <version>1.7.1</version>
     </dependency>
     <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jsch</artifactId>
      <version>0.1.38</version>
     </dependency>
    </dependencies>

WAS에서 제공하는 ant 타스크를 이용하면 깔끔하지 않겠냐하는 분도 계시겠지만 보통 WAS 시작,종료 스크립트에 벤더들이 여러가지로 장난?을 많이 쳐놓아서 그것도 쉽지만은 않다.

Posted by 에코지오
,

maven antrun plugin을 통해 ant의 scp 타스크를 이용하여 파일을 전송하기 위해 딸랑 jsch 라이브러리만 의존성에 추가하면 scp 타스크가 없다고 에러가 떨어진다. 

   <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
     ... ...
    </executions>
    <dependencies>
     <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jsch</artifactId>
      <version>0.1.38</version>
     </dependency>
    </dependencies>
   </plugin>

jsch 뿐 아리나 ant-jsch 아티팩트도 antrun 플러그인 의존성에 추가해야 한다. maven을 통하지 않고 순전히 scp작업을 build.xml에 정의해서 ant로 실행하면 jsch 라이브러리만 ant에 추가해주면 된다. ant-jsch.jar는 이미 ant에 포함되어 있기 때문이다.

   <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
     <execution>
      <id>remote-exploded-deploy-scp</id>
      <phase>integration-test</phase>
      <goals>
       <goal>run</goal>
      </goals>
      <configuration>
       <tasks>
        <scp todir="user:user@myserver:/home/user/temp" trust="true">
         <fileset dir="${project.basedir}/temp" />
        </scp>
       </tasks>
      </configuration>
     </execution>
     <execution>
      <id>server-restart</id>
      <phase>integration-test</phase>
      <goals>
       <goal>run</goal>
      </goals>
      <configuration>
       <tasks>
        <sshexec host="myserver" username="user" password="user" trust="true"
         timeout="20000" failonerror="false" command="sh restart.sh" />
       </tasks>
      </configuration>
     </execution>
    </executions>
    <dependencies>
     <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant-jsch</artifactId>
      <version>1.7.1</version>
     </dependency>
     <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jsch</artifactId>
      <version>0.1.38</version>
     </dependency>
    </dependencies>
   </plugin>

마찬가지로 ftp 타스크를 쓸 때도 commons-net 뿐 아니라 ant-commons-net도 추가해주어야 한다.

   <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
     <execution>
      <id>remote-exploded-deploy-ftp</id>
      <phase>integration-test</phase>
      <goals>
       <goal>run</goal>
      </goals>
      <configuration>
       <tasks>
        <ftp server="myserver" remotedir="/home/user/temp" userid="user"
         password="user">
         <fileset dir="${project.basedir}/temp" />
        </ftp>
       </tasks>
      </configuration>
     </execution>
    </executions>
    <dependencies>
     <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant-commons-net</artifactId>
      <version>1.7.1</version>
     </dependency>
     <dependency>
      <groupId>commons-net</groupId>
      <artifactId>commons-net</artifactId>
      <version>1.4.1</version>
     </dependency>
    </dependencies>
   </plugin>
Posted by 에코지오
,