허드슨은 사용자가 정의한 빌드작업과 설치된 플러그인을 HUDSON_HOME 이라는 디렉토리에서 관리한다.

HUDSON_HOME 의 default 경로는 ~(사용자홈)/.huson 이며  HUDSON_HOME 환경변수를 설정하여 이 경로를
내가 원하는 곳으로 바꿀 수 있다.

Posted by 에코지오
,

뽀대나는 CVS저장소 통계 보고서를 보기위해 Maven에 stat-scm 리포트 플러그인을 끼워넣었다.

 <scm>
  <!-- SCM 연결 정보 -->
  <connection>scm:cvs:pserver:anonymous:@111.111.111.111:/SRC:HHHH</connection>
 </scm>
   ... ...
 <reporting>
  <plugins>
   <!-- SCM 통계 리포트 생성 플러그인 -->
   <plugin>
    <groupId>net.sf</groupId>
    <artifactId>stat-scm</artifactId>
    <version>1.2.0</version>
   </plugin>

주기적으로 만들기 위해 Hudson에서 site 골을 걸어놓는다.



Build Now! ................ 헉............

INFO] SCM Connection Type :cvs [INFO] Output Directory :D:\hudson-1.252\home\jobs\MyProject\workspace\target\generated-site\xdoc\statscm\ [INFO] scm log > D:\hudson-1.252\home\jobs\MyProject\workspace\target\generated-site\xdoc\statscm\scm.log [ERROR] Error Getting SCM log. java.io.IOException: CreateProcess: cvs log error=2 at java.lang.ProcessImpl.create(Native Method) at java.lang.ProcessImpl.<init>(ProcessImpl.java:81) at java.lang.ProcessImpl.start(ProcessImpl.java:30) at java.lang.ProcessBuilder.start(ProcessBuilder.java:451) at java.lang.Runtime.exec(Runtime.java:591) at java.lang.Runtime.exec(Runtime.java:464) at net.sf.statscm.SrcManager.log(SrcManager.java:77) at net.sf.statscm.StatScmMojo.executeReport(StatScmMojo.java:200) ... ....

허드슨에 cvs 실행파일 위치도 알려줬는데 뭐가 문제냐고....




cvs.exe를 시스템환경변수 PATH에 추가해 주면 된다.

http://confluence.public.thoughtworks.org/display/CC/Frequently+Asked+Questions#FrequentlyAskedQuestions-faq48

Posted by 에코지오
,

메이븐의 wagon 기능을 통해서 리모트 머신에 파일을 전송할 때 wagon은 CVS 폴더까지 함께 압축해서 전송한다. 따라서 CVS로 관리되는 폴더를 전송하고자 한다면 전송해야할 파일들을 ant copy 등을 이용해서 빌드 결과 폴더(target)로 먼저 복사한 뒤 그것을 전송하는 것이 좋다. wagon은 ant의 defaultexcludes 옵션이 없다....

Ant에서는 고민꺼리가 아닌 것이 Maven에서는 고민이 된다... 메이븐의 배려가 아쉽다....

Posted by 에코지오
,
Hudson을 로컬에서 권한설정 없이 써보다가 실제 프로젝트에 설치하고 권한관리를 해야겠다 싶어 권한을 설정하는데 왜이리 헷갈리는 건지...

https://hudson.dev.java.net/security.html

허드슨을 톰캣 위에서 돌리다면 이렇게 권한을 설정할 수 있다.

1. Hudson > Manage Hudson > Configure System 화면으로 들어가서 Access Control 항목을 밑에 그림처럼 설정한다. admin 유저를 Add하고 admin 유저에게는 모든 권한. anonymous 유저에게는 조회권한만 준다.


2. 위에서 추가한 admin 유저는 톰캣에서는 role에 해당한다(첨에 이 부분이 헷갈렸다)
톰캣에서 conf/tomcat-users.xml에 허드슨에 admin 권한으로 접속할 계정을 추가한다.
<tomcat-users>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="hudson-admin" password="hudson" roles="admin"/>
  <user username="manager" password="manager" roles="manager,admin"/>
</tomcat-users>

3. 이제 허드슨의 로그인화면(오른쪽 위의 login 링크)에서 hudson-admin/hudson으로 로그인하면 된다.


Posted by 에코지오
,

허드슨에서 scp 프로토콜을 통해 서버에 접속하는 작업을 포함하는 스크립트를 실행시 인증실패 에러가 발생하면서 빌드 작업이 중단되는 경우가 있다.

아이디/패스워드 인증 방식으로 접속하더라도 스크립트에 아이디와 패스워드만 설정해 놓고 인증에 필요한 모든 준비가 다 끝났다고 안심하면 안된다.

        <sshexec host="${wasserver.ip}" username="${wasserver.username}"
         password="${wasserver.password}" trust="true" timeout="20000" failonerror="false"
         command="${wasserver.cmd.restart}" />

허드슨으로 스크립트를 실행하기에 앞서 허드슨이 설치된 머신의 커맨드 창에서 먼저 scp에 접속해서 접속인증을 획득해 주어야한다.

The authenticity of host 'xxx.xxx.xxx.xxx' can't be established.
RSA key fingerprint is 13:70:69:51:0b:84:a3:d6:fa:ab:ab:89:1a:05:2d:22.
Are you sure you want to continue connecting (yes/no)?  => 여기서 yes를 입력해야 한다.


 

Posted by 에코지오
,
지금껏 Hudson이나 CruiseControl 같은 별도의 CI서버 소프트웨어를 쓰지 않고 개발서버에서 쉘이나 Ant 스크립트를 작성해서 소스통합빌드를 하곤 했다. 이때 소스버전관리 저장소의 소스를 취합하기 위해 무조건 anonymous 계정을 이용했는데 그도 그럴 것이 소스 통합빌드는 소스를 CVS/SVN에서 가져오기만 할 뿐이지 개발서버가 소스를 커밋할 것은 아니기 때문에 읽기 권한만 가진 익명계정이면 충분하였다.

그러다가 이번에 처음으로 허드슨을 써봤는데, 허드슨에 새로운 빌드작업을 만들고 SCM의 url에 이제까지 하던대로 anonymous 계정으로 CVS저장소에 접속할 수 있게 했다.

일단 소스 가져오고 빌드하고 아무 문제 없다. 헌데, 성공한 빌드에 대해 태깅하기 위해 Tag this build를 누르자 에러가 난다.

cvs [server aborted]: "tag" requires write access to the repository
CVS failed. exit code=1 tagging failed

허허, 당연한 걸 몰랐다. 태깅하기 위해서는 write 권한이 있는 user로 설정해야한다.
허드슨용 read/write되는 CVS 계정을 하나 만들어야겠다.

Posted by 에코지오
,
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 에코지오
,

weblogic 10 환경에서 ant를 통해 웹어플리케이션을 redeploy하기 위해 삽질을 했으나 결국 실패했다.

1. 먼저 cargo를 써보려했으나 cargo는 아직 weblogic10을 지원하지 않는다.

2.ant 에서 아래처럼 작성하고 실행하니 아무런 일도 일어나지 않는다.
(클래스패스에 weblogic/server/lib/*.jar는 걸린상태)

 <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy"/>
 <target name="redeploy">
  <wldeploy action="redeploy" verbose="true" name="MyWebApp"
                   user="weblogic" password="weblogic"
                   adminurl="t3://127.0.0.1:7001" targets="AdminServer" />
 </target>

3. 커맨드 창에서 직접 명령을 실행하니 weblogic.utils.Debug 클래스가 없다는 에러가 난다.

java -cp weblogic.jar weblogic.Deployer -adminurl http://127.0.0.1:7001 -username weblogic -password weblogic redeploy -name MyWebApp

wls-api.jar를 클래스패스에 추가하고 실행하니 이번엔 weblogic/rmi/extensions/RemoteRuntimeException 클래스가 없다는 에러가 난다. 슬슬 짜증이 난다.

4. 웹로직 문서에 나온대로 weblogic/server/bin/setWLSEnv.cmd를 먼저 실행 후 3번을 다시 시도해보니 성공!

정녕 순수 ant로 redeploy하는 방법은 없는 것인가? 혹시 weblogic에 내장된 ant를 써야하는 건가?
아니면 내가 뭐 빠뜨렸나...?

Posted by 에코지오
,

메이븐에는 wagon이라는 게 있는데 ftp, http, scp, webdav 같은 전송 프로토콜을 추상화한 것인데 site:deploy는 site 파일들을 리모트에 전송하기 위해 wagon 기능을 이용한다.  리모트 경로는 아래처럼 "프로토콜://~" 형식으로 설정하면 되며, 메이븐은 설정된 프로토콜에 적당한 프로바이더를 찾아서 파일을 전송해준다.

  <distributionManagement>
    <site>
      <id>www.yourcompany.com</id>
      <url>scp://www.yourcompany.com/www/docs/project/</url>
    </site>
  </distributionManagement>

site:deploy를 실행하고 콘솔에 찍히는 로그를 살펴보면 

- 로컬에서 .wagon12345.zip 과 같은 임시 zip 파일이 만들어진다
- zip 파일을 리모트 서버로 전송한다. ######## 표시가 늘어나는 식로 전송 진행상태를 보여준다.
- 리모트서버에서 unzip 명령으로 해당 경로에 압축을 풀고, 압축이 다 풀리면 zip 파일을 삭제한다.

그러니까 ant의 scp 타스크나 ftp 타스크가 지정된 fileset에 대해서 파일을 낱개로 하나씩 보내는 반면에,
wagon은 파일에셋을 로컬에서 압축하여 하나의 zip파일로 보낸 뒤 리모트에서 zip을 풀어내는,
나름 효율적인 방식으로 작동한다.

그러나 리모트에서 zip 파일을 푸는 방법에 문제가 있다. 리모트 서버에서 unzip이 없으면 에러가 발생하는 것이다.
실제로 지금 있는 프로젝트의 hp-ux 서버에는 unzip이 설치되어 있지 않았다.
(또 이상한 건 unzip 설치후 ssh 클라이언트로 접속해서 unzip을 실행해보면 잘 실행이 되는데도 불구하고,
wagon으로 파일을 전송해보면 unzip이 없다는 에러가 발생한다. unzip을 /usr/bin에 두어 해결은 했지만,
지금도 잘 이해가 되질 않는다. /usr/bin 이외의 다른 위치에 있으면 unzip이 없다는 에러가 발생한다는게..쫌...)

구걸링을 해보니 메이븐 1.x에서는 압축파일의 포맷과 압축해제 실행파일의 위치를 지정할 수 있게했다고 한다.
즉 tar로 묶는 것도 되고 gunzip으로 zip을 풀 수도 있었단 거다. 그러던 것이 메이븐 2.x에 와서 zip, unzip으로 고정이 돼버렸다.

http://jira.codehaus.org/browse/MSITE-30?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=147326#action_147326

황당한 생각에 wagon-ssh 프로바이더의 소스를 다운받아 까보니
org.apache.maven.wagon.providers.ssh.ScpHelper 클래스의 putDirectory() 메소드에
이렇게 하드 코딩이 돼있다.

executor.executeCommand( "cd " + path + "; unzip -q -o " + zipFile.getName() + "; rm -f " + zipFile.getName() );

왜 이렇게 fix 시켰을까?  막돼먹은 코딩인가? 아니면 관습의 강요인가?

Posted by 에코지오
,

mvn site 명령을 날리면 site phase 발생전에 compile phase가 먼저 실행되어 황당할 때가 있다.
원래 site 단계는 compile 단계의 실행을 필요로 하지 않는다.

FindBugs 플러그인를 사용할 때 이런 일이 발생하는데, 소스를 분석하기 위해 compile 단계를 실행하는 것 같다.

   <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>1.2</version>
   </plugin>
Posted by 에코지오
,