도와주신 알리, 시드, 크로플 감사합니당 >ㅁ<
자자 Jenkins에서 자동 배포하는 방법을 정리해보자.
우선, 자신의 프로젝트 구조와 사용할 수 있는 포트가 어느 것이 있는지 확인해보아야한다.
현재 내가 사용할 수 있는 aws의 보안그룹에서 허용해주는 포트는 HTTP용 80포트, 그리고 8080포트이다.
따라서 스프링 애플리케이션을 8080포트로 띄워주고 있기 때문에, 어쩔 수 없이 젠킨스를 80포트로 연결해야하는 이슈가 발생한다.
그래서 나는 우선, 젠킨스용 인스턴스를 새로 만들어 8080 포트를 이용하도록 설계하였다.
먼저 젠킨스를 설치할 EC2 인스턴스를 새로 만든 뒤, 도커를 설치한다.
도커 설치는 다음 명령어를 통해 수행할 수 있다.
sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
도커 설치가 완료되면, 도커에서 젠킨스 이미지를 가져오자.
sudo docker pull jenkins/jenkins
젠킨스가 도커에 제대로 설치되었는지 확인하기 위해 docker images 명령어를 통해 확인해보자.
그리고 REPOSITORY에 jenkins/jenkins가 존재한다면, 다음 명령어를 통해 젠킨스를 실행하자.
docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins
여기서 위 명령어의 옵션들에 대해 간략한 설명을 덧붙이자면, 다음과 같다.
-d : 백그라운드에서 실행
-p : 포트 옵션은 도커 컨테이너 내부 포트와의 매핑을 설정한다. 왼쪽 포트는 외부 포트번호이다. 예를 들어, 1234:8080과 같이 쓴다면 내 서버 아이피의 1234 포트로 접근하게 되면, 컨테이너 내부 포트 8080 (Jenkins Container)와 매핑을 시키겠다는 의미이다.
-v : 호스트와 볼륨을 공유하는 설정이다. : 왼쪽이 내 호스트 서버의 루트 경로를 잡아온다. 위와 같이 쓴 경우 루트에 jenkins라는 폴더가 생긴다. 그리고 이 폴더를 실제 컨테이너 내부의 /var/jenkins_home이라는 폴더와 매핑한다.
--name : 컨테이너 이름
-u : 사용할 유저명 (명시하지 않으면 jenkins가 default인 것 같은데, 확실하진 않다.)
이제 위 명령어를 통해 젠킨스를 실행시킨 뒤, 젠킨스 인스턴스의 퍼블릭 아이피와 바인딩한 포트 번호를 통해 젠킨스에 접속할 수 있다.
만약, EC2의 아이피가 123.123.123.123이며, 위 명령어처럼 8080:8080으로 실행한 경우 123.123.123.123:8080으로 접속하면 젠킨스에 접속할 수 있다.
젠킨스에 접속하면 위와 같은 화면이 뜰 것이다. 이제 우리는 패스워드를 가져온 뒤, 저 입력창에 패스워드를 입력해야한다.
패스워드를 가져오는 방법은 다음과 같다.
sudo cat /jenkins/secrets/initialAdminPassword
가져온 AdminPassword를 입력해 로그인한다.
로그인하면 다음과 같은 화면이 뜰텐데, 여기서 왼쪽을 선택해서 플러그인들을 모두 설치한다.
플러그인들이 설치되는 것을 기다리며, 젠킨스 인스턴스와 웹 애플리케이션 인스턴스간의 연결이 가능하도록 설정해주자.
이 과정은 바스티온과 서비스 서버를 연결하는 과정과 유사하다.
먼저, 스프링이 띄워져있는 서비스 서버에서 접속한 뒤, ssh-key를 생성한다.
서비스 서버에서 다음 명령어를 입력하면 자동으로 ssh-key가 생성될 것이다.
ssh-keygen -t rsa -b 4096 -m PEM
이 때, passphrase는 엔터를 쳐도(공백) 되고, 아니면 본인이 기억할 passphrase를 남겨도 된다.
그리고 vim .ssh/ 명령어를 입력하면 다음과 같이 뜰 것이다.
여기서 id_rsa.pub키를 복사한 뒤, 서비스 서버에 해당 public key를 추가한다.
즉, 서비스 서버에서 다음 명령어를 통해 실행한 뒤, 뜨는 key에서 한줄 정도 띄운 다음 복사한 public key를 추가한다.
vi ~/.ssh/authorized_keys
// 위 명령어를 실행하면 다음과 같이 뜰 것임
ssh-rsa AABASDFASDFAWRGDFA...
....KEY-xxx
ssh-rsa CCDDEEFFSSFAWRGDFA...
....ubuntu@ip-111-1111-111-111 (복붙한 퍼블릭 키)
그 다음, cat .ssh/id_rsa 명령어를 통해 나오는 PRIVATE_KEY를 복사해둔다.
이 쯤 되면, 젠킨스의 플러그인들이 모두 설치되었을 텐데, 이제 우리의 SSH 설정에서 필요한 플러그인과 Github Webhook을 위한 플러그인을 직접 설치해야한다.
젠킨스 대시보드에서 Jenkins 관리 > 플러그인 관리 > 설치 가능을 누른 뒤, Publish Over SSH와 Github Integration 을 설치한다.
설치가 모두 완료되면 다시 Jenkins 관리 > 시스템 설정에 들어가서 Cmd+F로 ssh server를 검색한다.
검색 결과 다음과 같은 화면이 나올텐데, 입력창을 모두 채워준다.
입력창에 대한 설명은 사진 아래에 적어두었다.
Name - 본인이 원하는 이름 아무거나
Hostname - 서비스 인스턴스 private ip
Username - ubuntu (이는 EC2에 접속할 때 ssh -i KEY ubuntu@{ip}에서 ubuntu이다. 명칭이 다르다면 그 명칭을 쓰면 된다.)
Remote Directory - 젠킨스에서 빌드 후 jar 파일이 넘겨지는 파일 경로를 의미한다.
여기서 <고급>을 누르면 Key를 입력할 수 있는 곳이 나온다.
Passphrase - ssh key generate시 passphrase를 입력했다면 작성
Key - 아까 복사해두었던 cat .ssh/id_rsa에 나오는 private key
모두 입력했다면 Test Configuration을 눌러 Success가 나오는 지 꼭 확인하길 바람!
글이 너무 길어져서 Item 등록 및 Github Repository와 연결하는 부분은 다음 게시글에서 계속 ~
>> Jenkins 자동 배포 2편 바로가기 <<
- 참고자료
https://pjh3749.tistory.com/m/261
https://goddaehee.tistory.com/258?category=399178
https://techcourse.woowahan.com/s/U8wOamCU/ls/b0qhNm2t