이전 내용에서 Jenkins를 활용한 빌드가 성공했다는 상황을 가정하고 진행하겠습니다.
이후 진행될 내용은 jenkins에서 SSH Agent Plugin plugin을 설치한 이후 진행할 수 있으므로 설치를 먼저 해주시면 됩니다.
배포용 Deploy EC2 instance를 새로운 키페어로 생성하고 보안 규칙에 Jenkins EC2 instance의 ip를 ssh 포트에 한해 허용한다. (물론 본인 로컬 ip ssh 접속 or aws Instance Connect ip대역도 허용해야합니다.)
이후 EC2 instance 생성 과정에서 다운받은 키페어 파일의 내용을 복사해서 Jenkins configuration에 등록해주어야한다.
Deploy EC2 instance 접속 pem 키 jenkins 등록 과정
jenkins 관리 -> Credentials -> global 도메인에 Add credentials 클릭
위 사진의 설명대로 본인에게 맞추어 입력하고, Deploy EC2 instance에 접속 가능한 pem 키 내용 전문을 복사하여 private Key의 내용에 복사해준 뒤 저장.
기초적인 CI/CD과정을 진행하기 위한 pipeline 코드는 아래와 같다. 해당되는 부분들을 선언해주어 자동 빌드가 수행되도록 해보자
pipeline{
agent {어떤 jenkins agent가 수행할 수 있는지}
tools{
// 어떤 tool을 사용하여 아래 stage를 수행하는지
gradle {내가 jenkins tools에서 설정한 내 gradle 이름}
}
stages{
//stage 명은 '나 or 팀원이 식별할 수 있는 stage 이름' 으로
stage(클론&pull){
steps{
git branch: {브랜치명}, url: {빌드할 프로젝트 repository.**git**}
}
}
stage(빌드){
steps{
//jenkins container 내부에서 jar 파일이 생길 경로에서 아래 명령어를 수행하라
dir(디렉토리){
sh "gradle init"
sh "echo 'building'"
withGradle{
sh "gradle wrapper build"
}
}
}
}
stage(배포서버로 필요한 파일 전송) {
steps {
sshagent (credentials: [jenkins에 등록된 배포서버 접속 가능 pem 키]) {
sh """
ssh 접속, 배포에 필요한 파일 scp로 copy
"""
}
}
}
stage('Deploy'){
steps{
sshagent (credentials: [jenkins에 등록된 배포서버 접속 가능 pem 키]){
sh """
ssh 접속, springboot project를 실행하는 스크립트 실행
"""
}
}
}
}
}
현재 프로젝트에 진행되는 내 pipeline 코드는 아래와 같다.
pipeline {
agent any
environment {
// 원격 호스트 주소 변수
REMOTE_HOST = 'ip-172-31-35-146.ap-northeast-2.compute.internal'
}
tools {
gradle 'gradle-8.4'
}
stages {
stage('Git-Clone') {
steps {
git branch: 'master', url: 'https://github.com/Spring-trello/trello.git'
}
}
stage('Build') {
steps {
sh "chmod +x gradlew"
sh "./gradlew clean build"
}
}
stage('send jar and sh') {
steps {
sshagent (credentials: ['deploy-ec2-pem']) {
sh """
ssh -o StrictHostKeyChecking=no ubuntu@${REMOTE_HOST} uptime
scp /var/jenkins_home/workspace/hh/build/libs/hanghaero-0.0.1-SNAPSHOT.jar ubuntu@${REMOTE_HOST}:/home/ubuntu/hh/backend
scp /var/jenkins_home/workspace/hh/myresource/deployment/run-server.service ubuntu@${REMOTE_HOST}:/home/ubuntu/hh/backend
scp /var/jenkins_home/workspace/hh/myresource/deployment/run-server.sh ubuntu@${REMOTE_HOST}:/home/ubuntu/hh/backend
"""
}
}
}
stage('Deploy'){
steps{
sshagent (credentials: ['deploy-ec2-pem']){
sh """
ssh -o StrictHostKeyChecking=no ubuntu@${REMOTE_HOST} uptime
ssh -t ubuntu@${REMOTE_HOST} sudo chmod 755 /home/ubuntu/hh/backend/run-server.sh
ssh -t ubuntu@${REMOTE_HOST} /home/ubuntu/hh/backend/run-server.sh
"""
}
}
}
}
}
참고로 jar 파일은 빌드를 잘 수행했다면 같은 경로에 잘 있겠지만, sh, service 확장자 파일들은 없을 것입니다.
우선은 아무 내용이 들어있지 않은 run-server.sh, run-server.service 파일을 생성해서 진행해주시면 됩니다.
이렇게 pipeline 코드까지 잘 설정해주면 jenkins에서 빌드 버튼을 눌렀을 때,
Git-Clone : 알아서 내 github repository에 있는 master 브랜치의 최신 내용을 pull 하고,
Build : 빌드를 jenkins가 구동되는 환경에 진행하여 성공하면 jar 파일이 만들어지고
send jar and sh : Build stage에서 생성된 jar파일과 같이 .sh, .service 등의 배포 springboot 프로젝트를 구동하기 위한 파일들을 Deploy EC2 instance에 전달(복사) 해준다.
Deploy : 이제 배포 서버에는 jar, .sh, .service 파일들이 있고, sh. 파일을 실행하면 프로젝트가 구동된다.
send jar and sh, Deploy Stage의 내용에 대해서는 이후 포스팅에서 진행하겠습니다.