Network

Jenkins(젠킨스), GitLab ↔ Jenkins ↔ EC2 연동하여 CI/CD 구축

kyunge_ev 2023. 2. 5. 12:56

🔍 Jenkins(젠킨스)

소프트웨어 개발 시 지속적으로 통합 서비스를 제공하는 툴 = CI (Continuous Integration)

젠킨스는 서브버전, Git 과 같은 버전 관리시스템과 연동하여 소스의 커밋을 감지하면 자동적으로 자동화 테스트가 포함된 빌드가 작동되도록 설정할 수 있다.

✅ 설치조건

최소 하드웨어 요구 사항

  • 256MB RAM
  • 1GB 드라이브 공간(Jenkins를 Docker로 실행하는 경우 최소 10GB 권장)

📌 GitLab 설정

1. Access Tokens 발급

프로젝트 → Settings → Access Tokens → 화면에 나온대로 입력, 체크 → Create project access token

( access token은 한번만 볼수있기 때문에 미리 저장해두기 )

📌 Jenkins 설정

2. 젠킨스 컨테이너 띄우기( 젠킨스 port 9000 사용)

docker run -d --name jenkins -p 9000:8080 jenkins/jenkins:jdk17

 

3. 젠킨스 URL 로 들어가서 설정하기

 

4. 젠킨스 초기 password 확인 후 입력

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

 

5. 설치 화면에서 Install suggested plugins 눌러 설치

 

 

6. 젠킨스 계정 생성 ( id/pw 찾기 없기 때문에 잘 저장 해놓기 )

 

📌 Jenkins ↔ GitLab 연동

7. GitLab 플러그인 설치

Jenkins 관리 → 플러그인 관리 → Available plugins → 🔍 gitlab → gitlab 체크하고 → Install without restart

 

 

8. GitLab Credentials 추가

Jenkins 관리 -> Manage Credentials -> Stores scoped to Jenkins -> Add credentials

 

Kind : GitLab API token

Scope : Global

API token : [발급 받은 gitlab token]

 

9. 8에서 추가한 Credentials 설정

Jenkins 관리 → 시스템 설정 → Gitlab

 

Connection name : [원하는 connection name]

Gitlab host URL: [깃랩이 설치된 주소]

Credentials: [앞서 생성한 GitLab API token]

 

10. 새로운 Item 생성

새로운 Item → Enter an item name → 원하는 프로젝트 이름 →  Freestyle project →  OK

 

 

11. Webhook 설정(젠킨스)

소스 코드 관리 → Git 체크 → Repository URL : [GitLab 프로젝트 HTTP URL 입력] → Branch Speciter : */main 으로 수정( 기본 */master 임 ) → +Add 클릭

 

Kind: Username with password

Scope: Global

Username: [깃랩 아이디]

Password: [깃랩 비밀번호]

 

12. Webhook 설정 시 필요한 URL 설정

item → 구성 → 빌드 유발 → Build When a change is pushed to GitLab. GitLab webhook URL: [URL] 체크(GitLab에서 사용) → 고급 → Secret token →  Generate 클릭 → 토큰 생성

 

 

13. Webhook 설정(GitLab)

GitLab 프로젝트 → Settings → Webhooks → 아래와 같이 URL, Generate token, 체크 → Add webhook

 

 

14. webhook Test

Test → Push events

 

 

아래와 같이 젠킨스 item 내용이 바뀌면 연동 성공

 

📌 Gradle 설정(Gradle 7.6)

 

15. Gradle 추가

Jenkins 관리 → Global Tool Configuration → Gradle → Add Gradle

 

name : gradle 7.6 [원하는 name]

Version : gradle 7.6 [스프링 프로젝트 버전에 맞는 gradle 버전]

 

16. Gradle 설정

구성 → Build Steps → invoke Gradle script

 

📌 젠킨스 ↔ EC2 연동

17. SSH 플러그인 설치

EC2 서버 환경에 접속할 수 있는 플러그인 설치( 7번에서 GitLab 플러그인 설치 후 Credentals 설정과 동일 )

 

Kind : SSH Username with private key

Scope : Global

ID : [원하는 ID]

Username : [원하는 name]

Private Key : Enter directly
	Key -> EC2 접속 시 사용하는 .pem 파일에 있는 PRIVATE KEY 복붙

 

18. 추가한 Credentials 설정

Jenkins 관리 - 시스템 설정 - SSH Remote hosts

Hostname: [EC2 public ip]

Port: 22

Credentials: [앞서 생성한 SSH credential]

 

여기서 EC2 Ubuntu 사용하는 경우 버전 호환 이슈인지 22.04 서버는 젠킨스에서 연결할 수가 없음

EC2 생성 시 Ubuntu Server 20.04 LTS 로 생성한 이유

 

19. Build step 추가 - Build 된 .jar 파일 Ubuntu 배포 서버로 전송

 

 

젠킨스 도커 컨테이너로 접속하는 명령어 (호스트 ▶ 도커 컨테이너)

docker exec -it [컨테이너이름] /bin/bash
docker exec -it jenkins /bin/bash

젠킨스로 빌드하여 생성한 .jar 파일을 Ubuntu 배포 서버로 파일 전송하기

젠킨스 도커 컨테이너도 가상 환경 서버 ▶ Ubuntu 서버로 .jar 파일을 옮겨줘야 Ubuntu 배포 서버에서 프로젝트를 돌릴 수 있다.

scp -v -o StrictHostKeyChecking=no -i [.pem 파일 경로] [젠킨스 도커 컨테이너 내에 .jar파일이 생성되는 경로] [ubuntu 원격 접속 주소]:[.jar 파일 전송할 ubuntu 경로]
scp -v -o StrictHostKeyChecking=no -i /t****.pem /var/jenkins_home/workspace/da***n**ng/backend/build/libs/d***y-da***n**ng-0.0.1-SNAPSHOT.jar ubuntu@ec2-*-**-**-***.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/da***n**ng

 

20. Build step 추가 - Ubuntu에 만들어둔 deploy.sh 파일 실행

 

SSH site : 앞에서 추가한 SSH

Command : [작성한 deploy.sh 가 있는 경로]

 

각 단계별로 에러 발생된 부분은 따로 포스팅함.