이전 글 처럼 간단하게 스크립트 실행만 해줘도 되지만 실행이 완료 / 실패 상관없이 pipline이 완료가 된다.
deploy.sh 파일의 실행 로그를 보려면 verbose 옵션을 주어야 한다.
pipeline {
agent any
stages {
stage('Clone') {
steps {
script {
git branch: 'develop', credentialsId: 'github', url: 'https://github.com/sudosoo/ElasitcKafka.git'
}
}
}
stage('ConfigAppender') {
steps {
script {
sshagent(credentials: ['ssh_key']) {
def workspaceDir = "${JENKINS_HOME}/workspace/${JOB_NAME}"
sh """
ssh -p 58282 ljh8651@192.168.50.156 \
'cd /volume1/docker/springApp/config/ && tar -cf - *' \
| tar -xf - -C ${workspaceDir}/src/main/resources/
"""
}
}
}
}
stage('Build') {
steps {
script {
sh './gradlew clean bootJar'
}
}
}
stage('Deploy') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'deployJenkins',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'cd /volume1/docker/springApp/ && sh deploy.sh start',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/docker/springApp/',
remoteDirectorySDF: false,
removePrefix: 'build/libs',
sourceFiles: 'build/libs/*.jar')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
}
}
stage('Clean Workspace') {
steps {
script {
// Jenkins 워크스페이스 디렉토리 지정
def workspaceDir = "${JENKINS_HOME}/workspace/${JOB_NAME}"
// 워크스페이스 디렉토리 비우기
sh "rm -rf ${workspaceDir}/*"
}
}
}
1. application.properties , logback-spring.xml 외부프로퍼티 파일 넣기
application.properties , logback-spring.xml
두 파일은 보안상 github에 업로드 시키지 않는데 이 파일을 언제 넣어서 서버를 빌드 시켜야 할까 생각했다.
- 첫번째
Dockerfile 실행 시점 => ENTRYPOINT ["java","-jar","/app.jar"] 에 해주려다가 외부 디렉터리를 읽지 못해 실패 하였다. - 두번째
clone 시점 => build 하기전에 config 파일들을 모두 넣고 jar 생성하기
build step전 config파일을 로컬에서 복사해서 완전한 JAR 파일을 만들어 준다.
밑의 스크립트는 .tar로 압축하여 옮긴 후 압축을 해체하고 삭제하는 스크립트이다.
stage('ConfigAppender') {
steps {
script {
sshagent(credentials: ['ssh_key']) {
def workspaceDir = "${JENKINS_HOME}/workspace/${JOB_NAME}"
sh """
ssh -p 58282 ljh8651@192.168.50.156 \
'cd /volume1/docker/springApp/config/ && tar -cf - *' \
| tar -xf - -C ${workspaceDir}/src/main/resources/
"""
}
}
}
}
2. Deploy
stage('Deploy') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'deployJenkins',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'cd /volume1/docker/springApp/ && sh deploy.sh start',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/docker/springApp/',
remoteDirectorySDF: false,
removePrefix: 'build/libs',
sourceFiles: 'build/libs/*.jar')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
}
}
Jenkins 의 Publish over SSH 로
Build step에서 완료된 JAR파일(젠킨스서버)을 => ssh 로 접속 후 => 로컬서버 JAR파일 복사 후 => Sh파일 원격실행
이렇게 하기 위해선 authenticated.keys 를 설정해주어 Pub 키로 ssh 접근 하는 방법을 알아야 한다.
원리는 아래 생활코딩님의 강의를 한번 들어보자.
https://opentutorials.org/module/432/3742
위의 authenticated_keys 설정을 맞쳤다면....
젠킨스 서버에서
ssh -p 포트 접속아이디@접속IP
명령어를 쳤을때 비밀번호 입력없이 바로 들어가져야 한다.
Publish over ssh 플러그인을 설치하고
jenkins Dashboard => Jenkins 관리 => system 맨 아래 부분 가보면
Passphrase 는 비워두면 자동으로 채워짐
Name 이 부분은 PIpline 스크립트에 넣을 아이디
아래 hostName 에 접속 ip 주소를 입력하고
username에 ssh 접속 ID를 넣어준다.
#ssh접속포트가 22가 아닌 다른걸로 변경 했을시에 고급버튼을 누르고 포트번호를 변경해준다.
아래 Test Configuration을 눌러 왼쪽에 Success가 나오면 성공.
다시 스크립트로 간다.
stage('Deploy') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'deployJenkins',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'cd /volume1/docker/springApp/ && sh deploy.sh start',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/docker/springApp/',
remoteDirectorySDF: false,
removePrefix: 'build/libs',
sourceFiles: 'build/libs/*.jar')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
}
}
configName => ssh server Name 에서 설정해준 이름을 넣어준다.
execCommand => 실행 할 커맨트
- 필자는 sh파일을 실행시킨 후 Docker, docker-compose 파일을 실행해야 해서 디렉터리 위치를 cd로 이동시켜준 후 실행 시켰다.
remoteDirectory: => JAR 파일이 도착할 곳
sourceFiles: 복사 할 JAR파일의 위치
3. workspace(Jenkins) 디렉터리 비우기
이 부분은 해도되고 안해도 되는데 workspace에 잔여물이 남아 나중에 이상이 있을지도 모를거 같아서 비워주었다.
stage('Clean Workspace') {
steps {
script {
// Jenkins 워크스페이스 디렉토리 지정
def workspaceDir = "${JENKINS_HOME}/workspace/${JOB_NAME}"
// 워크스페이스 디렉토리 비우기
sh "rm -rf ${workspaceDir}/*"
}
}
}
'개-발 > Infra' 카테고리의 다른 글
[Kafka] MSA 서버간 비동기 통신 (요청 - 응답 모델) (0) | 2024.02.29 |
---|---|
[Kafka + SSE] 실시간 알림 메세지 구현 (0) | 2024.01.10 |
[Docker + NginX + Jenkins] Spring 프로젝트 Blue,Green 무중단 배포 CI CD 2/2 (2) | 2023.12.03 |
[Docker + NginX + Jenkins] Spring 프로젝트 Blue,Green 무중단 배포 CI CD 1/2 (2) | 2023.11.28 |
[Docker] SpringBoot 프로젝트 올리기 (2) | 2023.11.28 |