[Infra] Jenkins를 통한 CI/CD 구축

이열음·2022년 8월 9일
0

우아한 테크코스 프로젝트에서 CI/CD 구축을 담당하게 되어 해당 과정을 정리합니다.

현재 프로젝트 플로우

자바 설치

sudo apt update
sudo apt upgrade
sudo apt install openjdk-11-jdk

젠킨스 설치

wget -q -O - https://pkg.jenkins.io/debian/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 update
sudo apt install jenkins

젠킨스 실행 및 확인

sudo service jenkins restart
sudo service jenkins status

**http://{인스턴스 public ip}:8080 접속**

젠킨스 설정

  • 대시보드에서 “새 아이템 추가하기” 로 들어갑니다.
    - 이름을 작성하고 FreeStyle project 를 선택합니다.
    스크린샷 2022-07-17 오후 6 06 56

깃허브 관련 설정

스크린샷 2022-07-17 오후 5 32 30 스크린샷 2022-07-17 오후 5 32 37
  • 깃허브 접근 권한을 위해 Credentials 설정합니다.
    • +Add 버튼 누르면 다음과 같은 창이 나옵니다.
스크린샷 2022-07-17 오후 5 49 19
  • Username에는 깃허브 이름을 넣어줍니다.
  • Password에는 AccessToken을 넣어줍니다.
  • AccessToken은 해당 레포 관리자중 한명이 발급하면 됩니다. 발급방법은 다음과 같습니다.
    1. Admin계정중 한명 계정의 settings로 접근
    2. Developer settings > Personal access token > generate new Token
    3. 접근범위 repo로 지정 후 완료
    4. 발급된 AccessToken 복사
  • Pull받을 브랜치를 설정합니다. 저희는 dev서버에 push 명령이 들어왔을떄 젠킨스를 돌게할 것이기 때문에 다음과 같이 설정해주었습니다.
    스크린샷 2022-07-17 오후 5 33 56

빌드 설정

  • Task에 clean build를 써서 Gradle로 돌때 디렉토리 전체삭제 후 빌드하게끔 설정합니다.
    스크린샷 2022-07-17 오후 5 34 31
  • 특정 디렉토리를 지정하고싶을땐 Advanced에 다음과 같이 작성합니다.
    스크린샷 2022-07-17 오후 5 35 57
  • 빌드 후에 쉘을 실행시켜서 명령어를 수행합니다.
    • 해당 서버는 CI 서버이므로 빌드까지만 수행한 뒤 SSH를 통해 빌드 파일을 어플리케이션 서버에 전송하고,
      어플리케이션 내의 deploy.sh를 실행하는 것 까지만 담당합니다.

관련 트러블 슈팅

  1. Warning: Identity file key-ternoko.pem not accessible: Permission denied.

    원인: ssh 에 접속할때 필요한 팸키 권한이 닫혀있어서 발생하는 에러입니다.

    해결 : 젠킨스 서버 내에서 chmod 400 ./[pem키이름].pem 명령어로 권한을 열어줍니다.

  1. SSH로 들어간 원격서버(예제 내에선 어플리케이션 서버)에서 쉘에 적어둔 명령어 실행 안됨.

    원인: 별도의 처리없이 명령어를 그대로 실행하면 원격 서버가 아닌 젠킨스 서버 내에서 해당 명령어가 수행됩니다.

    해결 : ssh -i {pem key} ubuntu@{서버IP} 를 앞에 붙인 뒤에 명령어를 작성합니다.

  1. 원격 서버내에서 실행시킨 SpringApplication 이 돌아가는 로그가 젠킨스 콘솔에 표시됨.

    원인: ./deploy.sh를 실행시킬때 백그라운드 설정을 해주지 않았기 때문입니다.

    해결 : ./deploy.sh 뒤에 &을 붙여주자..^^

빌드

  • 대시보드 > 내가 등록한 아이템 > 왼쪽 사이드바 내에 지금 빌드를 누르면 빌드가 시작됩니다.(이외에도 dev브랜치에 push 이벤트가 발생해도 빌드됩니다.)
    스크린샷 2022-07-17 오후 5 57 00
  • 이렇게 지금 진행중인 빌드 히스토리도 보여줍니다.
  • 해당 숫자를 누른 뒤 Console Output을 누르면 다음과 같이 현재 실행상태를 확인할 수 있습니다.
스크린샷 2022-07-17 오후 5 58 24 스크린샷 2022-07-19 오후 4 29 45

… 아래내용 이하생략

관련 트러블 슈팅

  1. jenkins pending—waiting for next available executor
스크린샷 2022-07-17 오후 6 02 21

(사진이 없는데.. 빌드 돌리면 에러 메세지가 딱 이렇게 나옵니다ㅎ)

원인: 빌드 갯수가 너무 많아서 Jenkins 관리 폴더 메모리가 부족하기 때문입니다.

해결 : jenkins 서버 접속 → /jobs/ternoko/builds 내의 빌드 폴더들을 삭제합니다. + build 설정에서 오래된 빌드 삭제로 젠킨스 서버에서 들고 있을 빌드 갯수 제한을 둔다. 아이템 > 구성 > general 옵션으로 오래된 빌드 삭제를 누른 뒤 기간과 갯수를 지정해주면 됩니다.

스크린샷 2022-07-17 오후 6 03 54

0개의 댓글