STUDY

Jenkins 실습 (Mac OS)

seonyounggg 2021. 1. 13. 11:21

먼저, AWS EC2 인스턴스를 생성한다.

편의를 위해 이 서버에 젠킨스와 웹사이트를 둘 다 올릴 예정이다.

 

별다른 설정없이 그대로 생성하고,

발급받은 키페어를 ~/.ssh/ 로 옮겨준다. 

(No such Directory라고 나온다면 ssy-keygen을 통해서 한번 ssh 키를 발급받으면 해당 경로에 폴더가 생긴다)

 

 .ssh/config 파일에 아래와 같이 작성해준다.

인스턴스 보안 그룹 - 인바운드 규칙 편집에 들어가서

8080, 80 포트를 열어준다.

 

참고> 맥 터미널에서 ec2 접속하기

 

[OS X] 맥 기본 터미널로 AWS EC2 터미널 접속하는 방법

맥 환경에서의 첫 포스팅입니다. (드디어 맥북을 장만했습니다.) 덕분에 앞으로 OS X 에 관련한 포스팅도 하게 될 듯합니다. OS X에서 EC2를 접속하기 위한 준비물은 이렇습니다. 터미널 프로그램 (

blog.freezner.com

터미널에 접속해서

yum update -y

# Jenkins 패키지 추가
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat/jenkins.repo &&
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key

# Install java, docker, git
sudo yum install -y java-1.8.0-openjdk jenkins git docker # 자바 버전 8 로 설정
alternatives --config java

service jenkins start

설치 & 젠킨스 실행 명령어를 작성치면 

해당 서버 8080포트에서 젠킨스가 돌아가게 된다.

 

접근을 해보면 아래와 같이 Jenkins 화면이 나온다.

화면의 경로에 있는 password 파일 내용을 복붙해서 넣고 Continue를 누른다.

sudo cat <경로>

처음에 추천해주는 것을 설치해주는 것이 좋으므로 Install Suggested Plugins를 골랐다.

계정을 생성해주면 젠킨스를 사용하기 위한 준비가 끝난다.

(이 때 입력한 계정명과 암호가 Jenkins에 로그인하기 위한 id/pw가 된다.)

 

이제 Jenkins상에서 Credential 설정을 해줘야 한다.

Jenkins관리 - Manage Credential - Jenkins 선택 - Global Credential - Add Credential

 

1. Git Access Token 등록

CI/CD를 적용할 프로젝트의 Git repository를 만들고

GitHub 프로필 설정에서 Developer Settings - Personal Access Token - Generate New 해서 토큰을 만든다.

(권한은 repo만 줘도 됨)

Username : Github 이름

Password : 방금 발급받은 token

ID : 젠킨스에서 이 키를 사용하기 위한 이름을 정해줌

 

2. AWS key 등록

IAM콘솔에 들어가서 젠킨스가 인스턴스에 접근할 수 있도록 사용자를 추가한다.

일반적으로는 Jenkins가 접근 가능한 것에 대해서만 권한을 줘서 서비스를 보호하지만

실습에서는 편의를 위해 admin권한을 주었다.

해당 사용자의액세스 키 ID와 비밀 액세스 키를 발급받아서 Jenkins에 각각 등록해준다.

(이름은 편의를 위해 예제 Jenkins file에 지정된 그대로 awsAccessKeyId, awsSecretAccessKey를 넣었다. 다른 이름을 사용하려면 Jenkins file에도 동일하게 변경해주면 된다.)

 

AWS에서 정적웹페이지를 올릴 S3를 만든다.

일반적으로는 퍼블릭 액세스를 차단하지만,

실습에서는 Jenkins가 cli를 통해 S3에 파일을 업로드 할 수 있도록 '모든 퍼블릭 액세스 차단'을 해제해준다.

 

추가적으로 뒤에 언급할 Doker를 Jenkins에서 사용하기 위해

Jenkins Plugin관리에서 Doker, Doker plugin 을 설치해준다.


또한 EC2 인스턴스에서도 Doker를 사용할 수 있도록 설정해준다.

sudo usermod -aG docker $USER
sudo usermod -aG docker jenkins
sudo service docker start

 

젠킨스와 연결할 git repo를 생성하여 로컬에 clone하고

해당 경로에 예제 프로젝트를 복사한다.

(예제 출처 : tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=190)

 

website폴더에는 실제 web상에 띄울 웹페이지가 들어있고

web을 올릴 서버관련 파일이 server폴더에 들어있다.

 

server/index.ts를 살펴보면 

현재 80번 포트에 웹 서버가 running중임을 알 수 있다.

 

Pipeline을 생성할 때 사용할 Jenkins script 구조를 살펴보면 다음과 같다.

먼저 triggers에서는 반복 주기를 설정한다.

environment 에서는 환경변수를 설정한다. 이 부분에 아까 등록한 AWS credential들을 넣는다.

stages에서는 각 단계들이 정의되어 있다.

Prepare단계에서는 git repo에서 배포할 프로젝트의 코드를 다운받는다. 이 때 git credential이 필요하다.

그 후, 프론트엔드를 배포한다. 이 과정은 실제로는 더 복잡하지만 예제에서는 단순히 S3에 html파일을 업로드한다.

그리고 백엔드 Lint, Test, Build 과정이 이루어진다.

예제에서 백엔드는 Node.js로 구성되어 있기 때문에, Docker에서 실행되어야 한다.

agent로 docker를 선택하고 도커 이미지를 넣어주어서 npm 명령을 실행하는 모습이다.

 

Jenkins - new Item에서 Pipeline을 생성해준다.

아까 확인한 Jenkinsfile에 작성된 내용을 이 부분에 붙여넣기 한다.

이 부분 또한 git에서 clone해오도록 설정할 수 있다.

 

그리고 프로젝트 repo주소를 넣고

스크립트의 triggers부분을 설정해주었기 때문에 위 항목을 체크해줘야 한다.

 

Pipelline을 저장하고

빌드를 시작하기 위해 프로젝트를 commit & push 해준다.

빌드를 시작하면 위와 같이 stage 순서대로 진행되고 있는 모습을 확인할 수 있다.

 

파이프라인을 실행하고 나서

1. s3에 index.html 올라와있는지

2. 80번 포트로 접속했을 때 response 잘 오는지

를 확인해봐야한다.

 

오류가 난다면 해당 빌드의 콘솔을 확인하여서 오류원인을 확인할 수 있다.


인턴업무를 위해 CI/CD공부와 Jenkins강의를 들었는데,

업무를 조금이나마 하다가 강의를 들으니까 좀 더 이해가 잘 갔다.

Docker랑 AWS에 익숙하지 않아서 실습은 조금 어려웠지만 충분히 CI/CD 파이프라인이 무엇인지 알 수 있었다.

사실 내가 경험해본 프로젝트라 해봤자 아주 소규모의 서비스이고, 배포도 많아야 한 두번 하기 때문에

빌드 자동화의 필요성? 목적? 이 크게 와닿지 않았는데

현업에서 실제로 이루어지고 있는 과정들을 보니까 어느정도 이해가 되었다.