해당 포스팅에서는 AWS EC2 서버를 기준으로 하고 , 만약 AWS EC2 서버가 구축되어 있지 않다면 해당 포스팅 을 먼저 참고해주세요.
또한 CI / CD 및 Jenkins 에 대한 기본 지식을 요구하므로 해당 포스팅 을 통해 학습할 수 있습니다.
Jenkins를 설치하기 전에 Jenkins 에서는 JDK 8
이상의 자바를 필요로 합니다. 자바 설치는 해당 링크 를 통해 설치할 수 있습니다.
젠킨스 Keys 설치
sudo wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list'
key 등록
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FCEF32E745F2C3D5
apt-get 업데이트
sudo apt-get update
젠킨스 설치
sudo apt-get install jenkins
해당 그림과 같은 오류가 발생하면 다음의 명령어를 입력합니다.
sudo vi /etc/apt/sources.list
i
를 눌러 입력 모드를 전환 후 밑의 내용을 하단에 적어줍니다.
deb https://pkg.jenkins.io/debian-stable binary/
다음 명령어를 입력해줍니다.
sudo apt-get update
sudo apt-get install jenkins
그럼에도 오류가 지속된다면 Jenkins 공식 홈페이지에 나와있는 Debian jenkins Packages 설치 절차를 활용해봅니다.
젠킨스 실행
sudo systemctl daemon-reload
sudo systemctl start jenkins
sudo systemctl status jenkins
참고된 블로그 : https://abbo.tistory.com/184
https://hyunmin1906.tistory.com/272
Jenkins 초기 비밀번호 확인
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Jenkins 사이트로 이동 후 11번에서 확인한 비밀번호 입력
젠킨스 플로그인 설치
젠킨스의 기본 포트번호는 8080
이지만 SpringBoot 포트와 겹칠 수 있어 포트를 바꿔야 하는 일이 있을 수 있습니다.
Jenkins Version 2.335 이전
sudo vi /etc/default/jenkins
Jenkins Version 2.335 이후
sudo vi /lib/systemd/system/jenkins.service
해당 명령어를 통해 해당 파일의 HTTP_PORT 를 수정하고 재시작을 해줍니다.
만약 HTTP_PORT가 없다면 Environment="JENKINS_PORT= 8080" 을 변경해 줍니다.
만약 HTTP_PORT를 수정했음에도 포트가 변경되지 않는다면 jenkins.service를 수정해서 해결할 수 있습니다.
sudo chmod 777 /usr/lib/systemd/system/jenkins.service
sudo vi /usr/lib/systemd/system/jenkins.service
sudo chmod 444 /usr/lib/systemd/system/jenkins.service
vim을 통해 파일로 들어가 Environment="JENKINS_PORT=8080"
부분을 포트로 바꿔주시면 됩니다. 포트 변경 뒤에는 권한을 readOnly로 변경합니다.
데몬 프로세스 & 젠킨스 재시작
sudo systemctl daemon-reload
sudo service jenkins restart
웹훅은 깃허브 레포지토리에 변화가 발생한다면 깃허브에서 젠킨스로 이벤트가 생겼다고 알람을 보내야 합니다. 알려줄 때 사용하는 그 경로를 설정하는 작업을 깃허브 레포지토리에서 해주어여 합니다. 하단의 참고 블로그의 2. Github Repository Webhook 설정의 절차를 따릅니다.
참고 블로그 : 블로그
pipeline {
agent any
stages {
stage('git Clone') {
steps {
git branch: '브랜치 명', url: '깃 허브 주소'
echo 'Clone Success'
}
}
stage('Build & Test') {
steps {
sh '''
chmod +x gradlew
./gradlew clean test bootJar
'''
echo 'Build and Test Success!'
}
post {
success {
echo 'success deploying laika spring project'
}
failure {
error 'fail deploying laika spring project' // exit pipeline
}
}
}
stage('Deploy') {
steps {
dir('build/libs'){
sh '''
CURRENT_PID=$(ps -ef | grep java | grep comma | grep -v nohup | awk '{print $2}')
if [ -z ${CURRENT_PID} ] ; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> 실행중인 어플리케이션 : $CURRENT_PID"
sudo kill -9 $CURRENT_PID
sleep 10
fi
echo "> comma 배포 작업 시작"
JENKINS_NODE_COOKIE=dontKillMe nohup java -jar comma-0.0.1-SNAPSHOT.jar &
'''
}
}
}
}
}
ps -ef | grep java | grep comma | grep -v nohup | awk '{print $2}'
git 저장소에서 해당 branch 명의 프로젝트를 가져옵니다.
git branch: '브랜치 명', url: '깃 허브 주소'
해당 PID가 NULL 값이면 true
if [ -z ${CURRENT_PID} ]
해당 PID를 Kill 하고 10초 동안 기다립니다. ( 종료 시간 )
sudo kill -9 $CURRENT_PID
sleep 10
해당 stage를 수행한 후 성공 & 실패에 대한 작업을 정의합니다.
post - success
failure
JENKINS_NODE_COOKIE=dontKillMe : jenkins는 작업이 끝난 후 생성한 프로세스를 제거합니다. 따라서 해당 명령어를 통해 프로세스를 죽이지 않게 설정합니다.
nohup & : 백그라운드에서 실행합니다.
JENKINS_NODE_COOKIE=dontKillMe nohup java -jar comma-0.0.1-SNAPSHOT.jar &
참고 블로그 : https://sihyung92.oopy.io/e5300d92-1a4e-40f4-b927-a93b2bbb17d2
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper Build step 'Execute shell' marked build as failure
root 계정으로 sudoers.d 폴더로 이동
cd /etc/sudoers.d
jenkins 파일 생성
touch jenkins
jenkins 파일에 [jenkins ALL=(ALL) NOPASSWD: ALL] 를 입력
vi jenkins
jenkins ALL=(ALL) NOPASSWD: ALL
jenkins 파일에 보안을 위해 권한을 지정
chmod 0440 jenkins
참고 블로그 : https://hyunmin1906.tistory.com/282
프로젝트 실행 ( run )
./gradlew bootRun
빌드를 통해서 jar 나 war 파일 생성
./gradlew build
빌드 파일 제거
./gradlew clean
테스트
./gradlew test
Jar 파일 생성
./gradlew bootJar
War 파일 생성
./gradlew bootWar
참고 블로그 : https://velog.io/@apayaya/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-run-and-build-gradle#test
참고 블로그 1 : https://lemontia.tistory.com/660
참고 블로그 2 : https://kitty-geno.tistory.com/91
파이프라인 기능에 대해 알기 : 링크