회사에서 Jenkins 스터디를 하는데 SVN과 Ant를 연동해보라는 과제를 받았다.
근데 Ant가 뭔지도 몰라서 개념 정리부터 시작해보겠다. (ㅠㅠ)
목차
1. 개념
2. ant 프로젝트 생성하기
3. Jenkins와 연동하기
4. Tomcat에 배포하기
1. Jenkins, SVN, Ant의 개념
Jenkins
- 빌드, 배포 자동화를 돕는 플러그인을 수백개 제공하는 CI Tool의 일종.
- 자세한 설명: yeonyeon.tistory.com/56?category=931428
SVN
- 형상 관리 도구의 일종
- commit, update를 통해 서버에 파일 업/다운로드가 가능하다
Ant
- xml 형태의 Java 기반 빌드 도구
- jar, war, zip, ear 파일 생성
- 빌드 도구의 발전: Make -> Ant -> Maven -> Gradle
2. Ant 프로젝트 생성하기
ant 설치하기 ▼
Windows
-> ant.apache.org/bindownload.cgi 에서 zip 파일 다운로드 후 압축 해제
Linux
-> 다음 명령어 입력
$ sudo apt update
$ sudo apt install ant #설치
$ ant -version #설치 확인
간단한 예제를 준비했다.
Ant Project는 별다른 설정 없이, 자바 프로젝트에 build.xml 파일을 추가하면 된다.
요즘은 Maven, Gradle을 많이 사용하는 추세지만 Dynamic Web Project 같은거에선 간간히 쓰이는 듯 하다.
Hello World!! 를 출력하는 Dynamic Web Project를 생성했다.
(Java Project로 생성했어도 Dynamic Web Project로 변경 가능하다.)
build.xml
<?xml version="1.0"?>
<project name="testProject" default="main" basedir=".">
<target name="main">
<javac srcdir="./src" destdir="./bin" includeantruntime="false">
</javac>
<java classpath="./bin" classname="testProject.HelloWorld">
</java>
</target>
</project>
build.xml의 세부적인 코드에 대해 더 알고 싶다면 ant에 대해 공부하면 된다.
이 글의 목적은 Jenkins와 연동이므로 자세한 설명은 생략한다.
프로젝트 생성 후에는 SVN과 연동시킨 후 모두 커밋했다.
SVN 레포지토리 생성하기: yeonyeon.tistory.com/61
3. Jenkins와 연동 및 빌드까지가 목적이라면 프로젝트는 위 수준에서 멈추면 된다.
하지만 4. Tomcat에서 배포하기 를 따라하고 싶다면 이 외에도 설정할 부분이 많다. (더보기 클릭)
1. 프로젝트 Dynamic Web Project로 변경
2. web.xml 생성
프로젝트 우클릭 - Java EE Tools - Generate Deployment Descriptor Stub
현재 web.xml을 생성한 상태라서 클릭이 막혀있는데 생성 전이라면 클릭 가능하다.
3. build.xml 수정
<?xml version="1.0"?>
<project name="testProject" default="main" basedir=".">
<!--compile 전에 실행하는 선행 작업들 -->
<target name="init">
<!--변수 선언 -->
<property name="src" location="src" />
<property name="bin" location="bin" />
<property name="lib" location="/WEB-INF/lib" />
<property name="war.name" location="testProject.war" />
<property name="web" location="WebContent" />
<!--bin 폴더가 없으면 생성 -->
<mkdir dir="${bin}" />
<!--Format 설정 -->
<tstamp>
<format property="DSTAMP" pattern="yyyyHHdd" />
<format property="TSTAMP" pattern="HHmm" />
</tstamp>
</target>
<!--javac를 이용해 java파일->class파일 -->
<target name="compile" depends="init"> <!--depends: target 작업을 하기 전에 선행 되어야 함. init작업이 먼저 실행 되어야 함. -->
<!--src 폴더의 bin 폴더에 있는 클래스들 내려 받기 -->
<javac srcdir="${src}" destdir="${bin}" includeantruntime="false">
</javac>
</target>
<!--java코드 실행 -->
<target name="main" depends="clean,compile,war">
<java classpath="${bin}" classname="testProject.HelloWorld">
</java>
</target>
<!-- war 생성 -->
<target name="war" depends="compile">
<!--dist 폴더에 format한 ${DSTAMP}.war 로 생성 -->
<war destfile="${bin}/${DSTAMP}.war"
webxml="${web}/WEB-INF/web.xml">
<!--${web} -> WebContent( property에 설정) 에 web.xml 제외한 나머지 모두 war로 생성 -->
<fileset dir="${web}">
<include name="**/*.*" />
<exclude name="WEB-INF/web.xml" />
</fileset>
</war>
</target>
<target name="clean">
<delete dir="${bin}" /> <!--폴더 삭제 -->
</target>
</project>
3. Jenkins와 연동하기
1. Jenkins 설정
Jenkins 관리 - Global Tool Configuration - JDK 및 Ant 추가
2. Jenkins new item
소스 코드 관리 - Subversion
Subversion 선택지가 없다면?
-> 링크의 2-1 참조 yeonyeon.tistory.com/59?category=931428
Credentials은 옆의 Add 버튼을 통해 추가할 수 있다.
Password와 ID부분에 SVN 계정을 입력한다.
Poll SCM을 이용해 3분마다 빌드하겠다는 설정을 했다.
Git과는 달리 SVN은 commit/push가 일어날 경우에만 빌드가 불가능한듯 하다.
3분마다 빌드가 무제한 되는 것이 아니라, SVN에 변경내역이 있으면 빌드 된다.
target name이 여러개라면 엔터 치면서 입력하면 된다.
main1
main2
main3
2-1. ~~\bin does not does not exist or is not a directory 에러
Jenkins의 문제는 아니다.
build.xml을 보면 bin 폴더 그 안에 파일이 생기도록 해놓았다.
cmd 창으로 프로젝트를 실행했을 때는 bin 폴더가 자동으로 생겼으나 Jenkins에선 그게 안되는 듯 하다.
SVN이랑 Jenkins를 보니 bin 폴더가 없었고 생성 후 다시 빌드 해주니까 성공했다.
빌드 완료 화면 (1분마다 빌드 적용 시)
#14 빌드 이후로 바로 SVN에 커밋 했는데 즉시 빌드가 되지 않는다.
약 1분 후에 #15 빌드 실행되는 것을 확인할 수 있다.
4. Tomcat에 배포하기
Jenkins 플러그인에 Deploy to container가 설치되어있다는 가정 하에 시작한다.
1. Tomcat의 tomcat-users.xml 파일에 다음 내용 추가
(Ubuntu 기준으로 tomcat의 설정 파일들은 /etc/tomcat8에 있었다.)
<role rolename="tomcat"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="아이디" password="비밀번호" roles="tomcat,manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
2. 설정 변경 후, 톰캣 재시작.
apt-get 방식으로 설치했다면 shutdown.sh과 startup.sh 파일은 /usr/share/tomcat8/bin에 위치할 것이다.
허나 ./shutdown.sh를 입력해도 재시작이 불가능 해 아래 명령어를 사용했다.
$ sudo /etc/init.d/tomcat8 restart
3. Jenkins에 추가한 Item의 설정 변경
4. 빌드 후 배포 확인
4-1. java.lang.InterruptedException: [DeployPublisher] [WARN] No wars found. ... 에러
ERROR: Step ‘Deploy war/ear to a container’ aborted due to exception:
java.lang.InterruptedException: [DeployPublisher][WARN] No wars found. Deploy aborted. %n
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:107)
at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123)
at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:80)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:45)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:804)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:753)
at hudson.model.Build$BuildExecution.post2(Build.java:177)
at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:698)
at hudson.model.Run.execute(Run.java:1932)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:429)
예상 원인
- Jenkins 설정에 오타 존재
- 잘못된 경로
- war 파일이 생성되지 않음 (또는 찾지 못함)
참고
ant 프로젝트 - Jenkins 연동: pseg.or.kr/pseg/inforeview/7617
ubuntu에서 ant 설치하기: yorublog.tistory.com/52?category=895031
build.xml 작성: rank01.tistory.com/89
'Develop > etc' 카테고리의 다른 글
[Jenkins] Sonarqube와 연동 (2) | 2021.04.05 |
---|---|
테스트 종류와 도구 (0) | 2021.03.31 |
[SVN] visual SVN 설치 및 실행 (0) | 2021.03.02 |
[Jenkins] SVN과 연동하기 (0) | 2021.02.25 |
[Jenkins] Git과 연동하기 (2) | 2021.02.24 |