Jenkins pipeline + Docker SpringBoot프로젝트 SSHAgent로 배포하기(+Slack Notification)
https://velog.io/@mooh2jj/Jenkins-pipeline-Docker-SpringBoot프로젝트-배포하기
이전 블로그에서는 Jenkins pipeline으로 jenkins가 설치되어 있는 인스턴스에 배포하는 작업을 하였습니다.
이번에는 원격에 있는 AWS EC2 인스턴스에 SSH로 원격으로 배포하는 작업을 구현하였습니다.
Jenkisn 실행
기존에 설치했던 jenkins 인스턴스 안에 docker 이미지로 jenkins를 실행합니다.
docker run -d -p 8080:8080 --name=jenkinscicd -v /jenkinsDir:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock mooh2jj/myjenkins
- Jenkisn 실행로그 확인
docker logs [jenkins 컨테이너ID]
Jenkins pipeline 설정
jenkins 홈페이지에 들어가서 pipeline
설정으로 Item
을 만들어봅니다.
그 전 블로그에서는 Pipeline > Pipleline script from SCM
으로 Jenkinsfile을 설정했다면
Pipleline script
으로 파이프라인 문법으로 작성해보고 하는 것으로 시작해도록 하겠습니다.
이는 Pipeline Syntax
를 사용하기 위함입니다.
Pipeline Syntax
는 SSH나 기타 Credentail
설정에서 pipeline 문법에 맞게 설정해주는 데 아주 유용합니다.
작성한 pipeline 작성 순서는
- jenkins 인스턴스 :
git clone -> gradle build -> docker build -> docker push
- ssh 인스턴스 :
docker pull -> docker run
순으로 작업을 진행합니다.
Jenkinsfile은 spring project 바로 아래에 놓여 있다. Dockerfile도 같은 위치에 놓여야 한다는 것을 주의한다.
Jenkins pipeline 순서
# 다음과 같은 순서로 동작하는 파이프라인이 완성된다.
1. jenkins인스턴스 git clone
2. jenkins인스턴스 gradle build
3. jenkins인스턴스 docker build
4. jenkins인스턴스 docker push
5. jenkins인스턴스 -> server인스턴스 ssh접속
6. server인스턴스 docker pull
7. server인스턴스 docker run
Jenkinsfile
pipeline{
agent any
stages {
stage('Prepare') {
agent any
steps {
git credentialsId: 'git-creds', url: 'https://github.com/mooh2jj/docker-jenkins-pipleline-test.git'
}
post {
success {
echo 'prepare success'
}
always {
echo 'done prepare'
}
cleanup {
echo 'after all other post conditions'
}
}
}
stage('Build Gradle') {
steps{
sh 'chmod +x gradlew'
sh './gradlew clean build'
sh 'ls -al ./build'
}
}
stage('Docker build image'){
steps{
sh 'docker build . -t mooh2jj/docker-jenkins-pipeline-test'
}
}
stage('Docker push image') {
steps {
withCredentials([string(credentialsId: 'docker-pwd', variable: 'dockerHubPwd')]) {
sh "docker login -u mooh2jj -p ${dockerHubPwd}"
}
sh 'docker push mooh2jj/docker-jenkins-pipeline-test'
}
post {
success {
echo 'success'
}
failure {
echo 'failed'
}
}
}
stage('Run Container on SSH Dev Server'){
steps{
echo 'SSH'
sshagent (credentials: ['ubuntu-server']) {
sh "ssh -o StrictHostKeyChecking=no [email protected] 'docker pull mooh2jj/docker-jenkins-pipeline-test'"
sh "ssh -o StrictHostKeyChecking=no [email protected] 'docker ps -q --filter name=docker-jenkins-pipleline | grep -q . && docker rm -f \$(docker ps -aq --filter name=docker-jenkins-pipleline)'"
sh "ssh -o StrictHostKeyChecking=no [email protected] 'docker run -d --name docker-jenkins-pipleline -p 8080:8080 mooh2jj/docker-jenkins-pipeline-test'"
}
}
}
}
}
Jenkins build
해당 화면에서 Build Now
를 클릭하면 jenkins build가 실행되고 잠시 후 다음과 같이 Stage View에 진행 상황이 나오는 것을 확인 할 수 있습니다.
실패하면 좌측 하단 Build History를 통해 자세한 로그를 확인할 수 있고 console out 에서도 확인할 수 있습니다.
파이프라인이 실패없이 진행되었다면 docker hub에서 해당 image가 update된 것을 확인할 수 있습니다.
EC2 인스턴스에 SSH 접속
jenkins인스턴스에서 server인스턴스로 ssh 접속하여 docker image pull 및 run 작업을 시켜줄려면 먼저
sshagent plugin
을 jenkins에 설치를 해주어야 합니다.
이전과 마찬가지고 Dashboard -> Jenkins 관리
-> 플러그인 관리
에서
ssh agent를 검색
하고 체크 및 Download now and install after restart 버튼 클릭 후 재시작하시면 됩니다.
server인스턴스에 ssh접속할 수 있도록 Credentail을 등록해주어야 합니다.
이 화면은 앞서 Pipeline Syntax
안으로 들어가면 해당 설정으로 들어갈 수 있습니다.
Kind 드롭박스에서 SSH Username with private key
를 선택해주고
ID는 server인스턴스의 유저명 (ec2 ubuntu의 경우 ubuntu
)
Username은 파이프라인 코드에서 식별할 키값 (저는 ubuntu-server
라고 했습니다.)
Private Key에서 적어줘야 되는 것은
✅server인스턴스의 pem 파일내용
입니다!
-----BEGIN RSA PRIVATE KEY-----
~~~~~ ssh 인스턴스의 pem 파일을 클릭하면 나옵니다
-----END RSA PRIVATE KEY-----
이 내용을 모두 입력해주고 Add 눌러주면 됩니다.
그러면 여기서 pipeline 문법으로 generate한 내용을 그대로 jenkinsfile에 옯겨주시면 됩니다.
이렇게 정리한 ssh 접속 pipeline stage는 아래와 같습니다.
pipeline {
agent any
stages {
stage('SSH SERVER EC2') {
steps {
echo 'SSH'
sshagent(['credentail 식별 값']) {
sh 'ssh -o StrictHostKeyChecking=no [user name]@[ip address] "whoami"'
sh "ssh -o StrictHostKeyChecking=no [user name]@[ip address] 'docker pull [이미지 이름]:[태그 이름]'"
sh "ssh -o StrictHostKeyChecking=no [user name]@[ip address] 'docker run [이미지 이름]:[태그 이름]'"
}
}
}
}
}
jenkins pipeline 실행이 되면
ssh 인스턴스에 docker ps 명령어로 서비스가 실행된 것을 확인할 수 있습니다.
그 다음에 pipeline script from SCM
으로 springboot 프로젝트 Jenkinsfile
로 등록해서 설정해주어도 됩니다.
Jenkins Slack Notification 설정
jenkins pipeline script에서 slack Notification
을 설정할 수 있습니다.
Jenkins에서 slack 플러그인
및 Credential 설정
은 아래 블로그
https://velog.io/@mooh2jj/Jenkins-Slack-Notification-등록
에서 참고하시기 바랍니다.
Jenkins pipeline
### jenkins pipeline stage 추가
stage("Slack Notification") {
steps {
echo 'slack test'
}
post {
success {
slackSend channel: '#프로그래밍', color: 'good', message: "success deploy"
}
failure {
slackSend channel: '#프로그래밍', color: 'danger', message: "failure deploy"
}
}
}
결과
참고
-
소스출처 : https://github.com/mooh2jj/docker-jenkins-pipleline-test.git
-
https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#string-interpolation
Author And Source
이 문제에 관하여(Jenkins pipeline + Docker SpringBoot프로젝트 SSHAgent로 배포하기(+Slack Notification)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mooh2jj/Jenkins-pipeline-Docker-SpringBoot프로젝트-SSH-배포하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)