[DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - 상용 클라우드 환경에 배포하기

2022. 9. 16. 15:27System 작업실/DevOps

728x90
반응형

 

 

 

이 내용은 인프런 - Jenkins를 이용한 CI/CD Pipeline 구축 강의를 보고 정리한 내용 입니다.


해당 내용의 Code 내용은 이 곳에서 확인하실 수 있습니다.



🗂 목차

 [DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - 자동화 도구의 사용
● [DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - Jenkins + Infrastructure as Code 와의 연동
● [DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - Jenkins + Ansible + Kubernetes 와의 연동
● [DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - Advenced Jenkins 사용 ① - Pipeline
● [DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - Advenced Jenkins 사용 ② - SonarQube
● [DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - Advenced Jenkins 사용 ③ - Multi Nodes
● [DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - 상용 클라우드 환경에 배포하기
[DevOps] Jenkins를 이용한 CI/CD Pipeline 구축 - 부록

 

 

 

 

 

🚀 AWS 환경에 배포하기

    🔽  AWS Cloud

        📦 소개

AWS 실습 환경 구성도

 

AWS에서 VM을 이용해서 위와 같이 환경을 구성해 보려고 해요.

 

 

 

 

        📦 Image를 이용하여 EC2 만들기

EC2에서 EC는 Elastic Computing의 약자에요.

간단하게 Cloud 환경에서 구동할 수 있는 가상 Server라고 생각하면 되요.


최초 주니하랑은 위와 같이 기본 지원 - 무료로 회원 가입을 하였어요.

 


진입을 하게 되면 위와 같은 화면이 보일텐데, 여기서 EC2로 들어갈게요.



그리고, 왼쪽에 인스턴스를 눌러줍니다.



AWS Resion에 대해 주니하랑은 서울을 선택해 주었어요.

각각의 Resion에 만들어진 내용들은 공유가 되지 않는다는 점을 잊으면 안되는 것이에요.



'인스턴스 시작'을 눌러주세요.



먼저 이름에다가 해당 EC2의 용도나, 이름을 적어주세요.
나중에 변경도 가능해요!



이 곳은 사용할 Server에 설치될 OS를 고르는 곳이에요.

놀라운 건 Mac OS도 지원이 된다는 사실!!

주니하랑은 Amazon Linux를 이용해보려고 해요.

 

💡 참고 사항

AWS 최초 가입 시 프리 티어 Service를 80 ~ 90개 정도 이용 가능.
EC2는 한달 기준 750시간씩 무료로 사용 가능.
단, EC2 인스턴스 개 당 750시간이 아닌 만들어 논 인스턴스 총 이용시간 기준.
만약 10개의 인스턴스를 이용한다고 가정했을 때, 개 당 75시간씩 이용 가능.

 


인스턴스 유형은 Hardware 유형 혹은 종류라고 생각하면 되고, 좀 더 쉽게 설명하자면
내가 갖고자 하는 컴퓨터의 CPU, Memory를 고르는 곳이에요.

주니하랑은 무료로 이용(t2.micro)할 수 있는 것을 선택할 것이에요.





Key Pair는 인스턴스에 접속하기 위한 Token 혹은 어떤 암호화 된 Key File이라고 보면 좋을 거 같아요.

주니하랑은 현재 Key Pair를 가지고 있지 않기 때문에 새로 만들어 보도록 할게요.



주니하랑은 위와 같이 Key Pair를 만들어 줄거에요.

현재 주니하랑은 Mac OS에서 작업을 하기 때문에 Putty 같은 Program을 이용하지 않아요.

만약 Window 사용자 중 Putty나, Xshell 등을 이용할 예정이라면 .ppk를 선택하는게 좋은 선택일 수 있어요.



이렇게 Key Pair가 내려받기 되었어요.




네트워크 설정 부분에서는 크게 만질것은 없지만, 방화벽에 보안 그룹 생성이라는 것을 공부해 보자면
해당 인스턴스에 접속할 수 있는 Port와 IP 등을 등록해서 외부와 통신하게 할 수 있도록 설정할 수 있는 부분이에요.
이는 방화벽이라는 특성을 공부하면 더 좋아요!



Storage 즉, HDD나 SDD 용량을 고르는 곳이에요.

기본 8GB를 준다고 하는데, 최대 30GB를 이용할 수 있다고 하네요!

주니하랑은 30GB 선택할게요.



이 곳은 Default Value로 넘어갈게요.



이렇게 만들어 볼게요.

'인스턴스 시작' 클릭!




다 만들어졌어요.

혹시 모르니 예상 요금 알림 받기 잊지마세요!



이렇게 주니하랑은 알림 설정을 했어요.



'모든 인스턴스 보기'를 누른 뒤 새로 고침을 하면 만들었던 인스턴스가 보이게 되요.

 

💡 참고 사항

인스턴스 중지 : 기동 중인 인스턴스 System 종료 (Shutdown)
인스턴스 종료 : 인스턴스 삭제 

만약 인스턴스 중지를 했다가 재 기동을 하게 되면 Public IP가 변경됨.


고정 IP를 박아버리고 싶은 경우 왼쪽 네트워크 및 보안에 탄력적 IP 선택


탄력적 IP 주소 할당을 누르면 고정 IP를 받을 수 있음.

단, 돈 내야 합니다.

 










 

        📦 EC2 인스턴스 접속

최초 주니하랑은 보다 편리하게 EC2 인스턴스에 접속하기 위해 SSH Client Tool을 설치해 주었어요.
다양한 Tool이 있어 입맛에 맞는 것을 이용해도 좋을 거 같지만, 주니하랑이 설치한 Tool이 궁금하시다면 이 곳에서 만나보실 수 있어요.

 


최초 위와 같이 SSH Client Tool에서 New Host를 등록해 줄 거에요.



위와 같이 Server 이름을 자유롭게 Label에 입력해주고, EC2 인스턴스 Public IP4 주소를 Address에 입력해 줍니다.

EC2 인스턴스는 기본적으로 생성이 되면 ec2-user라는 계정이 만들어지게 됩니다.
EC2 인스턴스는 ID, Password 방식으로 Loging하는 것이 아니라,
위에서 EC2 Key Pair를 등록할 때, 내려 받아졌던 값을 등록해서 Login을 해주어야 해요.


Password 입력하는 곳 옆에 Keys Button을 눌러줄게요.



Create a new key를 클릭할게요.



위와 같이 이름을 등록하고,

Import from key file을 눌러 Key File을 가져와 볼게요.






 

그러면 Private key에 위와 같이 암호화 된 문자열이 등록되는 걸 볼 수 있어요.
저장을 눌러줄게요.



등록된 Server Icon을 클릭해서 Server에 접속해 볼게요.



처음 접속했을 때, Add and continue를 눌러 Key를 등록해 주면 되요.



위와 같이 EC2 인스턴스에 접속을 하였어요.



이렇게 접속이 가능한 건 위와 같이 방화벽에서 22번 (SSH)에 대해 차단 정책이 없고, 모두 열려있기 때문이에요.









        📦 EC2 인스턴스 JAVA 설치

yum update -y


최초 yum Repository를 최신화 해줄게요.


yum list java*jdk-devel


설치 가능한 JAVA 목록을 확인해 보니 1.8 이상은 없네요.


하지만, 1.8 Version은 너무 낮기 때문에 AWS에서 제공하는 jdk 11 Version을 내려받기 해 볼 것이에요.


sudo curl -L https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm -o aws_corretto_jdk11.rpm

 

sudo yum localinstall aws_corretto_jdk11.rpm

 

java -version



내려 받고, 설치해 주었어요.



sudo /usr/sbin/alternatives --config java


위의 명령어로 Server에 설치되어 있는 JAVA 중 내가 원하는 JAVA를 선택할 수 있는 명령어에요.

하나밖에 없어서 그냥 Enter를 눌러주면 될 거 같아요.





내려 받았던 jdk rmp File은 지워주었어요.

 

 

 

 

    🔽  EC2 인스턴스

        📦 Image 만들기

이번에 해 볼 작업은 위에서 만든 EC2 인스턴스에 대한 Image를 만들어 JAVA가 설치된 환경에 인스턴스를 편리하게 설치하기 위한 사전 작업을 해보려고 해요.

우리는 컴퓨터에 OS를 설치할 때, ISO File을 받아서 OS를 설치하는데, 이 ISO File을 만들어 주는 작업이라고 생각하면 좀 더 쉬울 거 같아요.

 

 


최초 EC2 대시보드에서 인스턴스(실행 중)을 눌러줄게요.



해당 인스턴스를 클릭하고, 인스턴스 중지를 눌러 System Off를 해줄게요.

참고로 인스턴스 종료 누르면 안됩니다.




인스턴스가 꺼진 뒤 '작업' -> '이미지 및 템플릿' -> '이미지 생성'을 눌러주세요.



위와 같이 이미지 이름만 적어주고, 이미지 생성을 눌러서 이미지를 만들어 줄게요.



Navigation Bar에서 AMI를 선택해 줄게요.




Image 만드는 데는 꽤 시간이 걸립니다.



해당 Image에 대한 이름을 지어주었어요.








        📦 Image를 이용하여 인스턴스 만들기


최초 중지 했던 인스턴스를 다시 시작해 줄게요.



첫번째로 만들었던 인스턴스 이름을 위와 같이 설정해 주었어요.



다른 인스턴스에서 보다 편리하게 상호 접속을 위해 보안 그룹에 Tag를 하나 만들어 줄게요.

보안 그룹이라고 써져 있는 곳 밑에 sg-0ee...을 클릭해 볼게요.




'태그' Tag에서 '태그 관리'를 눌러줄게요.




'새로운 태그 추가'를 눌러주세요.



이렇게 Key - Value Type으로 Tag를 만들고, '변경 사항 저장'을 눌러 빠져나가 줄게요.



위와 같이 Tag가 하나 만들어진걸 확인할 수 있어요.
이 Tag를 이용해서 검색하여 보안 그룹을 선택할 수 있어요.





다시 인스턴스 창으로 돌아와서 '인스턴스 시작'을 눌러 새로운 인스턴스를 만들어 줄게요.



위와 같이 인스턴스 이름을 설정하고,
이번에는 Quick Start가 아닌 '내 AMI'에서 '내 소유'의 Image를 선택해서 위에서 만든 Image를 선택해 줄게요.




Key Pair 부분에서 이 전에 만들었던 Key Pair를 선택해 주세요.




'네트워크 설정'에서 보안 그룹은 '기존 보안 그룹 선택'을 눌러
이 전에 만들었던 인스턴스가 들어 있는 보안 그룹과 동일한 보안 그룹을 선택해 줄게요.




이번에는 4개의 인스턴스를 만들어 줄거에요.

이렇게 한 뒤 '인스턴스 시작'을 눌러줄거에요.




총 5개의 인스턴스가 존재하고, 방금 만든 인스턴스가 준비되고 있어요!



새롭게 만들어진 인스턴스에 각각의 이름을 달리 주었어요.




위와 같이 SSH Client에 각각의 인스턴스들을 등록해 주었어요.

Key Pair는 동일한 File을 이용할 것이기 때문에 따로 만질 필요없이 이름과 IP 주소만 변경해서 각각 만들었어요.




모든 인스턴스에 정상적으로 접속 되는 걸 확인해 주었어요.





Jenkins로 사용할 인스턴스에서 Docker로 사용할 인스턴스에 Ping Test를 했더니 Ping이 가지 않아요.




인스턴스 아무거나 선택하고, '보안' Tab에서 보안 그룹 밑에 sg-...을 클릭해 줄게요.



'인바운드 규칙' 에서 '인바운드 규칙 편집'을 눌러주세요.



규칙 추가를 누른 뒤 유형에 '모든 ICMP-IPv4'를 선택해 주었어요.
ICMP는 Ping Test할 때, 사용하는 Protocal 이름이에요.

그런 뒤 돋보기 모양을 누른 뒤 우리가 사용할 인스턴스들이 묶인 보안 그룹을 선택해 주면 되요.

되도록 0.0.0.0은 선택하면 좋지 않아요.

이는 어디서든 접근하겠다는 의미이기 때문이에요.




위와 같이 설정하고, '설정 저장'을 눌러줄게요.




바로 Ping이 뚫린걸 확인할 수 있어요.








        📦 Jenkins Server 구축

sudo amazon-linux-extras install epel -y


최초 위의 명령어를 통해 AWS에서 제공하는 확장 Package를 설치하도록 할게요.
이렇게 하는 이유는 현재 사용하는 Linux에 추가적인 Dependency Package들을 한번에 설치하기 위함이에요.


💡 참고 사항
epel이란? Extra Package for Enterprise Linux의 약어.

 

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

 



opt Directory에서 Maven 설치 압축 File을 받아주었어요.




sudo tar -xvzf {압축 File 이름}

위의 명령어로 압축을 해제해 주었어요.


💡 참고 사항
tar 명령어 Option

-x : File 압축 해제.
-v : 압축 과정을 보이게 하기 위해 사용.
-z : gz 압축 File 압축 풀기.
-f : File명 지정을 위해 사용.

 


압축 File을 삭제하고, File 목록을 확인해 보았어요.



maven Directory에 들어왔어요.


vim ~/.bash_profile


환경 변수 설정을 위해 M2_HOME과 그 밑에 PATH 내용을 추가해 주었어요.


source ~/.bash_profile


위의 설정 내용이 등록되게 해 주었어요.



mvn --version


Maven 설정이 정상적으로 완료 되었어요.


이번에는 Git을 설치해 볼게요.

sudo yum install -y git

 

git --version


Git도 정상 설치 완료 하였어요.



이번에는 본격적으로 Jenkins를 설치해 볼게요.


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

 

sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key



위의 명령어는 Server 내 yum Repository에

Jenkins 관련 Package가 포함되어 있지 않을 수 있기 때문에 yum Repository에 등록 하는 거에요.
그리고, Key를 등록해 주는 것이에요.

sudo yum install jenkins


yum 명령어를 통해 설치를 진행 해 주었어요.




Jenkins에서 위의 JAVA Version으로 설치를 진행할 때, 문제가 있다고 하여 JAVA Version을 다른 걸로 설치해 줄게요.


sudo amazon-linux-extras install java-openjdk11

반응형



sudo /usr/sbin/alternatives --config java

 

java -version



위와 같이 2개의 JDK가 설치 되어 있는데, 2번을 선택해 줄 것이에요.




sudo systemctl status jenkins


Jenkins Deamon이 죽어있어요.
살려줘야 겠어요.



Jenkins를 살려주었어요.


netstat -anp


Jenkins는 기본적으로 8080 Port를 통해 웹 브라우저로 접속할 수 있어요.

그렇기 때문에 AWS 보안 그룹에서 인바운드 규칙에 8080 Port를 열어주어야 해요.



'인바운드 규칙 편집'을 눌러줄게요.


 
주니하랑은 집에서만 접속이 가능하게 소스에서 '내 IP'를 선택해 집의 공인 IP가 선택되도록 하고,
위와 같이 8080 Port를 열어주었어요.

'규칙 저장'을 눌러줍니다.



Jenkins 초기 화면에 접속한 걸 확인할 수 있어요.


cat /var/lib/jenkins/secrets/initialAdminPassword


Jenkins 초기 비밀번호는 위와 같이 확인할 수 있어요.


값을 입력하고, Continue를 눌러줄게요.


이 후에 설치 작업에 대해서는 이 곳에 정성스럽게 준비해 두었어요.









        📦 Docker Host Server 구축

sudo amazon-linux-extras install epel -y


최초 AWS Linux 확장 Package를 설치해 줄게요.


yum update -y


그런 뒤 yum Repository 최신화를 진행해 줄게요.

sudo yum install -y docker


yum을 이용해서 Docker를 설치해 줄게요.




Docker Deamon을 기동 시켜 주었어요.


docker --version && docker version

 

sudo docker version




Docker가 정상 설치 되었어요.


만약 sudo 명령어를 입력하는게 귀찮다면 아래와 같이 처리해 주면 되요.



이렇게 docker Group에 ec2-user를 넣어주면 docker 명령어를 사용할 때, sudo를 제거하고 이용할 수 있어요.

단, 해당 shell을 종료했다가 다시 연결해줘야해요.
즉, 계정을 Logout 했다가 다시 Loging 해주어야 합니다.



위와 같이 sudo 명령어 없이 이용할 수 있어요.

docker network ls


위 명령어를 통해 Docker가 이용 가능한 Network 정보를 확인할 수 있어요.





docker run hello-world


위의 명령어를 통해 간단하게 Docker Container를 임시로 기동 시켜 볼 수 있어요.







        📦 Tomcat Server 구축

sudo amazon-linux-extras install epel -y


최초 AWS Linux 확장 Package를 설치해 줄게요.



yum update -y


그런 뒤 yum Repository 최신화를 진행해 줄게요.



wget https://mirror.navercorp.com/apache/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz


opt Directory 밑에 Tomcat 설치 File의 압축 File을 받아주었어요.


sudo tar -xvzf apache-tomcat-...


위의 명령어로 압축을 해제해 줄게요.



압축 File을 삭제해 주었어요.


sudo chmod +x ./bin/startup.sh && sudo chmod +x ./bin/shutdown.sh


위의 명령어로 각각의 Shell Script에 실행 권한을 추가해 주었어요.


sudo ./bin/startup.sh


위와 같이 Tomcat Service를 기동해 주었어요.




위와 같이 정상 접속이 되었어요!


몇 가지 설정 작업을 추가로 해 볼게요.


sudo vim ./webapps/manager/META-INF/context.xml (변경 전)

 

sudo vim ./webapps/manager/META-INF/context.xml (변경 후)


위와 같이 Value Tag를 주석 처리 했어요.




sudo vim ./webapps/host-manager/META-INF/context.xml (변경 전)



sudo vim ./webapps/host-manager/META-INF/context.xml (변경 후)


위와 동일한 부분을 주석처리 해 주었어요.


이렇게 설정해 주는 이유는 

위 그림에서 'Manager App' 부분에 모든 IP가 다 접근할 수 있도록 열어준 것이에요.



이번엔 Tomcat 관리자 계정들을 추가해 볼게요.



sudo vim ./conf/tomcat-users.xml (변경 전)

 

sudo vim ./conf/tomcat-users.xml (변경 후)

 

<role rolename="manager-gui" />
<role rolename="manager-script" />
<role rolename="manager-jmx" />
<role rolename="manager-status" />
<user username="admin" password="admin" roles="manager-gui, manager-script, manager-jmx, manager-status" />
<user username="deployer" password="deployer" roles="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui" />




위와 같이 Script 맨 밑에 부분을 수정해 주었어요.




그런 뒤 위와 같이 Tomcat Service를 재 기동 해 주었어요.




Tomcat에 웹 브라우저로 붙어서 'Manager App'에 들어가 줄게요.



Script에서 등록한 tomcat 계정을 입력해 줍니다.



정상 접속 되었어요!







        📦 Ansible Server 구축

sudo amazon-linux-extras install epel -y


최초 AWS Linux 확장 Package를 설치해 줄게요.



yum update -y


그런 뒤 yum Repository 최신화를 진행해 줄게요.



sudo yum install -y ansible


yum을 이용해서 ansible을 설치해 줄게요.


cd /etc/ansible


Ansible은 이 곳에 위치하고 있어요.


sudo vim /etc/ansible/hosts


위와 같이 Host 정보를 입력해 주었어요.

참고로 Public IP가 아닌 Private IP로 등록을 해 준 것이에요.




ssh-keygen -t rsa


Ansible Server에서 Docker Host Server 그리고, Tomcat Server에 SSH 접속이 가능하게 하기 위해
Ansible Server에서 SSH Key를 생성해주었는데, rsa 암호화 방식의 Key를 만들어 주었어요.



위와 같이 Key가 생성이 되었는데, 공개키(.pub)를 각각의 Server에 전달해 줄거에요.


cat id_rsa.pub


위의 공개키 값을 복사해 줍니다.



먼저 Docker Server에 등록해 볼게요.

vim ~/.ssh/authorized_keys (변경 전)


이미 하나 Key가 있네요.


vim ~/.ssh/authorized_keys (변경 후)


알파벳 o Key를 눌러 맨 밑으로 이동한 뒤 복사한 Key 값을 붙혀넣어 주었어요.


이러한 설정을 Tomcat Server에도 동일하게 적용할게요.


vim ~/.ssh/authorized_keys



ssh {계정명}@{대상 Server IP}


위와 같이 Docker Server에 SSH로 접속해보니 계정을 묻지 않고, 바로 접속하는 걸 볼 수 있어요.


ssh {계정명}@{대상 Server IP}


Tomcat Server도 정상 접속 되었어요.


이번에는 Ansible Server에서 등록된 Server들에게 Ping을 날려볼게요.

ansible {Ansble Hosts File에 등록된 Group 이름} -m ping


위와 같이 정상적으로 Ping이 갔어요.



Localhost 즉, Ansible 자기 자신은 SSH에 대한 설정을 해 주지 않아 위와 같이 Ping Test가 가지 않아요.

Tomcat, Docker Server에 해 주었듯이 SSH Key 값을 전달해 줘야해요.


vim ~/.ssh/authorized_keys


Ansible Server도 SSH Key를 등록해 주었어요.


ansible {Ansble Hosts File에 등록된 Group 이름} -m ping


자기 자신에게 제대로 Ping이 날아간걸 확인할 수 있어요.


ansible all -m ping











        📦 SonarQube Server 구축

AWS t2.micro 인스턴스로 SonarQube를 설치하게 되면 자원 부족으로 인해 기동이 되지 않습니다.
그래서 유료로 이용할 수 있는 최소 인스턴스 t2.small 이상을 이용해야 합니다.

주니하랑은 굳이 유료로 이용해 보고 싶지는 않고, Synology NAS Docker에 SonarQube가 올라가 있기 때문에 설치 방법에 대해서만 정리하고, 기동하진 않겠습니다.

 

sudo amazon-linux-extras install epel -y


최초 AWS Linux 확장 Package를 설치해 줄게요.



yum update -y


그런 뒤 yum Repository 최신화를 진행해 줄게요.

 

sudo mkdir /opt/sonarqube


최초 opt Directory 밑에 sonarqube Directory를 만들어 주었어요.
그리고 sonarqube Directory로 들어가 줍니다.



sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.6.zip


Sonarqube 7.6 Version을 내려받기 하였어요.


sudo unzip {압축 File 이름.zip}

zip으로 압축된 File은 unzip이라는 명령어를 통해 압축 해제할 수 있어요.



압축 File을 지워줬어요.


이제 몇가지 권한을 바꾸는 작업을 해 볼거에요.

그 이유는 SonarQube는 Elastic Search와 같은 Service와 연계 되어 사용되고 있는데,
root 권한이 아닐 경우 해당 Service를 이용할 수 없다고 Error가 나올 수 있기 때문이에요.


sudo chown -R ec2-user:ec2-user /opt/sonarqube


SonarQube Directory 소유권을 ec2-user에게 모두 이전하였어요.


cd sonarqube-7.6

 

cd /opt/sonarqube/sonarqube-7.6/conf


이번에는 SonarQube 설정을 확인 해 볼게요.


vim /opt/sonarqube/sonarqube-7.6/conf/sonar.properties


참고로 vi나, vim Editor에서 Line Number를 알기 위해선 :을 누르고, set nu를 입력하고, Enter를 눌러주면 됩니다.

113번째 줄에 보면 현재 SonarQube에 웹 브라우저를 이용해서 붙을 수 있는 Port 번호가 나오는데,
이 곳을 변경하면 해당 Port 번호로 붙을 수 있어요.


sudo ./sonar.sh start


위의 명령어로 SonarQube를 기동 시켜 주었어요.


AWS 인바운드에서 9000번 Port도 열어줘야 겠어요.




위와 같이 9000 Port도 Open 해 주었어요.


SonarQube에 설정 방법 등에 대해서는 이 곳에 정리를 해 두었어요.




    🔽  AWS EC2 배포하기

        📦 Tomcat Server


최초 Jenkins의 Jenkins 관리에서 '플러그인 관리'로 들어갈게요.


Maven Integration, Deploy to container plugin 설치






이번엔 Jenkins 관리에 'Global Tool Configuration'으로 들어갈게요.



이 곳에서 Maven 설정을 해 줄게요.

최초 Add Maven을 눌러주세요.



주니하랑은 Jenkins Server에 Maven을 설치해 주었기 때문에
'Install automatically'를 해제해 줄거에요.

MAVEN_HOME은 Maven Directory가 있는 곳을 설정해 주고,
이름은 위와 같이 설정해 주었어요.

저장하고, 해당 창을 나와주었어요.


이제 Item을 하나 만들어 볼게요.

Item 이름을 입력하고, 'Maven project'를 눌러준 뒤 'OK'를 눌러줍니다.


최초 Git Repository부터 등록해 줄게요.

Credentials는 현재 Repository가 Pubilc이라 따로 설정하진 않지만,

Private이라면 Git Hub Token을 등록해 주어야 해요.

이 내용에 대해선 이 곳에 정리해 두었어요.


만약 관리하는 Branch 이름이 master가 아니라면 수정해 주어야 해요.



그리고, Build 부분에서 위와 같이 설정해 줍니다.


빌드 후 조치 부분에서 '빌드 후 조치 추가'를 누른 뒤 'Deploy war/ear to...'을 선택해 주세요.

위와 같이 WAR File 정보를 입력해 주고, Tomcat Version을 선택해 주세요.


Tomcat Server와 연동을 위해 Credentials를 등록해 줄게요.
'Add'를 눌러주세요.



위와 같이 Tomcat Script에서 만든 deployer 계정을 등록해 주었어요.


 

나머지는 위와 같이 등록해 주었어요.
Tomcat URL은 Tomcat Server의 공인 IP를 입력해 주어야 해요.

저장을 하고, Build를 진행해 볼게요.



Build가 정상적으로 완료가 되면 위와 같이 workspace Directory에 Project Directory가 만들어져요.


이에 대한 자세한 내용은 이 곳에 정리해 두었어요.






        📦 Docker Server


최초 Jenkins 관리에서 '플러그인 관리'로 들어가 줄게요.

publish over ssh 플러그인 설치


위의 플러그인을 설치해 주세요.



이번엔 Jenkins 관리에 '시스템 설정'을 들어가 줍니다.


맨 밑에 SSH Server를 추가해 줄게요.



등록하기 전에 Jenkins에서 Docker Server로 ssh를 통해 접속하려 했지만, 권한이 없다고 나오고 있어요.

Ansible Server를 만들 때, Docker와 Tomcat Server에 SSH Key 값을 전달해 주었는데, 동일한 작업을 해줄게요.


ssh-keygen -t rsa


Jenkins Server에서 SSH Key를 만들었어요.


cat ~/.ssh/id_rsa.pub


위 공개키를 Tomcat과 Docker에 전달해 줄게요.


vim ~/.ssh/authorized_keys


Docker Server에 위와 같이 등록해 주었어요.



Docker Server에 SSH로 인증 없이 정상적으로 접속했어요.



Jenkins에서 SSH로 Docker와 연결하기 위한 설정을 위와 같이 해줬는데, 연결이 되지 않고 있어요.
이 문제의 이유는 지정한 Key를 통해서 SSH 접속 시도를 하지 않아서에요.

'고급' Button을 눌러줄게요.

위와 같이 'Use Password authentication ..'을 활성화 해줄게요.
그런 뒤 SSH Key 값을 등록해줘야 해요.


위 명령어를 통해 나오는 암호화 된 문자열을 등록해 줘야 해요.


해당 값을 Key 부분에 모두 복사해서 등록해 줍니다.

참고로 -----BEGIN RSA PRIVATE KEY----- 부터
-----END RSA PRIVATE KEY----- 까지의 모든 문자열을 다 복사해서 넣어줘야 해요.


다시 Test를 진행하니 정상 연결 되었어요.

저장하고, 해당 창을 나가줄게요.



위와 같이 Item을 만드는데, 위에서 만들었던 Item에 내용을 그대로 가져올게요.


Build 후 조치에 Tomcat 설정 내용을 지워줄게요.



그런 뒤 다시 '빌드 후 조치 추가'를 눌러준 뒤 'Send build ...'를 눌러줄게요.



위 설정에서 등록했던 Docker Server 이름을 찾아 Name에 선택해 주고, Build 대상 File을 선택해 주면 되요.

이에 대한 자세한 내용은 이 곳에 정리해 두었어요.



위와 같이 Build가 성공했어요.



Docker Server에서 ec2-user의 Home Directory를 확인해 보니 'hello-world.war'가 정상적으로 전달 되었어요.


vim ~/Dockerfile


위와 같이 Dockerfile을 만들어주세요.

docker build --tag={Docker Image Name(자유 기재)} -f Dockerfile .;
docker run -d -p 8080:8080 --name {Docker Container Name(자유 기재)} {Docker Image Name(자유 기재)}:{Image Version 정보}


다른 설정은 그대로 두고, 해당 Dockerfile로 Image를 만들고, Container를 만들 수 있는 명령어를 입력해 주세요.



Build가 성공했어요.





Docker Image와 Container가 정상적으로 만들어져 있어요.



Docker 공인 IP의 8080 Port에 URI를 넣어주니 위와 같이 정상 접속 되었어요.










        📦 Ansible Server


최초 Jenkins에 Ansible 등록을 위해 Jenkins 관리에서 '시스템 설정'에 들어가 줄게요.



SSH Server에 '추가'를 눌러줄게요.


그런 뒤 이름을 자유롭게 정의해 주고, Hostname에는 Ansible Server Private IP를 적어줍니다.


'고급'을 눌러줄게요.




Jenkins Server에서 위 명령어를 통해 나오는 암호화 된 문자열을 등록해 줘야 해요.




해당 값을 Key 부분에 모두 복사해서 등록해 줍니다.

참고로 -----BEGIN RSA PRIVATE KEY----- 부터
-----END RSA PRIVATE KEY----- 까지의 모든 문자열을 다 복사해서 넣어줘야 해요.

 

cat ~/.ssh/id_rsa.pub


위와 같이 Jenkins Server의 SSH Public Key을 복사하여 Ansible Server에 넣어줄게요.


vim ~/.ssh/authorized_keys


위와 같이 Key 값을 복사해서 저장해 주세요.






그런 뒤 Test를 눌러줘서 성공 여부를 확인해 주었어요.




위와 같이 Project를 만들어 줄게요.


 

기존에 Docker Project 내용에서 빌드 후 조치에 Docker Container를 만드는 명령어만 지워줬어요.

Image는 Docker Server에서 만들고, Docker Container는 Ansible Server에서 만들려고 하기 때문이에요.



'Add Server'를 눌러 Ansible에 대한 설정을 해줄게요.



다른 곳은 모두 그대로 두고, Exec command에 playbook을 사용하는 명령어를 넣어주었어요.


- hosts: all
#   become: true  

  tasks:
  - name: stop current running container
    command: docker stop junyharang-cicd-study-ansible
    ignore_errors: yes

  - name: remove stopped cotainer
    command: docker rm junyharang-cicd-study-ansible
    ignore_errors: yes

  - name: create a container using cicd-project-ansible image
    command: docker run -d --name junyharang_cicd_project -p 8080:8080 junyharang/junyharang-cicd-study-ansible

vim ~/create-cicd-devops-container.yml


Docker Server에서 만들어진 Image를 사용해서 작업을 할 것이기 때문에 위와 같이 Script 문을 작성해 주었어요.


vim /home/ec2-user/hosts


임의로 만든 hosts File에 Docker 정보를 위와 같이 넣어주었어요.


Jenkins의 Project를 저장하고, Build를 하면 됩니다.










🧐 참고 자료

 

 

 

 

 

 

 

 

 

728x90
반응형