어서와, 개발은 처음이지?

배포 프로세스 구성하기3 - jenkins로 배포 자동화 본문

EC2_Ubuntu_Devops

배포 프로세스 구성하기3 - jenkins로 배포 자동화

오지고지리고알파고포켓몬고 2020. 7. 3. 00:47
반응형


jenkins는 CI 도구로, 지난 글에 이어서 이번에는 github과 jenkins를 연동하여 push 완료 후 배포 작업이 실행되도록 구성하겠습니다.


1. Jenkins 설치 


우선 공식 다운로드 페이지에 접속하여 원하는 버전을 선택하고 설치방법을 따릅니다.


저는 ubuntu를 사용하고 있으므로 아래 명령어를 사용하겠습니다.

$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
$ deb https://pkg.jenkins.io/debian-stable binary/
$ sudo apt-get update
$ sudo apt-get install jenkins



2. 포트 설정


젠킨스는 8080번 포트를 기본으로 사용합니다. 하지만 일반적으로 8080번 포트는 암묵적으로 웹 서비스 포트로 간주하기 때문에 포트를 변경해주도록 합니다.


ununtu(debian)은 아래 경로에서 설정파일을 찾을 수 있고, 설정파일 중간의 HTTP_PORT를 원하는 포트로 바꿔줍니다.

$ sudo vi /etc/default/jenkins 


centos는 아래 경로에서 설정 파일을 찾을 수 있습니다. 설정파일 중간의 JENKINS_PORT를 원하는 번호로 바꿔줍니다. 

$ sudo vi /etc/sysconfig/jenkins 


그리고 EC2 환경이라면 인바운드 설정으로 해당 포트를 열어주시고, 일반 리눅스 서버 환경이라면 firewall-cmd 등을 사용하여 포트를 열어줍니다.



3, 젠킨스 실행


아래 명령어를 실행하여 젠킨스를 실행합니다.

$ sudo /etc/init.d/jenkins


젠킨스가 실행되면 브라우저에서 설정한 포트로 접속합니다.


아래 이미지를 볼 수 있으면 서비스 구동이 성공한 것입니다.



위 메세지는 젠킨스 실행을 위해 초기 비밀번호를 입력하라는 내용인데, 문구에 붉은색으로 표시된 경로에 위치한 파일을 열어서 비밀번호를 입력해줍니다.



다음으로 위와같은  화면을 볼 수 있는데, install suggested plugins를 선택하여 권장옵션으로 설치합니다.


만약 플러그인을 직접 선택하여 설치할 경우, github과의 연동을 위하여 github plugin은 필수로 설치해줍니다.


다음으로 계정 정보를 생성하는 화면이 나오는데 정보를 입력하여 잘 기억하고있도록 합니다.



4. 인증 key 생성


지금까지 jenkins 기본적인 설치 및 설정 과정을 봤습니다. 이제부터 github과 연동을 시작할건데, github 계정정보를 직접 사용하는 대신 인증 key를 생성하여 레포지토리와 jenkins를 연동하도록 하겠습니다.


아래 명령어를 실행하여 jenkins 계정으로 쉘을 실행합니다.

$ sudo -u jenkins /bin/bash


다음으로 인증 정보들을 관리할 경로를 생성합니다.

$ mkdir /var/lib/jenkins/.ssh


다음으로 인증 정보를 생성합니다.

$ cd /var/lib/jenkins/.ssh
$ ssh-keygen -t rsa -f /var/lib/jenkins/.ssh/인증키이름


'인증키이름'에는 원하는 이름을 설정하면 되는데, 제 경우에는 github repository 이름을 사용했습니다.


비밀번호(passphrase)는 입력하지않고 엔터를 쳐줘서 넘어갑니다.

5. private key 등록


이제 이 정보를 jenkins에 등록해줄건데, 아래 명령어를 실행하여 방금 생성한 private key를 확인하고 복사합니다.

$ cat /var/lib/jenkins/.ssh/인증키이름

다음으로 jenkins 메뉴에서 jenkins -> credentials -> system -> global credentials로 이동합니다.




다음으로 위에서 복사한 private key를 입력해줍니다.





6. public key 등록


다음은 public key를 github repository에 등록합니다.


아래 명령어를 실행하여 public key를 복사합니다.

$ cat /var/lib/jenkins/.ssh/인증키이름.pub

다음은 github repository 설정의 deploy keys에서 위 정보를 입력합니다.




7. github webhook 설정


다음으로 webhook에 jenkins 주소를 설정하여 git에서 이벤트가 발생할때마다 jenkins가 이를 처리할 수 있도록 합니다.


settings의 webhooks에 jenkins주소/github-webhook/ 을 입력해줍니다. 이는 github plugin이 설치되어있을 때 유효합니다.



슬랙 알림을 연동할 때 수정하겠지만, 우선 Just the push event를 사용하여 푸시 이벤트가 발생했을 때만 webhook을 사용하도록 합니다.



8. job 생성


이제 jenkins와 github 간 인증정보 설정작업은 끝났습니다.

다음으로 job을 생성하여 실질적으로 repository에 push가 발생했을때, jenkins가 배포 작업을 실행하도록 하겠습니다.


일단 jenkins로 돌아와서 새로운 item(job)을 생성합니다.



다음으로 job 이름과, 프로젝트 속성을 선택합니다.


요즘은 pipeline도 많이 사용된다고 하는데, 이 글에서는 Freestyle project를 선택하여 shell script로만 진행할 수 있도록 하겠습니다.



이제 다음으로 넘어가서 소스코드 관리 정보를 입력합니다.



Repository URL은 github에서 SSH url을 복사하여 입력해줍니다.


SSH url은 github repository에서 쉽게 확인할 수 있습니다.



Credentials는 5번 항목에서 등록한 key를 사용하면 됩니다.


Branch Specifier에는 원하는 브랜치 네이밍 조건을 설정해줍니다. 기본 값으로 master 브랜치에 발생한 push만을 처리하게 됩니다.


다음으로 빌드 유발 항목에서 GitHub hook trigger for GITScm polling을 체크합니다.



이제 마지막으로 build step에 Execute Shell을 추가해줍니다.



그리고 Execute shell에 원하는 명령어를 설정해줍니다.



9. git push 실행


이제 repository에서 push를 발생시켜봅니다.



push가 실행되면 곧바로 jenkins job에 반응이 오는모습을 볼 수 있습니다.



빌드가 정상적으로 완료되면 파란불이 들어오고, 실패하면 빨간불이 들어오며, build 번호를 클릭하면 history 정보를 확인할 수 있습니다.


실제 실행 명령어와 결과는 Console Output 메뉴에서 볼 수 있습니다.



10. one more thing


jenkins에서 다른 계정, 혹은 슈퍼유저 권한으로 execute script를 실행해야할 필요가 있을 수 있습니다.

이를 위해 jenkins 계정에 sudo 권한을 부여하도록 합니다.

$ sudo vi /etc/sudoers


여기에 아래 내용을 추가해줍니다.

.. 생략
jenkins ALL=(ALL) NOPASSWD: ALL 


이제 jenkins의 execute script에서 sudo pm2 start app.js 혹은 sudo -S another_user_name -c "npm run dev" 처럼 다른 권한으로 명령어를 실행할 수 있습니다.



11. 마치며


이번 글에서는 jenkins를 사용하여 git push 이후 배포 관련 script가 실행될 수 있도록 하는 방법을 알아봤습니다.


위에서는 기본적인 내용만 다뤘지만 이를 이용하여 형상관리 전략에 따른 브랜치별 프로세스 적용 및 다양한 스크립트를 작성하여 응용할 수 있겠습니다.


다음 글에서는 github webhook과 jenkins를 이용하여 slack에서 특정 상황에 따른 메세지를 받을 수 있는 방법에 대해 알아보도록 하겠습니다.



12. 참조


https://jojoldu.tistory.com/442



Comments