환경 구성
- SpringBoot 3.4
- Gradle
- war
Jenkins Pipeline Job 생성
새로운 item을 누른다.
Pipeline을 선택한 후 OK
Configure > Pipeline
- Definition에 Pipeline script from SCM 선택 후 SCM에 연결할 repository type 선택
- 다음과 같이 Modules 작성
- Repository URL : 연결할 repository 주소
- Credentials : 해당 repository 접속을 위한 Jenkins에 등록된 아이디 선택
-
Local module directory :
Jenkins Pipeline에서 소스 코드 저장소를 체크아웃할 때, 워크스페이스의 어느 디렉토리에 체크아웃할지를 지정하는 옵션
- Script Path에서 해당 프로젝트에 생성된 Jenkinsfile경로 등록
Jenkinsfile 작성 예시 참고[추후 정리 필요]
pipeline {
agent any
// 환경변수 저장
environment {
DOCKER_IMAGE = 'iiblackcode/springboot-6060'
REMOTE_DIR = '/home/master' // 원격 서버의 대상 디렉토리
REMOTE_USER = 'master' // 원격 서버의 사용자 이름
REMOTE_HOST = '52.141.27.193' // 원격 서버의 주소
SSH_CREDENTIALS_ID = 'master' // Jenkins 자격 증명 ID
}
stages {
stage('Jenkins Server Build') {
steps {
// 현재 작업 디렉토리 확인
sh 'pwd'
// 디렉토리 변경 후 파일 확인
dir('demo-war') {
sh '''
pwd
ls -l
# windows에서 작업하는 경우 gradlew파일이 text로 인식해서 올바른 형식 변환
dos2unix gradlew
chmod +x gradlew
./gradlew clean build --info
'''
}
}
}// Jenkins Server Build
stage('Test') {
steps {
dir('demo-war') {
sh './gradlew test'
}
}
}
stage('Deploy to Remote Server') {
steps {
echo 'Deploying...'
sh 'pwd'
echo 'Deploying...'
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'JenkinsPipeline_Test', // 설정된 서버 이름
transfers: [
sshTransfer(
sourceFiles: '**/demo-war-0.0.1-SNAPSHOT.war',
remoteDirectory: '.',
removePrefix: 'demo-war/build/libs/',
execCommand: '''
echo "현재 디렉토리 출력"
pwd
cd was/Jenkins_Pipeline_Test
whoami
echo "현재 날짜와 시간으로 태그 생성"
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
DOCKER_IMAGE="iiblackcode/springboot-6060"
TAG="$DOCKER_IMAGE:$TIMESTAMP"
echo "Docker 이미지 강제 삭제 (기존 이미지 태그가 있는 경우)"
# sudo docker rmi -f $TAG || true
sudo docker rmi $(sudo docker images -q)
echo "Docker 이미지 빌드"
sudo docker build -t $TAG .
echo "생성된 Docker image 확인"
sudo docker images
echo "Docker hub login or ACR 등록"
sudo docker login
echo "Docker 이미지 푸시"
sudo docker push $TAG
# sudo docker run -it -d -p 6060:8080 springboot-6060
# sudo docker ps -a
echo "yaml파일 경로로 이동"
cd ../../web/
ls
echo "deployment.yaml 파일 업데이트"
# sed -i "s|image: iiblackcode/springboot-6060:.*|image: \$TAG|" deployment.yaml
sed -i "s|image: iiblackcode/springboot-6060:.*|image: $TAG|" deployment.yaml
echo "업데이트된 deployment.yaml 파일 내용 확인"
cat deployment.yaml
echo "Deployment.yaml 재실행"
kubectl apply -f deployment.yaml
''',
execTimeout: 120000
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
}
}// Deploy to Remote Server
}
post {
success {
echo 'Build completed successfully!'
}
failure {
echo 'Build failed!'
}
}
}