본문 바로가기
카테고리 없음

[Jenkins] Github Webhook + Jenkins 연동 및 빌드

by 진꿈청 2024. 8. 2.

Jenkins

 

이전 글

이전 포스팅에서는 JenkinsMaster + Slave 노드를 구성해서 여러 JobSlave로 위임하는 작업을 했었다.

JobMaster에서 전부 처리하지 않고 나눔으로 여러 이점을 얻을 수 있을 것이다.

 

이번 포스팅에서는 Github WebhookJenkins를 연동하여 코드 변경 시 빌드가 진행되도록 해볼 것이다.

 

 

AWS에 Jenkins 서버 구동

AWS 사이트에 접속해서 EC2에 접속하도록 하자.

 

그 후, 인스턴스 시작을 하면 아래 화면이 나오게 될 것이다.

(나는 아래와 같이 설정했다.)

 

 

OSAmazon Linux를 선택했다.

이름은 언제든지 변경가능하기 때문에 어떻게 하건 상관없다.

 

 

인스턴스 유형은 프리티어에서 사용가능한 t2.micro를 선택했다.

키 페어 관련해서 만약에 본인이 사전에 갖고 있던 키 페어가 있다면 그걸 사용하고 아니면 새로 생성하면 될 것 같다.

 

 

네트워크 설정과 관련해서는 방화벽 부분을 설정해주면 되는데

마찬가지로, 자신이 이미 사용하던 보안 그룹이 있다면 기존 보안 그룹을 선택하고

그것이 아니라면 새롭게 생성해주어도 된다.

 

같은 보안 그룹에 속해있는 인스턴스들은 프라이빗 IPv4 주소로 접근이 가능하다.

 

설정을 다 마쳤다면 인스턴스 시작을 해주자.

 


인스턴스 접속(참고 -> AWS를 처음 사용해본 분들을 위한)

 

인스턴스 접속은 아까 생성한 키 페어를 이용하여 접속하면 된다.

하지만, 그냥 접속하면 권한 오류가 발생할 수 있다.

이는 키에 권한이 없어 생기는 오류로 아래 명령어를 사용해주도록 하자.

 

chmod 400 {키}.pem
# chmod 400 aws-key.pem

 

필자의 경우는 Termius라는 툴을 알게되어 이걸 사용했다.

 


생성한 인스턴스에 Jenkins 서버 구성

 

시작하기에 앞서 기본 저장소에 없는 많이 패키지들을 설치해주기 위해 아래 명령어를 입력하자.

sudo amazon-linux-extras install epel -y

 

 

 

JDK 설치

 

기본적으로 JenkinsJDK가 있어야 모든 기능을 완벽하게 사용할 수 있다.

그렇기에 우선, JDK를 설치해주자.

 

JDK 설치

  • sudo dnf update
  • sudo dnf install java-17-amazon-coretto-devel
  • java -version

 

Maven 설치

 

그 후, 우리는 빌드 작업을 위한 Maven 또는 Gradle을 설치해주어야 한다.

우리는 Maven을 설치하도록 하자.

 

Maven 설치

 

.bash_profile 수정

 

Maven을 설치했다고 끝이 아니라 Maven을 인식할 수 있도록 PATH 환경변수를 수정해주어야 한다.

따라서, 아래 명령어를 사용하자.

 

vi ~/.bash_profile

 

 

.bash_profile 안에 이렇게 작성한 뒤 저장한다.

 

 

Maven도 잘 설치가 되었다.

(https://maven.apache.org/download.cgi) <- Maven 버전을 확인하고 싶다면 접속

 

 

자, 기본적인 것은 모두 설치했고 이제 드디어 Jenkins를 설치해보자.

 

 

Jenkins 설치

 

Jenkins 설치  https://pkg.jenkins.io/redhat-stable/

 

Jenkins 워크스페이스 경로

  • /var/lib/jenkins

 

 

 

여기까지 Jenkins를 설치했다. 정상적으로 8080 포트로 서버가 실행된 것을 확인할 수 있다.

하지만, 실제로 AWS EC2에 띄워진 Jenkins 서버에 접속하려면 몇 가지 설정이 더 필요하다.

 

 

Jenkins 접속

 

 

우선, 고정 IP를 설정해주어야 한다.

설정 방법은 왼쪽 메뉴에서 탄력적 IP를 설정한 뒤 오른쪽 위의 탄력적 IP 주소 할당을 눌러 그냥 생성하면 된다.

 

 

그 후, 다시 오른쪽 위의 작업을 누른 뒤 탄력적 IP 주소 연결을 클릭해주자

 

위의 사진처럼 Jenkins 서버가 올라가있는 인스턴스를 선택한 뒤 연결을 누르면 된다.

 

이렇게하면 우리의 인스턴스고정 IP가 설정되었다. 

즉, 해당 IP를 통한 접속이 가능하다.

 

하지만, 우리는 아직 8080 포트에 접근할 권한이 없다.(권한이 없다기보다 방화벽이 설정되어있다.)

 

 

 

따라서, 인스턴스로 돌아가 아래 사진처럼 보안그룹인바운드 규칙8080 포트와 관련된 규칙을 생성해주자.

 

 

보안 그룹 주소 클릭

 

 

인바운드 규칙 편집

 

 

8080 포트로 규칙 생성 및 저장

 

 

자, 이렇게 하면 이제 Jenkins에 접속할 수 있을 것이다.

 

접속 경로는 http://{탄력적 IP}:8080 이다.

 

하지만, 필자가 그러했듯 굉장히 느릴 수 있다.

 


 

느린 이유

 

Jenkins 서버가 실행될 때 탄력적 IP 설정이 되어있지 않으면, AWS에서 동적으로 만들어준 IPJenkins 서버가 실행된다.

따라서, 프록시가 이상하게 설정이 되어 굉장히 느린 것이다.

 

따라서, 내가 해결한 방법은 어쩔 수 없이 딜레이를 참고 아래 경로로 가서 서버 주소를 탄력적 IP 주소로 변경하는 것이다.

 

Manage Jenkins -> System -> Jenkins Location

 

http://{탄력적 IP}:8080/

 

이렇게 설정해주는 순간 빠르게 동작한다.

 

 

진짜 이제 드디어 Jenkins 서버 설정이 끝났다.

이제는 Github Webhook과 Jenkins를 연동해보자.

 


Github Webhook + Jenkins 연동

GihubJenkins 서버가 통신하기 위해서는 GithubJenkins 서버의 Key를 등록해주어야 한다.

 

아래 명령어를 사용해서 비대칭키를 생성해주자.

 

ssh-keygen

 

그 후 ~/.ssh 경로에 접속하면 공개키와 개인키가 생성이 되어있을 것이다.(id_rsa(개인키), id_rsa.pub(공개키))

 

여기서 공개키를 cat 명령어를 통해 확인한 뒤 복사해주자.

cat id_rsa.pub

 

 

그 후, Github에 들어가서 Settings를 클릭해준 뒤 왼쪽 목록에서 Deploy keys를 선택해주자.

 

Deploy keys

 

 

위의 사진처럼 Title을 작성한 뒤 복사한 공개키를 안에 넣어준다.

 

 

다시, Jenkins로 돌아와서 Jenkins에도 Credentials를 생성해주어야 한다. 

 

 

Credentials 생성을 위해 접속

여기서 Stores from parent에서 global을 클릭해주자.

 

 

Credentials 생성

 

그 후, 위의 사진처럼 Kind에서 SSH Username with private key를 선택해주자.

그 다음 Username은 임의로 지정해주고 ssh-keygen으로 생성한 개인키를 cat 명령어로 확인한 뒤 전체(꼭) 다 복사해서 넣어주자.

 

 

플러그인 설치

 

Github Integration Plugin을 설치해주자.

 

 

이렇게 하면 연동을 위한 준비도 다 끝났다.


 

프로젝트 생성 및 구성

 

프로젝트는 이전 포스팅에서 만들었던 것처럼 만들면 된다.

 

Git Credentials 설정

 

 

Hook Trigger 설정

 

위 설정은 다음과 같은 의미이다.

 

깃허브로부터 어떠한 작업이 들어왔을 때 해당하는 Trigger 작업을 하겠다는 의미이다.

Trigger는 방아쇠라는 뜻이 있기 때문에 어떠한 동작을 유발할 수 있는 기능들을 Trigger라고 한다.

 

즉, Github에서 변화된 소스코드를 감지한 다음, 등록 되어진 Webhook의 주소를 통해 정보를 보내주면 그 정보를 인지하고 빌드한다.

 

 

Webhooks 설정

 

여기서 중요한 부분은 Payload URL 부분인데

http://{탄력적 IP 주소}:8080/github-webhook/ 을 정확하게 입력해주어야 한다.("/github-wehbook/" 를 정확히)

 

 

자, 이제는 Webhook이 설정되어있는 Repository의 아무 소스코드를 변경했을 때 빌드 작업이 일어나야 한다.

 

 

소스코드 변경 및 Webhook 정상 동작 확인

 

소스코드를 변경했을 때 다음과 같이 동작하면 정상적으로 Webhook이 등록된 것이다!!

 

 

 

 

시간이 좀 지나긴 했지만, 정상적으로 프로젝트가 빌드가 되었다!!

 

 


 

정리

이번 포스팅에서는 JenkinsGithub Webhook을 연동해보았다.

이 방법을 통해 우리는 소스코드 변경시 자동적으로 웹훅이 작용하여 CI/CD 작업이 일어나도록 설정하였다.

 

Poll SCM을 활용하여 매분 확인하는 방법도 있고 위 방법도 사용이 가능하다.

또한, SonarQube와 연동했을 때 Webhook을 통해서도 SonarQube 결과를 받아볼 수 있다고 한다. 

 

 

여기까지 이도원 강사님의 Jenkins 강의를 보고 공부해본 것의 끝이다.

쿠버네티스와 Jenkins를 연동하는 것도 있었지만, 쿠버네티스는 좀 더 깊이 공부할 것이기에

굳이 포스팅하지 않았다.

 

나중에 Jenkins와 관련해서 좀 더 학습하게 된다면 이 Jenkins 카테고리에 더 작성할 것 같다.