본문 바로가기
Etc

[Toy Project 1 - 웹 서비스 만들기] 3. Jenkins를 이용한 자동 배포 환경 만들기

by chuckolet 2020. 6. 13.

Introduction

자 클라우드에 서비스를 올리고 실행시켰고 이제 본격적으로 개발을 해보려는데 코드가 수정될 때 마다 npm install을 다시 하고(script 실행 등), 빌드 하고, 서버에 올리고 다시 실행시키는게 여간 귀찮은 일이 아닙니다.. 물론 이런 방식으로 하면 무중단으로 서비스를 실행할 수도 없습니다. 이 문제를 해결하기 위해 jenkins를 이용해서 자동 배포를 해보겠습니다.

Contents

서버에 Jenkins 설치

젠킨스 공식 홈페이지에서 원하는 설치 버전을 골라서 설치해줍니다.

저는 작은 서비스이기 때문에 서비스가 돌고 있는 클라우드 서버에 설치해주겠습니다.

제가 사용하고 있는 서버의 OS는 Ubuntu 이기 때문에 아래 그림과 같이 Ubuntu LTS 버전으로 설치하겠습니다.

아래 내용을 터미널에 입력해주면 설치가 되고 설치가 완료되면 jenkins 서비스가 자동으로 실행됩니다.

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
    /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

 

아래 커맨드를 이용해서 jenkins 서비스를 실행시킬 수도 있고

sudo systemctl start jenkins

아래 커맨드로 jenkins의 상태를 확인 할 수 있습니다.

sudo systemctl start jenkins

 

그런데 저는 처음 설치가 완료된 이후에 jenkins 서비스 실행이 실패했습니다.

위의 start 커맨드로 다시 실행해봤지만 또 다시 실패

구글링을 해보니 JDK가 없어서 생기는 문제라는 글이 있어서 해당 글에 나와 있는대로 JDK를 설치하고 jenkins 설정 파일에서 path를 수정해주었습니다.

 

JDK 버전 8로 설치하는걸 추천드립니다. 저는 9로 하니 글에 나와있는 경로에 원하는 파일이 없더라구요.

sudo apt install openjdk-8-jre

jenkins 설정 파일 열기

sudo vi /etc/init.d/jenkins

 설치한 JDK 경로를 PATH에 추가

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/lib/jvm/java-8-openjdk-amd64/bin/

 

PATH를 수정한 사진

 

이제 다시 jenkins를 실행하니 daemon-reload를 하라고 해서 그렇게 하니 드디어 active가 된 모습을 확인 할 수 있습니다.

 

이제 브라우저에 jenkins가 설치된 서버의 ip주소에 8080 포트로 접속하면 jenkins가 실행된 것을 확인할 수 있습니다.

ip주소 or 도메인:8080

 

저는 chuckpark.kr 이라는 도메인을 따로 구매해서 서버 ip에 붙여두었기 때문에 도메인:8080으로 접근해보겠습니다. 

 

초기 관리자 암호는 아래 명령어를 입력해서 확인하실 수 있습니다.

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

 

암호를 입력해서 unlock 해주면 이제 plugins 설치 방식을 정해야되는데 일단 추천해주는 plugins로 먼저 설치하고 필요한건 차차 설치해봅시다.

 

install suggested plugins를 선택하니 아래 그림처럼 추천 플러그인들이 설치됩니다.

 

설치 완료된 모습

nvm-wrapper plugin 추가 설치

원하는 node 버전에 맞게 빌드 환경을 설정하기 위해 nvm-wrapper 플러그인을 설치해줍시다.

jenkins 메인에서 Manage Jenkins를 클릭해주세요.

 

밑으로 스크롤을 해주면 보이는 Manage Plugins을 클릭해주세요.

 

Available 탭을 선택하고 Filter에 nvm이라고 입력하고 설치할 플러그인을 찾아줍니다. 

 

저는 Install without restart를 선택하긴 했는데 Download now and install after restart와의 큰 차이는 잘 모르겠네요. 다만 Install without restart로 설치하신 뒤에는 젠킨스를 재시작 해줘야 새로 설치한 플러그인이 적용됩니다.

설치가 잘 된 것을 확인하실 수 있습니다.

젠킨스와 Github 연동

원래 github 플러그인을 설치해야 하지만 install suggested plugins를 선택했기 때문에 이미 설치가 되어있습니다. 왼쪽 상단의 탭에서 new item을 눌러서 새로운 jenkins job을 만들어봅시다.

 

job 이름을 적고 Freestyle project를 선택하고 하단의 OK를 눌러 주세요.

General에서 GitHub project를 체크하고 원하는 repository 주소를 적어주세요(브랜치 부분은 제외)

 

좀 더 내려보면 Source Code Management라는 필드가 있는데 우리는 git을 이용하여 코드를 관리할 것이므로 Git을 선택하고 소스 코드를 가져올 source code repository의 주소를 적어줍니다. 저는 제 토이 프로젝트 코드를 올려 놓은 repository 주소를 적어주었습니다.

해당 주소는 github에서 원하는 repository에 가셔서 초록색 clone or download 버튼을 누르시면 쉽게 확인 할 수 있습니다.

ex) github.com/ChungminPark/react-boilerplate-chuck.git

지속적으로 github에 업데이트 된 소스 코드를 jenkins로 가져오기 위해서 Credentials을 설정 해주어야 합니다.

위 그림에서 두번째 Credentials 쪽의 Add -> Jenkins를 누르면 아래 같은 그림이 나옵니다.

 

Kind에 여러가지 자격 증명 방법이 있는데 저는 혼자서 진행하는 토이 프로젝트이기 때문에 간단하게 Username, password 방식으로 진행하겠습니다. Github의 username과 password를 입력해주세요.

cf) 다른 사람들과 함께 jenkins를 사용할 때는 ssh를 이용한 방법을 사용하시면 좋습니다.
ssh를 이용한 방법에 대해서 더 알고 싶으신 분은 이 글을 참고해주세요.

 

Credential 설정이 완료되면 Credentials에서 방금 만든 설정을 선택해줍니다.

Branch Specifier에 위에서 만든 parameter를 넣어줍시다. 만든 parameter의 이름을 ${ }로 감싸서 적어주시면 됩니다. 그럼 앞으로 빌드를 실행할 때 branch parameter에 원하는 값을 넣으면 변수처럼 해당 값이 Branch Specifier에 들어가서 원하는 branch에서 소스 코드를 가져와서 빌드할 수 있게됩니다.

 

Trigger는 Github hook trigger을 체크해주시고

 

설정한 branch에 새로운 코드가 push 되면 실행될 build 스크립트를 작성해줍니다.

실행할 커맨드를 적어주고 Save 버튼을 눌러서 저장해줍니다.

 

젠킨스에서의 job과 github 연동 세팅은 끝났습니다. 이제 깃헙에서 Github hook을 등록해줍시다. 원하는 repository로 가서 Settings를 클릭

 

Webhooks에서 Payload URL은 젠킨스가 돌고 있는 주소에 github-webhook을 더해서 Github에게 이 주소가 webhook 주소라는 것을 알려주는 URL입니다. 여기에 Jenkins URL/github-webhook/ 이라고 입력(마지막에 / 꼭 입력) 하여, Add webhook 클릭 해줍니다. /github-webhook/은 젠킨스 깃헙 플러그인에 설정되어 있습니다.

 

젠킨스를 설치하고 아무 설정도 하지 않았다면 jenkins 주소가 localhost:8080으로 되어 있을 텐데, 외부에서 접근 할 수 있는 도메인이나 ip로 변경해주셔야 webhook이 접근 할 수 있습니다.

 

젠킨스 메인에서 Manage Jenkins -> Jenkins Location -> Jenkins URL

 

Jenkins URL도 외부에서 접근할 수 있게 수정했고, jenkin 주소 + /github-webhook/로 깃헙 프로젝트에서 webhook도 설정해주었다면 github에서 테스트 ping을 날려서 해당 주소로 접근이 가능한지 알려줍니다. 혹시 실패했다면 위의 내용을 다시 시도해보신 뒤 Webhook을 업데이트하고 Redeliver 버튼을 누르시면 다시 ping을 날려줍니다.

 

이제 코드를 설정한 git repository에 푸시하면 배포가 진행 됩니다!

 

실행된 job의 console output을 확인하면 github push에 의해서 시작됐다는 것을 확인 하실 수 있습니다.

 

References

https://j2doll.tistory.com/591

 

젠킨스 Jenkins 우분투 Ubuntu 18 설치 쉽게 하기

 

j2doll.tistory.com

https://www.jenkins.io/doc/book/installing/#linux

 

Installing Jenkins

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

https://kingbbode.tistory.com/35

 

젠킨스 사용하여 자동 배포환경 만들어보기

굉장히 주관적으로 환경을 구축했습니다. 튜토리얼성 글이라기보단 피드백을 받고자 글을 작성하게 되었습니다. 많은 피드백 부탁드립니다..! 젠킨스 사용하여 자동 배포환경 만들기! (Git으로 �

kingbbode.tistory.com

https://jojoldu.tistory.com/139

 

docker를 이용한 CI 구축 연습하기 (젠킨스, 슬랙)

안녕하세요? 이번 시간엔 도커로 CI 구축 연습하기 (젠킨스, slack) 예제를 진행해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 ��

jojoldu.tistory.com

https://kutar37.tistory.com/entry/Jenkins-Github-%EC%97%B0%EB%8F%99-%EC%9E%90%EB%8F%99%EB%B0%B0%ED%8F%AC-3

 

[Jenkins] Github 프로젝트 연동, webhook, 자동배포 (3)

설정이 완료되었으면 마지막으로, github 프로젝트를 jenkins에서 관리하고, push가 발생하면 빌드와 배포까지 진행하는 작업을 합니다. 환경 개발 Windows 10 / 배포 Ubuntu 16.04 LTS Maven 3.6.0 Git 2.20.1 J..

kutar37.tistory.com

https://dzone.com/articles/adding-a-github-webhook-in-your-jenkins-pipeline

 

Adding a GitHub Webhook in Your Jenkins Pipeline - DZone DevOps

In this development tutorial, learn how to add GitHub webhooks to Jenkins pipelines to trigger the build when a developer commits code to the master branch.

dzone.com

제 글이 도움이 되셨다면 간단하게 '공감', '댓글' 부탁드립니다!

 

댓글