AWS RHEL9 jenkins CI/CD 구축

배찌 (배찌)·2023년 2월 23일
0

설치 기록

목록 보기
8/12

AWS 컴퓨팅 서비스를 사용한 jenkins build

이 글에서는 리눅스를 하나도 몰라도 가능할 정도로 상세히 적었다.

AWS EC2 service(Elastic Compute Cloud)

가상 서버 인스턴스를 제공하는 서비스로, 프리티어로 사용이 가능하다.
1개 인스턴스 기준 750시간이 가능하고, 2개 인스턴스 사용시 325시간이 가능하다. 하지만 제대로 알아보지않고 부가서비스를 신청한다면 요금 폭탄 나올수 있으니 프리티어인지 제대로 확인해야한다.
특히나 플랫폼으로 제공하는 경우는 더더욱 프리티어가 부족하고, OS도 CLI만 가능하니 이 점 유의 바란다.

OS

여러가지 OS가 있고, 개발자분들이 많이 사용하는 Ubuntu도 있지만 서버에서 많이 사용하는 RHEL을 사용한다.

Key pair

CLI로만 가능하다는 이유 중 가장 큰것이 바로 SSH로 인스턴스에 접속해야하기 때문이다. 그리고 SSH로 들어가기 위한 key역시 발급해야한다. key발급은 간단하니 이미지처럼 따라하면 된다.

일반적으로는 .pem을 사용하지만 나는 putty로 접속하기 때문에 .ppk로 받았다.
Create key pair를 누르면 자동으로 다운이 받아질것이다.

보안 그룹

클라우드로 하니 클라우드 방화벽이 인스턴스를 보호하는 형태이다. 그렇기때문에 외부에서 접속해야할 포트를 열어줘야한다.
Docker를 사용해본 사람은 어떤의미인지 쉽게 와닿을것 같다.

일반적인 서비스를 돌릴 예정이라면 http와 https를 모두 열어주는것이 맞고, 만약 jenkins만 한다면 jenkins 열어줄 포트만 열어주면된다.

스토리지

프리티어가 사용가능한 최대 용량은 30GB이므로 용량이 많아진다면 추가 요금을 받게 될것이라는점 참고바란다.

SSH 접속

인스턴스를 시작하기를 눌렀다면 다음과 같이 실행이 될것이다.

대기 중이라고하면 걱정하지 말고 기달리면된다. 체감상 2~3분정도 뒤에 올라오는 형태이다.
이제 putty로 접속하는 방법을 알려줄 차례이다.

  1. key file 넣기

    putty 프로그램을 실행하고, connction-Auth-Credentials를 열고 Private key file란에 넣으면된다.

  2. 설정값 저장하기
    이제 session란에 돌아와서 인스턴스 ip를 넣는다.

    그리고 일일이 이렇게 파일 넣고 IP치고 접속하는 것은 상당히 귀찮은 일이다.
    아래의 Saved Sessions에 임의의 이름을 적고 우측의 Save를 누르면 지금 설정값이 저장이 된다.

다음에 접속할때 이름을 누르고 Load를 누르면 설정값들이 불러와줘서 편하게 사용할수 있다.

  1. 접속 아이디

서버 설정을 해본적이 없거나 내부에서 간단하게 테스트를 하던 사람이라면 아무런 정보를 없이 접속하라고하면 root로 접속을 할려고 할것이다.
해보면 다음과 같은 결과가 나올것이다.

이 창에서는 root말고 ec2-user로 접속하라고 알려준다.
그 이유는 root는 대다수 알고 있는 linux계열 관리자 계정임으로 ssh에서 root로그인 못하게 하는것이 정상이다.

그리고 접속해서 root 패스워드를 설정할려고도 하지말자, 그 이유는 공인 IP가 있기때문에 만약 해킹을 당한다면 자신의 통장이 텅장이 되는 마법에 걸리기 때문이다.

Jenkins install

항상 나는 OS를 설치하면 하는것이 있다.

sudo yum -y upate

이유는 보안 문제도 있고, 업데이트가 되어 있지않아서 오류가 나타나는 경우도 있기 때문이다.

jenkins는 openjdk를 사용하기 때문에 다운로드를 해준다.
그전에 항상 내가 원하는 버전이 있는지 체크가 필요하다.

sudo yum list openjdk


다행히 내가 원하는 java 11버전이 있다.
java 8버전을 안쓰는 이유는 8버전을 썻다가 jenkins가 실행이 안되던 적이 있다. 그렇다고 jenkins가 옛날 버전을 다운로드하게 해주냐? 하면 그건 또 아니더라....

sudo yum -y install java-11-openjdk wget git

jenkins repo 설치는 공식 홈페이지에서 그대로 참고하면된다.

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

간단하게 설명하자면 repo파일을 받고, repo의 key를 받는것이다. key를 받지않으면 실행은 할수없게 lock이 걸려있는 상태가 되어있다.

그리고 openjdk를 사용전에 제대로 버전이 깔려있는지 체크가 필요하다.

alternatives --config java


전에 java11을 설치했는데 적용은 java8이 적용되어 오류를 엄청나게 뱉어냈던 기억이 있다....

sudo yum -y install jenkins

이제 보안을 위해 port를 바꿀 차례이다.

sudo vi /etc/sysconfing/jenkins

이 파일에서는 jenkins가 어떻게 실행하는지 적혀있다. 이곳에서 JENKINS_PORT를 찾아서 8080을 다르게 바꿔주면 된다.

가끔 port가 바뀌지 않는 경우가 생기는데 이때는 Environment="JENKINS_PORT=8080"을 수정해주면 된다.

서비스 시작

sudo systemctl start jenkins

Port

이제 서비스가 시작했으니 그에 맞는 port를 열어주면된다.

만약 자신이 수정한 port로 열리지 않는다면 putty로 돌아가서 다음 명령어를 검색해봐라

netstat -nlp

이렇게 했을때 자신이 수정한 포트가 열리지않고 8080포트가 열려있다면 위에서 말한 추가 수정사항을 수정하고 재시작하면 될것이다.

재시작 명령어는 다음과 같다.

sudo systemctl restart jenkins

jenkins 계정 생성

jenkins는 첫 시작에 jenkins가 랜덤으로 만든 passwd를 웹에서 입력하라고 한다.

사이트에서 말하는 경로에 가면 패스워드가 있다.

패스워드를 복사 붙여넣기하면 정상적으로 넘어가진다.

Install을 누르면 정상적으로 설치가 되고 나서 admin user를 생성하는 창이 나온다.

이건 그냥 보이는대로 따라가면된다.

로그인이 완료 됬다면 다음과 같은 창이 나온다.

Jenkins Github CI 구축

plugins install

CI/CD를 구축하기전에 설치해야할 플러그인이 있다.
jenkins 관리 - manage plugins - 사용가능한 플러그인을 누르면 검색할수 있는창이 나온다.

이 플러그인을 설치하면 github webhook을 받을수 있는 준비가 된것이다.

github 설정

우선 들어가기전 레포지터리를 한개 만들어준다.
가장 편하게할려면 퍼블릭이 좋지만 안정성을 위해서 프라이빗으로 하는것을 추천한다.
나의 경우 Slunk를 하던중에 설치를 한것이여서 Slunk_jenkins라고 이름을 지어주었다.

이제 레포지터리에 들어가서 settings를 눌러서 webhook에 들어가서 다음과같이 입력한다.

http://18.183.229.119:8080/github-webhook/


이렇게 한다음 프로필 클릭 - 셋팅 - Developer settings를 들어간다.

여기에서 token을 만들어 줄것이다.

이미지와 같이 repo,adminrepo_hook 두개를 체크해주고 만들어 낸다. 그러면 token이 만들어지는데 카피해서 잘 보관해 둬야한다. 다시 재발급은 되지 않는다.

jenkins 연결

새 아이템을 누르고 이름을 적고 Freestyle project를 눌러준다

그런다음 이미지와 같이 적어준다.

여기에서는 자신의 레포지터리 url를 넣어주면된다.
다음 소스관리에서 git을 선택하고 다음과 같이 넣어준다.

원래의 구조는 https://<레포지터리 url.git일것이다.
여기에 token을 같이 넣어서

https://<token>@<레포지터리 url.git>

이렇게 수정해준다.
그리고 Branch쪽이 중요한데 저기가 분명 */master로 되어 있을것이다.

저거를 설명하는 글이 하나도 없어서 힘들었다....
git을 브런치가 main으로 바뀐지가 오래됬다.. -_-;;

main으로 수정하고 아랫단에서 hook을 체크해준다.

생성을 누르면 이제 정상적으로 github가 잡힌것을 볼수가 있다. 그리고 테스트를 위해 지금 빌드를 눌러본다

정상적이라면 다음과 같은 결과가 나온다.

이제 github에서 push를 넣어보자.
파일을 새로만들고 저장해보자

그러면 다음과 같은 결과를 나타낸다.

이렇게 되면 CI/CD 파이프라인 구조를 완성한것이다.

CD구축 테스트중 테스트완료

정공법은 openjdk와 maven을 사용하여 자동 재배포를 하는것이 맞으나, jenkins에서 openjdk와 maven이 정상적으로 저장되지 않는 버그로 인해 SSH를 이용한 Secure Copy를 사용합니다.

Samba를 사용하면 쉽지만 그렇게 되면 보안 이슈에 대한 문제가 많아지기 때문에 추천하진 않습니다.

ssl 인증

jenkins가 ssl키 생성후 tomcat서버 키를 복제
jenkins는 로그인 할수 없기때문에 /bin/bash로 강제 접속

sudo su jenkins -s /bin/bash
cd /var/lib/jenkins/.ssh
ssh-keygen
ssh-copy-id root@192.168.0.230

.ssh 디렉토리가 없을 경우 다음 명령어를 진행한다.

mkdir /var/lib/jenkins/.ssh
chmod 700 /var/bin/jenkins/.ssh
chown jenkins:jenkins /var/lib/jenkins/.ssh

설정한후 정상적으로 되는지 테스트 진행

github와 연동되는지 테스트하기 위한 빌드 조치내용 추가

scp -r /var/lib/jenkins/workspace/clunk_github/web/ root@192.168.0.230:/tomcat/webapps/web/


github에서 푸시한 결과

정상적으로 배포가 완료 되었지만 기존 파일이 덮어 써지긴 하지만, github에서 삭제할 경우 jenkins에서는 삭제가 진행되지만 tomcat서버에서는 삭제가 되지않아 ssh명령어로 삭제를 명령, 그리고 재시작 명령어 추가

sh 'ssh root@192.168.0.210 "/tomcat/bin/shutdown.sh"'
sh 'ssh root@192.168.0.210 "rm -rf /tomcat/webapps/web/*"'
sh 'scp -r /var/lib/jenkins/workspace/clunk_github/web/* root@192.168.0.230:/tomcat/webapps/web/'
sh 'ssh root@192.168.0.210 "/tomcat/bin/startup.sh"'

이상으로 전달이 정상적으로 전달 된 모습을 볼수있다.

profile
Never give up Impossible is nothing

0개의 댓글