본문 바로가기
문제 해결, 기술 비교/개인프로젝트(북클럽)

Github webhook & Jenkins 연동하기

코동이 2022. 2. 5.

 

 

이전에는 github에 push하면, 직접 Jenkins에서 다시 build를 해서 배포를 해야했습니다. 하지만, 이번에는 github webhook 기능을 이용해서 Jenkins가 자동으로 build하도록 구성합니다. webhook을 통해, 다른 서버로 api를 호출하여 jenkins에 build 명령을 하도록 합니다.(docker는 여기서 제외하였습니다.)

 

1. github 저장소 fork하기

2. instance에 java 설치하기

3. jenkins에 github webhook 설정 추가

3. github에서 webhook 설정

 

https://github.com/lleellee0/cpu-bound-application

 

GitHub - lleellee0/cpu-bound-application

Contribute to lleellee0/cpu-bound-application development by creating an account on GitHub.

github.com

 

위 저장소의 주소로 들어가서 Fork를 하여 내 repository로 가져옵니다.

 

 

이제 내 repository에 복사가되고 forked from으로 원래의 저장소가 나타납니다.

 

 

2. jenkins, instance들에 java 설치하기

 

sudo yum install -y java

//프로젝트 java버전을 맞춰준다 아래는 java 11
sudo yum install java-11-openjdk-devel.x86_64

//자바 깔린 버전들 확인하기
rpm -qa | grep java

//자바 특정 버전 삭제하기
yum remove java-1.7.0-openjdk-1.7.0.79-2.5.5.4.el6.x86_64

//자바 기본 버전 확인하기
java --version

 

3. jenkins에 github webhook 설정 추가

 

jenkins의 [설정]에서 [소스 코드 관리]에 들어와서 Git을 선택하고 바로 위의 sunggyupaik/cpu-bound-application URL 주소를 추가합니다.

 

 

 

[빌드 유발] 에서 Github hook trigger for GITScm polling을 선택합니다.

 

 

[Build]에서 Execute shell을 선택합니다.

 

 

이제, 도커를 이용하지 않고, 직접 github 프로젝트를 maven으로 빌드하고 실행시키도록 변경합니다. maven의 라이프사이클은 다음과 같습니다. 여기서 필요한 것은 clean과 package입니다. clean을 통해서 빌드 정보 삭제를, package를 통해 자바 어플리케이션 실행 가능한 jar 파일을 생성합니다.

 

 

package를 통해 다음과 같이 target파일에 의존성들과 jar파일이 생성됩니다.

 

 

 

Command에 빌드도구로 maven을 이용하기 때문에 clean package를 합니다. 

 

 

chmod 544 ./gradlew
./gradlew clean bootJar

 

 

Build Now를 하면, 오류가 발생합니다. jar를 생성하도록 github를 연동했지만, docker 명령어를 실행했기 때문입니다.

현재 [빌드 후 조치]에서 SSH Server의 Exec command는 docker를 이용해 다음과 같습니다.

 

 

maven으로 jar파일을 생성하도록 했기 때문에, docker 명령어에서 jar 실행명령어로 바꿔야합니다.

이에따라 SSH Server의 Transfers 설정을 변경합니다.

 

 

Source file은 실패한 Build Now에서 경로를 확인합니다. jar 파일 위치를 확인합니다.

 

target/cpu-0.0.1-SNAPSHOT.jar를 입력합니다. 

 

Remove prefix에는 제거할 prefix인 target을 입력합니다.

 

Exec command에는 jar 실행명령어와 로그를 위한 명령어를 추가합니다

 

nohup sudo java -jar 0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &

 

결과는 다음과 같습니다. 3개의 instance 모두 동일한 설정을 합니다.

 

 

Build Now로 다시 배포할 때, 서비스가 올라가 있기 때문에, 자바를 종료하고 다시 실행해야 합니다. 다음명령어를 통해 자바의 실행을 확인하고 sudo kill -9 <프로세스 id>로 프로세스를 삭제합니다. 아래의 결과만 남습니다.

 

 

 

 

github repository에 와서 [Settings]의 왼쪽에 [Webhooks]을 클릭하고 [Add webhook]에 들어갑니다.

 

 

 

Payload URL에 Jenkins의 외부 IP주소를 입력하고 URL을 완성합니다

 

 

 

이제 Webhook을 다시 확인해보면, 다음과 같이 생성정보가 나옵니다.

 

 

 

nohup.out 파일을 확인해보니 현재 8080(9059) port는 사용중이라는 문구가 나옵니다.

 

 

 

그래서 8080포트 사용을 모두 종료시키고 다시 실행시켜야 합니다. lsof를 3개의 인스턴스에 모두 설치합니다.

 

sudo yum install -y lsof

 

Jenkins에 가서, losf를 이용해서 8080포트를 종료시키고 jar를 실행시키도록 명령어를 추가합니다

 

sudo kill -15 $(sudo lsof -t -i:8080)

 

Jenkins의 Exec command 맨 앞에 추가합니다

 

 

이제부터 해당 repository로 push가 되면, 자동으로 jenkins가 Build Now를 합니다.

 

하지만, 지금은 모두 한번에 서버를 down하고 start하기 때문에 중간에 배포시간동안 서비스가 종료됩니다. 따라서, 간단하게 sleep 30으로 각 instance들이 무중단배포를 할 수 있도록 구성합니다.

 

instance-2, instance-3을 다음과 같이 변경합니다.

 

 

하지만, sleep만으로는 무중단 배포가 충분히 보장되지는 않기 때문에, 좋은 스크립트를 더 고안해봐야합니다

 

저장소를 사용하기 위해 postgresql을 설치합니다.

 

sudo yum install -y docker
sudo systemctl start docker
sudo chmod 666 /var/run/docker.sock

//postgresql
docker run --name pqsql -d -p 5432:5432 -e POSTGRES_USER=postgresql -e POSTGRES_PASSWORD=post.grespassword postgres

//mysql
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:latest

docker exec -it mysql-container bash

mysql -u root -p

 

create user '계정명'@'%' identified by 'password';

grant all privileges on *.* to '계정명'@'%';

flush privileges;
반응형