Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

젠킨스 플러그인 중에는 외부 시스템과 연계하여 젠킨스를 더 강력하게 해주는 플러그인들이 있다.

이 절에서는 이런 플러그인을 사용하거나 기타의 방법을 통해 젠킨스를 외부 시스템과 연계하는 방법에 대해서 알아 보자. 

서브 버전에서 원격 빌드

저장소에 커밋했을 때 특정 조건을 만족하면 자동으로 젠킨스에서 빌드를 수행하기를 원할 수도 있다.

...

먼저 서브버전의 저장소중 hook 디렉터리 밑에 다음 내용으로 post-commit 파일을 생성한다. 이 장에 나오는 예제대로 로컬 저장소를 만들었다면 $HOME/svnrepos/hooks/post-commit 이 될 것이다.

Code Block
languagephp
linenumberstrue
#!/usr/bin/php
<?php
$svnlook = 'svnlook';
$repos = $argv[1];
$rev = $argv[2];
$change = `$svnlook changed -r "$rev" "$repos"`;
$list = split("/", $change);
$tmp = split("[ \t]+", $list[0]);

// Project Name

$proj_name = $tmp[1];
$url = "http://jenkins.example.com/job/$proj_name/build"; //젠킨스 URL
$tok = "mySecretToken";
$auth = " -u devel:myPasswd "; // 젠킨스 인증 정보
$param = " --data-urlencode \"token=$tok\" ";

if ($proj_name == "lib-hello") //  원격 빌드할 프로젝트 이름.
	{ 
	$cmd = "curl -v $auth $url $param";
	$output = shell_exec($cmd);

	//실행 결과 출력

	error_log("$cmd RESULT\n\n" . $output);
	}

...

이제 작업 설정에 들어가 보자. "Assign Redmine project" 버튼을 클릭하면 두 개의 설정 메뉴가 표시된다.

  • "Redmine website" : 레드마인 URL 을 설정할 수 있다. 직접 입력은 안 되며 전역 설정 값중에 선택할 수 있다.

  • "Redmine project name" : 현재 젠킨스 작업과 연결되는 레드마인 프로젝트 이름이다. 사전에 레드마인에 프로젝트를 생성해 두어야 한다. 아쉽게도 인증을 지원하지 않으므로 레드마인 프로젝트가 공개여야 연동이 가능하다.

 

이제 소스를 커밋할 때 특별한 키워드와 이슈 번호를 주면 젠킨스의 빌드 상세 화면에서 "바뀐점" 을 클릭하면 해당 이슈로 가는 링크가 표시되며 클릭하면 레드마인 이슈를 볼 수 있다.

키워드는 다음과 같다. (number 는 레드마인의 이슈 번호를 의미한다.)

  • refs number

  • references number

  • IssueID number

  • fixes number

  • closes number

  • #number

  • refs number,number,number

젠킨스 레드마인 플러그인은 기능이 강력하지 않아서 빌드가 실패했을 때 젠킨스에서 바로 레드마인 이슈로 등록하고 이슈 내용에 젠킨스의 ${BUILD_URL) 을 자동으로 입력하거나 빌드와 테스트를 잘 마쳤을 때 레드마인 이슈 상태를 업데이트 하는 등의 작업은 지원하지 않는다.

다만 커밋 로그를 통해 빌드와 이슈를 묶어서 좀 편하게 확인할 수 있는 장점이 있으니 필요에 따라 취사 선택하여 사용하면 된다.

WAS 에 배포

https://wiki.jenkins-ci.org/display/JENKINS/Deploy+Plugin
Scroll ignore

아티팩트가 jar 인 lib-hello 같은 프로젝트를 생각해 보자. 개발과 빌드/테스트가 완료되면 아티팩트는 어딘가에 디플로이 되야 한다. 일반적인 jar 파일은 넥서스같은 저장소 관리자에 배치되며 사용하는 측은 메이븐등의 빌드 도구를 이용하여 가져가게 된다.

...

  1. 같은 서버에 다른 톰캣 인스턴스가 있을 경우 포트 충돌을 막기 위해 톰캣 포트 설정을 변경한다. conf/server.xml 을 수정해야 하며 Server port 와 HTTP Connector 포트 두 개를 안 쓰는 포트로 수정해 주자.

    Code Block
    languagexml
    <Server port="8005" shutdown="SHUTDOWN">
    <!-- ... -->
    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" UTIEncoding="UTF-8" />
    </Server>
    Note

    아파치 웹서버와 톰캣을 연결하여 서비스를 할 경우 아파치가 톰캣 연결이 가능하도록 SELinux 보안 설정을 했는지 확인하자. 자세한 내용은 "9.3.2.1 SELinux 설정" 을 참고하자.

  2. 톰캣 매니저 계정과 권한을 설정해야 한다. conf/tomcat-users.xml 에 계정과 권한을 설정하자. 설정 방법은 "9.2.3.1 tomcat1 tomcat-users.xml 설정" 을 참고하자. 아파치 웹서버에서 <Location>  지시자로 매니저 컨텍스트에 접근 제어를 설정했다면 젠킨스 서버의 IP 를 추가해 주어야 젠킨스가 디플로이 할 수 있다.

  3. 기본적으로 핫 디플로이 설정이 켜져 있으므로 별도로 설정할 필요는 없고 잦은 디플로이로 인한 OutofMemory 를 최소화 하기 위해 톰캣 구동시 PermGen 을 넉넉하게 설정해야 한다. 이에 대한 내용은 "9.1.3 에서 JVM 옵션 설정" 을 참고하자.

 


작업 설정

플러그인 설치가 끝났다면 이제 작업 설정을 변경해 보자. 배포는 빌드가 완료되어야 가능하므로 "빌드 후 조치" 항목에서 배포 설정이 가능하다.

 "빌드 후 조치 추가" 를 클릭하고 "Deploy war/ear to a container " 메뉴를 선택해 보자.

 

  • WAR/EAR files : 배포할 war 파일의 경로를 적는다. ant 문법을 사용할 수 있으며 기본 설정은 모든 war 를 의미하는 **/*.war 이다.

  • Context path: 배포할 경로이다. / 로 설정하면 루트 컨텍스트가 된다. server/myapp 같이 하위 경로에 배포하려면 /myapp 를 적어주자. 이 부분은 아파치와 mod_proxy 로 연계할 경우 ProxyPass 와 ProxyPassReverse 항목도 맞게 설정해 주어야  한다.

  • Containers : WAS 의 종류로 사용하는 WAS 의 종류와 버전에 맞게 선택해 주자. 우리는 톰캣 7 을 사용할 것이므로 Tomcat 7.x 를 선택했다.

    • Manager user name: 톰캣 host 매니저의 이름이다. 톰캣의 conf/tomcat-users.xml 에 지정되어 있다.

    • Manager password : host 매니저의 암호이다. 톰캣의 conf/tomcat-users.xml 에 지정되어 있다.

    • Tomcat URL : 젠킨스에서 빌드한 war/ear 을 배포할 톰캣 서버의 URL 이다. 서비스의 URL 이므로 젠킨스의 URL 과 혼동하지 말자.

이제 설정이 끝났으므로 빌드가 정상적으로 완료되면 톰캣에 자동으로 디플로이된다.

...

먼저 "젠킨스 관리" -> "시스템 설정" 에 진입하여 설정 항목에서 "Publish over SSH" 를 찾아서 연결에 필요한 정보를 설정해 주자.

  • Passphrase : SSH 연결시 암호를 사용하면 여기에 암호를 설정한다.

  • Path to key: SSH 키 쌍을 이용하여 로그인할 경우 개인키 파일의 경로를 설정한다.

  • Key: Path to key 와 같지만 키가 텍스트 파일로 존재할 경우 여기에 키의 내용을 입력한다.

  • Disable exec: 체크아웃 SSH 명령어를 실행하지 않는다.

  • SSH Servers

    • Name : SSH 연결 설정시 드랍 리스트 박스에 표시할 이름을 지정한다.

    • HostName : SSH로 연결할 실제 서버의 IP 나 도메인 이름을 지정한다.

    • UserName : SSH로 연결할 사용자의 계정을 입력한다.

    • Remote Directory : 원격 서버에 로그인 했을 때 초기에 이동할 디렉터리를 지정한다. 디렉터리는 반드시 존재해야 하며 없으면 에러가 발생한다.
      그외에 SSH 가 22번 포트가 아닌 다른 포트를  사용할 경우 "고급"을 클릭하여 포트를 지정한다.

 

이제 빌드 작업 설정을 변경할 순서이다. hello-webapp 작업 대시보드에 "구성"을 클릭하여 작업 상세 설정에 진입해 보자. 

...

디플로이는 빌드가 정상적일때만 수행 해야 하므로 "Run only if build succeeds" 라디오 버튼을 선택해 주자.

그리고 SSH Publishers 항목을 설정해 보자.

...

Transters : 서버에 보낼 아티팩트의 패턴과 실행할 명령어를 설정하는 메뉴이다.

  • Source files : 서버에 SCP 로 송신할 파일의 패턴을 입력한다. 앤트의 fileset 형식을 사용할 수 있다. 우리는 war 파일을 디플로이 할 것이므로 **/*.war 를 설정하자.

  • Remove Prefix : 아티팩트는 메이븐의 target/ 디렉터리에 생기므로 서버에 전송할 때 target 폴더를 만들고 이 안에 위치시키게 된다. 이러면 제대로 디플로이가 안 되므로 target 접두어를 빼고 서버에 전송해야 한다.

  • Remote Directory : 서버에 파일을 전송할 디렉터리를 지정한다. 절대 경로를 사용해도 되며 상대 경로를 사용해도 되지만 상대 경로일 때 현재 디렉터리가 전역 설정에서 지정한 초기 디렉터리라는 것만 명심하면 된다. 디플로이 해야 하므로 톰캣의 webapps 를 지정하면 된다.

  • Exec command : 서버에서 SSH 로 실행할 명령어를 설정한다. 입력한 순서대로 실행되며 여러 개의 명령어를 실행할 경우 엔터 키를 입력하면 된다. 우리는 다음 순서로 명령어를 실행할 것이다.

    • 톰캣 디렉터리로 이동

    • 톰캣 인스턴스 종료 ("9.1.3 톰캣 프로세스 우아하게 종료시키기" 의 스크립트 참고 - 스크립트내 TC_HOME 변수를 톰캣이 설치된 경로로 수정해야 한다.)

    • 루트 컨텍스트에서 배포를 위해 war 파일 이름 변경

    • 톰캣 인스턴스 시작

여기까지 설정했다면 이제 모든 설정을 마쳤다. "Build Now" 를 클릭하여 빌드와 디플로이를 진행해 보자.

...