일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터베이스
- 42seoul
- javascript
- 인공지능
- JPA
- Dining philosopher problem
- 네트워크
- CI
- Spring
- sql
- 스프링
- 스프링부트 웹 소켓
- libasm
- 스프링부트
- swift
- 리눅스
- springboot
- AI
- IOS
- 오라클
- 프로그래밍언어론
- DBMS
- 밥먹는 철학자
- CD
- 다이어리
- 소켓
- MySQL
- 아이패드다이어리
- jenkins
- Xcode
- Today
- Total
Hi yoahn 개발블로그
프로젝트에 젠킨스를 이용한 CI & 자동 배포 적용기 본문
프로젝트를 진행하는 과정에서 배포를 내가 담당했는데, 서버에서 매번 git을 통해 jar 파일을 다운받아서 작성해둔 쉘 스크립트를 실행시키는 방식으로 했었다.
그런데 어쩌다가 나 말고 같이 진행하던 다른 사람이 배포를 시도하게 된 일이 있었는데, jar 파일 만드는 것부터 bitbucket이라 git url 접근 권한도 다르고 여러 문제가 발생하면서 멘토님이 내가 없어도 배포가 가능할 수 있게 Jenkins를 적용해보라고 인스턴스를 띄워주셔서 젠킨스를 통해 CI를 적용해 보게 되었다!
젠킨스는 요약하면
특정 브랜치에 올라온 커밋을 인식해서 젠킨스에서 풀 받아오고, 풀 받아온 코드를 가지고 빌드해서 쉘 스크립트를 실행하는 것
쉘 스크립트에 따라 배포 방식이 결정되는것 같다.
먼저 젠킨스를 사용하려면 젠킨스가 서버에 띄워져 있어야 한다. 프로젝트가 띄워지는 인스턴스와 같은 인스턴스에 올리는 방법도 있지만 인스턴스가 무거워질 수 있으니 분리하는게 좋은 것 같다.
우리 프로젝트에서 적용한 방법은, 젠킨스 인스턴스를 따로 띄워서 젠킨스에서 코드를 받아와서 원격 ssh를 통해 서버 인스턴스에서 빌드 후 배포 파일을 실행시켰다.
CI 과정
1. Jenkins 플러그인 설치
spring boot 에서 gradle을 사용했기 때문에 Gradle 플러그인과, Post build task Plugin을 설치한다.
Jenkins 관리 > 플러그인 관리
설치 가능 탭을 클릭 후 검색 탭에서 필요한 플러그인을 설치한다.
젠킨스와 다른 ec2 인스턴스에 배포하는 경우 Publish over ssh 플러그인을 설치한다.
2. 젠킨스 아이템 생성 -> 빌드 설정
새로운 Item > Freestyle project 선택
- 소스 코드 관리
- Credentials > Add > Jenkins
repository Git의 Username(ID)과 Password만 입력하면 된다.
Branches to build
> 빌드할 브랜치 이름을 적어둔다
해당 브랜치에 커밋이 올라오는 것을 인식해서 젠킨스에서 자동으로 빌드하게 된다.
- 빌드 유발
Repository settings > Webhooks
> Add webhook
URL 부분에
- https://{jenkins 서버 주소}:8080/bitbucket-webhook/
을 넣고 원하는 이름으로 설정한 뒤 Save 버튼 클릭
- Build
Tasks 에는 gradle로 실행할 작업을 적어준다.
bootjar만 하면 버전별로 jar 파일이 계속 남을 것 같아서 clean 후 bootjar 했다.
(깃에 올리지 않는 보안 파일들 때문에 사용할 수 없어서 안해도 되는것 같기도 하고..)
- 빌드 후 조치
젠킨스와 같은 인스턴스에서 빌드하는 경우 여기 스크립트 부분에서 실행할 스크립트 내용을 적으면 된다.
- Publish over ssh
- 사전 설정: Send build artifacts over SSH
SSH 설정을 위해 Jenkins 관리 > 시스템 설정 에 들어가서 스크롤을 쭉 내리다 보면
Publish over SSH 부분이 나오는데, 아래 Key 부분 칸에
jenkins 인스턴스에서 생성한(존재하는) .ssh/id_rsa 키 값의 내용을 붙여넣으면 된다.
젠킨스에서 서버 ec2 인스턴스로 접속하기 위한 방법은 아래 링크 참고
2021.08.12 - [42 SEOUL/배운 것들 정리] - ssh 인스턴스 접속
아래에 있는 ssh 서버 설정에서
- Name: 임의의 이름, jenkins item 설정시 사용됨
- Hostname: 빌드할 서버의 ip 주소
- Username: 서버에 접속할 user name
을 입력한다.
Post build task 끝에 있는 빌드 후 조치 추가 버튼을 눌러 Send build artifacts over ssh 를 선택하면 아래와 같은 칸이 생긴다.
Name: 위에서 설정한 SSH 서버 name을 선택한다.
Source files: 파일을 서버에 업로드 한다. **/* 로 하면 git으로 받은 파일 전체가 ssh 서버로 전송된다.
Remote directory: file을 전송할 디렉토리 위치
Exec command: ssh 서버에서 실행할 명령
deploy.sh 파일에서 기존 돌아가던 프로세스는 죽이고 새로운 jar 파일을 빌드하여 java 로 실행시킨다.
nohup으로 하는 경우 출력 스트림이 끊기지 않아 서버는 실행되지만 timeout되어 jenkins에서 빌드에 실패했다고 하게 된다.
'프로젝트 개발 일지' 카테고리의 다른 글
[42GG] 3기 개발일지 2 (0) | 2023.05.13 |
---|---|
[42GG] 3기 개발일지 1 (0) | 2023.04.21 |
SpringBoot OAuth + JWT (0) | 2022.05.31 |
[spring boot] json web token 에러 (0) | 2022.05.31 |
[42Seoul] #1 구인구직 서비스 개발기 (0) | 2021.02.22 |