지난번에 jenkin 설치 까지 완료하였습니다.
https://programmerk.tistory.com/19
그리고 삽질끝에 tomcat연결하여 자동배포 & 심볼릭 링크로 외부연결을 진행해보도록 하겠습니다.
설정할게 많아서 잘 따라오셔야 합니다
1. maven 설치
https://maven.apache.org/download.cgi
메이븐 사이트로 이동해서 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 배포 -> 심볼릭링크 적용 됩니다.
수고하세요 ~