동기
실무에서 jenkins + github actions를 통해 ci/cd가 이루어지는데, 굉장히 편리하다고 생각했다.
관리자가 따로 있어서 나는 사용하는 입장이므로 사이드프로젝트에 직접 적용하여 경험해보고 싶었다.
적용 방법
jenkins 설치
- 먼저 gcp 인스턴스에 jenkins를 설치해주었다.
- jenkins를 설치하면 jenkins 계정이 생기고 이 계정에 의해 jenkins가 데몬 프로세스로 동작한다.
- http://서버ip:젠킨스포트번호/ 로 접속하면 젠킨스 web을 확인할 수 있다.
jenkins web 에서는 작업을 생성하고 관리할 수 있다.
github 연동
나는 github에 push -> jenkins 에 의한 빌드 및 배포 를 원하기 때문에 jenkins - github을 연동해야 한다.
job 의 configurtiaon 에 github project url 을 넣어준다.
이걸 체크해줘야 github 에서 webhook 이벤트를 받아서 자동으로 jenkins 빌드를 트리거한다.
저장소 정보, 브랜치, 인증 정보 등을 넣는다. 그리고 빌드 스크립트는 프로젝트에 Jenkinsfile을 만들어주면 된다.
인증 정보는 jenkins가 git에서 소스를 clone 해올 때 필요하다.
jenkins 관리 > credentials 에 등록한다.
github 저장소 settings > webhook에 http://vm인스턴스ip:젠킨스포트번호/github-webhook 으로 등록해줘야 push 했을 때 웹훅이 젠킨스로 도달한다.
Jenkinsfile 작성
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
sh '''
cp /home/jidamine87593/siso/backend/src/main/resources/application-private.properties src/main/resources/
cp /home/jidamine87593/siso/backend/src/main/resources/ssl/sisso-api.p12 src/main/resources/ssl/
echo ">>> [Build] Running as user: $(whoami)"
chmod +x ./gradlew
./gradlew clean build -x test
'''
}
}
stage('Copy Built Jar') {
steps {
sh '''
echo ">>> [Copy] Copying built JAR to /home/jidamine87593/siso/backend/build/libs"
cp build/libs/siso-0.0.1-SNAPSHOT.jar /home/jidamine87593/app/jar/
'''
}
}
stage('Deploy') {
steps {
sh '''
echo ">>> [Deploy] Running as user: $(whoami)"
cd /home/jidamine87593/app/shell
sh stop_jenkins.sh
sh start_jenkins.sh
'''
}
}
}
}
빌드 스크립트 JenkinsFile을 프로젝트 최상단 디렉터리에 만들어주면 된다.
jenkins 계정에 의해 실행되므로 권한 설정 등에 유의해야 한다.
- Checkout
- checkout scm 명령어에 의해 vcs (나의 경우 github) 에서 소스 코드를 복사해서 vm 으로 가져온다.
- Build
- 보안상 github에 올리지 않은 private-properties, 인증서 파일은 미리 vm에 올려놓고, jenkins가 소스파일을 받아온 경로의 정적 리소스 경로 /var/lib/jenkins/jobs/siso_deploy/workspace/src/main/resources 에 복사 후 빌드한다.
- Copy Built Jar
- 젠킨스가 빌드한 결과물 build/libs/siso-0.0.1-SNAPSHOT.jar를 복사해서 배포할 경로로 이동한다
- Deploy
- 만들어놓은 쉘 파일로 배포 중지 후 배포한다.
후기
이제 성공적으로 빌드, 배포되는 것을 확인하니 기분이 좋다.
적용하면서 특히 애먹었던 부분은 jenkins 계정이 권한 문제로 로그 경로를 생성 못했던 것, 그리고 443 포트 권한이 없었던 것 등이 있다.
적용하고 나니 실무에서 적용되는 것을 습득한 것 같아 뿌듯하고 편리하다.
다음번엔 github actions 도 사용해 보고 싶다.