지난번 글에서
서버 한대에 gitlab , 나머지 서버한대에 jenkins-tomcat을 올리는 작업을 진행했습니다
jenkins와 tomcat에 한 서버에 설치되어 deploy ear/war to container를 사용해서 배포 햇지용..
https://programmerk.tistory.com/20
그런데 tomcat서버가 여러대가 되서 다른서버로 올리는 상황이 생기면 어떻게 해야할까 고민하여 찾아보는 도중 ssh를 이용하여 배포하는 방법을 찾게되어 진행해보았습니다
publish over ssh 를 사용하는건데요 .
ssh 는 원격 디바이스에 접속할때 사용되는 암호화 방법입니다.
작업의 원리는 간단합니다
jenkins서버에서 tomcat 웹서버로 ssh 접속을 한 후 war파일을 전달한 후 스크립트를 실행시키도록합니다
그렇게 하기위해서
jenkins에 자신의 rsa private 키를 저장하고 접속하려는 서버에 자신의 rsa public 키를 저장해주면 접속이 가능합니다.
실제 진행되는 과정을 보여드리겟습니다 ~
1. 일단 두대의 클라우드 서버를 준비합니다.
한대에는 jenkins (agent server 라 칭함 )를 나머지 한대에는 tomcat(remote-server) 를 설치합니다.
https://programmerk.tistory.com/22
https://programmerk.tistory.com/19
2. agent 서버에 ssh key를 생성한 후 remote 서버에 등록
- agent server config
sudo ssh-keygen -t rsa -C "jenkins" -m PEM -P "" -f /var/lib/jenkins/.ssh/id_rsa
관리자 권한으로 ssh-keygen을 사용하여 이름 jenkins , 패스워드 "" , 경로는 {젠킨스_HOME}/.ssh/에 id_rsa라는 파일을 생성할 것이다
ssh-keygen은 public/private 키를 생성하여 ssh 접속을 할때 사용된다 . Public 키는 추후에 remote-server 에 등록해줄것이고 private 키는 젠킨스 public over ssh 설정에 에 넣어줄것이다.
이 한쌍의 키가 있어야 ssh 접속이 가능하다
생성한 .ssh폴더의 파일을 젠킨스 권한으로 변경
chown -R jenkins:jenkins /var/lib/jenkins/.ssh
chmod -R 777 /var/lib/jenkins/.ssh
그리고 id_rsa.pub 파일에 들어가서 데이터를 복사해야한다
vi id_rsa.pub
- remote server
복사한 데이터를 remote 서버로 가서
vi ~/.ssh/authorized_keys 연다음 위에서 복사한 내용 넣어주시면되여
( 없는경우 아래처럼 디렉토리 만들고 권한 주시면됩니다 )
mkdir .ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
3. 젠킨스 웹페이지에 들어가 자신의 publish over ssh에 private key 및 설정
넣을때 ------Begin 부터 ~~~~~~~~~~~~~~~KEY ------------- 까지 다 넣어줘야해요 !!!!!!!!
그다음 SSH servers 설정에 remote-server 정보를 넣어줄거에요
Name은 아무거나
Hostname 은 remote-server IP
Username 은 remote-server username
Remote directory는 /home/사용하는 디폴트 디렉토리 를 넣어주세요
이제 테스트를 진행합니다
테스트가 success 뜨면 정상 등록됫으니 저장해주세요
저는 여기서 엄청 fail 떳어요
그래서 keygen으로 여러가지 만들어봣는데 jenkins 경로에다가 만든것만 됫습니다.
4. 젠킨스에 배포설정 파일 생성
이제 제킨스 프로젝트를 생성하겟습니다.
프로젝트 생성내용은 저번에 보여드린거와 같고
빌드후 배포 부분을 deploy container 에서 send build artifacts over ssh 로 바꿀것입니다.
이설정으로 build한 war파일을 remote server로 sftp 로 전달하게됩니다.
밑에 소스경로를 찾아보니까 {jenkins_home}/workspace/젠킨스 project명 이 기본 경로로 잡혀있었습니다
Source files 에 **/*.war 로 잡고
Remove prefix에 소스프로젝트명/target 을선언해줍니다.
( 풀 경로가 {jenkins_home}/workspace/젠킨스 project명/소스프로젝트명/target/ROOT.war 입니다 )
Remote directory 는 저는 필요없어서 비워두고
Exce command 에 실행시킬 명령어를 입력합니다
저같은경우에는 ~/ 경로에 start.sh 이라는 쉘스크립트를 만들어 사용할 것입니다
5. 이쉘을 만드는 방법은 vi ~/start.sh 입니다
안에 내용은
whoami
sh /usr/share/tomcat9/bin/shutdown.sh
sudo sh /usr/share/tomcat9/bin/startup.sh
echo "end"
whoami 로 실행하는 콘솔의 유저를 확인하고
이 스크립트에는 젠킨스가 배포후 톰캣을 shutdown 햇다가 start하는 부분을 넣어둘 것 입니다.
이렇게하고 저장
6. 빌드 및 확인
빌드되는 로그를 보면 지정한대로 원격 서버로 22 포트를 사용하여 SFTP 로 접속 했고 system 에서 설정한 directory로 cd 를 사용하여 이동하는것을 볼수있습니다 .
그리고 ROOT.war 를 put하여 원격서버로 전달하였습니다. 전달이 끝난후 스크립트를 실행하였습니다.
스크립트의 whoami ==> 쉘 스크립트 유저 를 확인할 수 있고
Tomcat이 시작되고
Echo 로 찍은 로그가 남는것을 볼수있습니다.
혹시 쉘스크립트동작시 sudo 부분에서 에러가 발생하면 이부분을 jenkins가 아님 whoami 에서 나온 유저로 추가해 아래와 같이 해주세요
이렇게 함으로써 이제 웹서버가 여러대가 되어도 젠킨스에서 프로젝트를 여러개 만들어서 한번에 관리할수 있습니다.
윈도우와 연결할떄는 아래 윈도우 ssh_config 설정해주시면됩니다