본문 바로가기

개발/spring

[ ubuntu ] gitlab - jenkins - tomcat 연결 - 2

지난번에 jenkin 설치 까지 완료하였습니다.

 

https://programmerk.tistory.com/19

 

[ ubuntu ] gitlab - jenkins - tomcat 연결 - 1

오랜만에 글을 쓰게되었습니다. 5월에는 쉬는날이 많기도하고 jenkins 셋팅을하는데 2~3일정도 걸려서 글이더 늦게 올라왔습니다. 연결하는데 너무 길어 분할하여 올리도록 하겟습니다. 젠킨스는

programmerk.tistory.com

 

 

그리고 삽질끝에 tomcat연결하여 자동배포 &  심볼릭 링크로 외부연결을 진행해보도록 하겠습니다.

 

설정할게 많아서 잘 따라오셔야 합니다

 

 

 

 

 

 

 

1. maven 설치 

 

https://maven.apache.org/download.cgi

 

Maven – Download Apache Maven

Downloading Apache Maven 3.8.1 Apache Maven 3.8.1 is the latest release and recommended version for all users. The currently selected download mirror is https://mirror.navercorp.com/apache/. If you encounter a problem with this mirror, please select anothe

maven.apache.org

 

메이븐 사이트로 이동해서  maven을 다운받아주세요

 

 

wget https://mirror.navercorp.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz

 

 

압축을 해제하고

 

 tar zxvf apache-maven-3.8.1-bin.tar.gz

 

경로를 바꿔주도록하겟습니다

 

sudo mv apache-maven-3.8.1 /usr/local/

 

그리고 profile에 경로를 추가해주세요

 

sudo vi /etc/profile/maven.sh

 

 

추가한 경로 적용

 

source /etc/profile/maven.sh

 

 

 

 

 

 

2. 메이븐,자바를 젠킨스에 연결해주기

 

 

 

JAVA 경로도 같이 추가해주세요

저는 자바를 자동설치하였기때문에 경로가

/usr/lib/jvm/java-1.8.0-openjdk-amd64 입니다 

 

 

 

이제 톰캣의 manager 계정을 추가해주겟습니다 

 

vi /usr/share/tomcat8/conf/tomcat-users.xml

 

 <role rolename="manager-gui"/>

        <role rolename="manager-status"/>

        <role rolename="manager-script"/>

<user username="username" password="password" roles="manager-gui,manager-script,manager-status" />

 

 

자 이제 톰캣을 재시작 하시고

 

sh {톰캣경로}/bin/shutdown.sh

sudo sh {톰캣경로}/bin/start.sh

 

여기까지만해도 tomcat 실행해서 localhost:8080/manager/html 해서 관리자 페이지로 접근되는지 확인해보셔도 됩니다.

 manager로 접속할수있는 IP를 설정해줄수도있는데 

vi 톰캣경로/webapps/manager/META-INF/context.xml 여기서 하라는분도 잇고 

 

 

 

vi 톰캣경로/conf/Catalina/localhost/manager.xml 에서 하라는분도 있는데 

 

저는 1번 방법으로 해당 부분을 주석처리해줘서 처리하였습니다 

 

  <!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
  allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->

 

 

 

 

 

 

 

3. GITLAB 토큰가져와서 젠킨스에 등록해주기 

 

깃랩에 접속한 다음 setting 을 누루고 

 

accesstoken을 찾아주세요 

 

accessToken을 누른후 토큰정보를 입력한후 Scopes 를 3가지모두 체크해주세요 

 

 

토큰을 생성하면 토큰값을 복사해둔후 젠킨스로 돌아갑니다.

 

 

제킨스 관리 - manage Credentials 로 가서

 

 

Jenkins를 선택하고

 

'

 

 

만드신 키를 넣어 저장합니다. 나중에 젠킨스랑 깃랩이랑 실제 연동될떄 사용될 것입니다.

 

 

 

 

 

 

 

 

4. 이제 실제 연결해보도록 하겟습니다. 

 

Item 생성 

 

 

project 명 입력후 freestyle project

 

소스 코드관리로와서 자신의 git 서버 경로를 넣어주고 아까 만든 키를 넣어주면됩니다.

 

 

만약 repository URL 을 입력했는데 

Failed to connect to repository : Error performing git command: git ls-remote -h

에러가난다면 서버에 git을 설치해주세요 !!   ( 젠킨스 패키지에서 설치 한경우에도 위에 에러 발생하면 서버 쉘에서 apt-get 으로 git 설치 하면됩니다 ) 

 

 

 

빌드 유발 ,빌드환경은 넘어가겟습니다. ( 추가설정 (깃 commit시 자동 배포 , 주기적 자동 배포 등) 필요한분들은 찾아서 해보셔도 되요.)

빌드는 Invoke top-level Maven targets 으로 해주시면됩니다 

 

 

 

빌드 후 조치는 Deploy war/ear to a container 를 선택해주시고 아래처럼 넣어주시면되여

containers에 credentials 는 아까 위에서 만든 tomcat manager 아이디와 패스워드를 입력하시면됩니다.

이 설정으로 인해 젠킨스가 gitlab에서 가져온 war파일을 톰캣에 배포해주게됩니다.

 

 

 

 

 

여기까지 완료 됫으면 저장하고 build 하면됩니다.

 

 

 

 

 

추가 -  에러 발생 1

 

위에까지 작업하고 build를 했는데 아래와 같이 pom.xml을 못찾는다고 에러가 발생하였습니다. 

 

 

실제 위에 경로에가보니 경로에 pom.xml이없더라고요 

 

 

/var/lib/jenkins/workspace/test/project명/pom.xml  이있더라고요.

 

(/var/lib/jenkins/workspace/test/  <== 젠킨스가 빌드 하면 코드를 가져오는 경로 ) 

 

그래서 아까 프로젝트 셋팅부분에서 build 부분에 고급을 눌러 pom경로를 수정해주었습니다.

 

 

 

 

추가 -  에러 발생 2 

 

제 프로젝트에서 사용자가 업로드하는 파일이 있는데 이 파일을 톰캣

톰캣경로/webapps/ROOT/resource/img 에 저장했었습니다.

 

그런데 ROOT.war를 배포하는과정에서 위의 경로가 삭제되고 다시 생기면서 사용자가 업로드한 이미지가 모두 사라지게 되더라고요.

 

이 문제를 해결하기위해 사용자가 업로드한 이미지를 ROOT 밖에 놓아야 했습니다.

 

그래서 두가지 방법이있었는데

 

하나는 톰캣경로/conf/server.xml 에 context를 추가하는 방법이였고 나머지한가지는 심볼릭링크를 설정해주는 방법이였습니다

 

Context를 추가하는 방법은 톰캣이 해당경로를 인식하게끔해주는 방법이였는데 저는 아무리 추가해도 안되더라고요.

 

(심볼릭 링크란 , 윈도우에 바로가기 같은 기능입니다.) 

 

그래서 심볼릭링크를 설정해주고 젠킨스에서 build 시 스크립트를 실행해주도록 설정하였습니다

 

이방법을 하기위해서는 

 

1.  jenkins에 root권한을 줘야합니다. 권한 안바꾸면 파일 생성할때 에러 발생합니다. 

 

 

sudo su로 root로 진입한다

cd /etc/sudoers.d로 이동

sudo vi jenkins로 새 설정 파일을 만든다

jenkins ALL=(ALL) NOPASSWD: ALL를 입력해주고 편집에서 나온다

chmod 0440 jenkins로 파일의 권한을 바꾼다

 

 

 

2. 다음은  shell 스크립트를 하나 만들어줍니다

vi /home/ansgyqja3/start.sh

 

echo "start shell script"

sleep 30

sudo mkdir /usr/share/tomcat8/webapps/ROOT/resources/img/

sudo ln -s /home/ansgyqja3/upload/test1/* /usr/share/tomcat8/webapps/ROOT/resources/img

echo "end shell script "

 

쉘스크립트 권한도 바꿔줄게요 

chmod +x /home/ansgyqja3/start.sh

 

스크립트 내용은 

에코 로그를 찍고  30초 대기를 한후  톰캣에 img 폴더를 만든다

유저가 업로드하는 이미지가 저장되어있는경로 /home/ansgyqja3/upload/test1/의 파일들을 

{톰캣경로}/webapps/ROOT/resource/img에 연결한다.

종료 로그를 찍는다.

 

 

 

 

3. 톰캣이 심볼릭 링크를 읽을 수 있도록 설정해줍니다

vi {톰캣경로}/conf/context.xml 

<Resources allowLinking="true"/>

 

 

 

 

 

 

4. 이제 이 내용을 젠킨스 빌드에 Execute shell 을 선택하고 아래와 같이 추가해줍니다.

 

 

 

스크립트에 & 를 넣은이유는 비동기 처리를 하기위해서인데 

 

동기처리가되면 

 

젠킨스 빌드 -> 스크립트 실행 (30초대기 ) 심볼릭링크 적용  -> war 배포 하기떄문에 심볼릭링크가 다시 배포하는과정에서 삭제가 됩니다.

 

비동기 처리해야

 

젠킨스 빌드 -> 스크립트 실행 -> war 배포 -> 심볼릭링크 적용 됩니다.

 

수고하세요 ~