깃허브 주소
Springboot
웹애플리케이션의 코드를 Github에 커밋함Jenkins
에서 CI Job을 수행하면 CI가 시작됨(커밋을 가져옴)Gradle
빌드 스크립트를 내려받음Jenkins
를 통해 코드를 빌드함Gradle
빌드 스크립트안에는 컴파일 빌드시 코드 라이브러리 의존성 참조를 위해 Artifact Rdpository에서 Artifact를 가져옴Jib
에 Gradle
코드를 가져옴Gradle
과 Jib
플러그인을 포함해 Docker
이미지 빌드함Jib
을 통해 이미지 레파지토리인 AWS ECR
에 Push되고 CD가 진행됨AWS EC2
VM의 SSH로 접속하고 배포 명령어를 실행해 진행됨AWS ECR
에 저장된 도커이미지를 가져와서 컨테이너를 실행함Springboot
웹 어플리케이션이 실행되어 80포트로 노출되며 HTTP 웹접속이 가능해짐새로운 Item 만들기 -> Pipeline 선택 -> 이름 작성
Repository URL에 HTTPS 링크를 넣어야함 main 브랜치 작성Script Path
젠킨스 파일의 위치(깃허브)를 지정한다.
예제 코드를 Github 레파지토리에서 가져오는 만큼 파이프라인으로 사용되는 레파지토리에 저장된 파일의 위치를 적어야 한다.
CI/CD 작업을 하기 위해 IDE 에 Github 레파지토리를 다운받아서 실행
def mainDir="Chapter02/2-jenkins-docker" // 메인 디렉토리
def ecrLoginHelper="docker-credential-ecr-login" // ECR에 push할 때 필요한 로그인을 미리 전역변수로 적어둠
def region="us-east-1" // 사용하는 리전
def ecrUrl="436115905187.dkr.ecr.us-east-1.amazonaws.com/test" // ECR url
def repository="test" // 프라이빗 fp파지토리
def deployHost="172.31.81.217" // 배포서버 - AWS EC2 프리이빗 IP
pipeline { // 파이프라인을 stage별로 나눠서 명시함, 흐름을 파악할 때 사용
agent any
stages {
stage('Pull Codes from Github'){
steps{
checkout scm
}
}
stage('Build Codes by Gradle') { // Gradle을 이용한 빌드과정
steps {
sh """
cd ${mainDir}
./gradlew clean build
"""
}
}
stage('Build Docker Image by Jib & Push to AWS ECR Repository') {
steps {
withAWS(region:"${region}", credentials:"aws-key") { // us-east-1 리전과 ECR에 로그인하기 위한 key
ecrLogin()
sh """
curl -O https://amazon-ecr-credential-helper-releases.s3.us-east-1.amazonaws.com/0.4.0/linux-amd64/${ecrLoginHelper} // ECR credentials helper를 다운 받음
chmod +x ${ecrLoginHelper}
mv ${ecrLoginHelper} /usr/local/bin/ // helper를 실행할 수 있도록 PATH로 옮김
cd ${mainDir}
./gradlew jib -Djib.to.image=${ecrUrl}/${repository}:${currentBuild.number} -Djib.console='plain' // helper는 jib을 통해 이미지를 빌드할 수 있고, gradlew를 통해 aws ECR에 레파지토리에 push함
"""
}
}
}
stage('Deploy to AWS EC2 VM'){
steps{
sshagent(credentials : ["deploy-key"]) { // 젠킨스에 접속하기 위한 key
sh "ssh -o StrictHostKeyChecking=no ubuntu@${deployHost} \
'aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${ecrUrl}/${repository}; \
docker run -d -p 80:8080 -t ${ecrUrl}/${repository}:${currentBuild.number};'"
}
}
}
}
}
빌드 성공