🐸 데브옵스 프로젝트를 진행하며 작성한 코드 정리 ( Test 코드 제외 )
pipeline {
agent any
// ✅ 파이프라인의 실행 단계 정의
stages {
// 1. 깃 클론❗
stage('git clone') {
steps {
git branch: 'main', url: 'https://github.com/hyungdoyou/devops'
}
}
// 2. 프로젝트에 필요한 패키지 설치❗
stage('Install Dependencies') {
steps {
script {
sh 'npm install'
}
}
}
// 3. 기존에 생성되어 있는 dist 폴더 삭제❗
stage('Delete Exist file') {
steps {
script {
sh 'rm -rf /var/lib/jenkins/workspace/k8s-frontend/dist'
}
}
}
// 4. 새로운 프로젝트 빌드❗
stage('Build') {
steps {
script {
sh 'npm run build'
}
}
}
// 5. Docker 빌드❗
stage('Docker Build') {
steps {
script {
sh 'docker build --tag hyungdoyou/fe:3.$BUILD_NUMBER .'
}
}
post {
// Docker 빌드 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
success {
slackSend(
channel: '#테스트',
color: 'good',
message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} build success.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
// Docker 빌드 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
failure {
slackSend(
channel: '#테스트',
color: 'danger',
message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} build failed.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
}
}
// 6. Docker Push❗
stage('Docker Push') {
steps {
script {
// Docker 로그인❗
withCredentials([usernamePassword(credentialsId: 'docker_credentials', usernameVariable: 'DOCKER_EMAIL', passwordVariable: 'DOCKER_PASSWORD')]) {
sh "docker login -u ${DOCKER_EMAIL} -p ${DOCKER_PASSWORD}"
}
// Docker Push❗
sh 'docker push hyungdoyou/fe:3.$BUILD_NUMBER'
}
}
post {
// Docker Push 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
success {
slackSend(
channel: '#테스트',
color: 'good',
message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push success.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
// Docker Push 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
failure {
slackSend(
channel: '#테스트',
color: 'danger',
message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push failed.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
}
}
// 7. SSH 전송❗
stage('SSH transfer') {
steps {
// SSH 전송 플러그인 사용
sshPublisher(
// 오류 발생 시 진행을 멈춤
continueOnError: false,
// 오류 발생 시 파이프라인을 실패시킴
failOnError: true,
// 전송자 목록
publishers: [
// SSH 전송 설명
sshPublisherDesc(
// SSH 서버 설정 이름 지정 ( master 노드 )
configName: "k8s-master",
// 자세한 출력 모드 활성화
verbose: true,
transfers: [
sshTransfer(
// 전송할 파일 지정
sourceFiles: "frontend-deployment.yml",
// 원격 디렉토리 지정 ( 원격서버로 파일을 전송할 위치 )
remoteDirectory: "/root/",
// 전송 후 야멜 파일의 VERSION을 파이프라인 빌드 숫자로 변경
// backend-deployment 야멜 파일 실행
execCommand: '''
sed -i "s/VERSION/$BUILD_ID/g" /root/frontend-deployment.yml
kubectl apply -f /root/frontend-deployment.yml
'''
)
]
)
]
)
}
post {
// SSH Transfer 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
success {
slackSend(
channel: '#테스트',
color: 'good',
message: "frontend-deployment.yml transfer success.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
// SSH Transfer 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
failure {
slackSend(
channel: '#테스트',
color: 'danger',
message: "frontend-deployment.yml transfer failed.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
}
}
// 8. 슬랙 알림❗
stage('Slack Notification') {
steps {
script {
// 파이프라인 단계가 끝나고 슬랙으로 최종 알림 발송
slackSend(channel: '#젠킨스알림', message: "Build version : ${env.BUILD_NUMBER} is finally successful!", teamDomain: 'hooks.slack.com', token: '/services/T06KN5J31HD/B06L8GV2MTL/15TDN2G6g6FfFaq1cgRqrZ5j')
slackSend(
channel: '#테스트',
color: 'good',
message: "Build version : ${env.BUILD_NUMBER} is finally successful!",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token'
)
}
}
}
}
}
pipeline {
agent any
// 파이프라인 실행에 필요한 도구로 maven 지정❗
tools {
maven "maven-3.9.5"
}
// 파이프라인의 실행 단계 정의❗
stages {
// 1. 깃 클론❗
stage('git clone') {
steps {
git branch: 'main', url: 'https://github.com/hyungdoyou/devops-backend'
}
}
// 2. maven 빌드❗
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
// 3. Docker 빌드❗
stage('Docker Build') {
steps {
script {
// 도커 이미지 : hyungdoyou/be:2.[빌드 숫자]
sh 'docker build --tag hyungdoyou/be:2.$BUILD_NUMBER .'
}
}
post {
// Docker 빌드 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
success {
slackSend(
channel: '#테스트',
color: 'good',
message: "Docker image hyungdoyou/be:2.${BUILD_NUMBER} build success.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
// Docker 빌드 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
failure {
slackSend(
channel: '#테스트',
color: 'danger',
message: "Docker image hyungdoyou/be:2.${BUILD_NUMBER} build failed.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
}
}
// 4. Docker Push❗
stage('Docker Push') {
steps {
script {
// Docker 로그인
withCredentials([usernamePassword(credentialsId: 'docker_credentials', usernameVariable: 'DOCKER_EMAIL', passwordVariable: 'DOCKER_PASSWORD')]) {
sh "docker login -u ${DOCKER_EMAIL} -p ${DOCKER_PASSWORD}"
}
// Docker Push❗
sh 'docker push hyungdoyou/be:2.$BUILD_NUMBER'
}
}
post {
// Docker Push 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
success {
slackSend(
channel: '#테스트',
color: 'good',
message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push success.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
// Docker Push 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
failure {
slackSend(
channel: '#테스트',
color: 'danger',
message: "Docker image hyungdoyou/fe:3.${BUILD_NUMBER} push failed.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
}
}
// 5. SSH 전송❗
stage('SSH transfer') {
steps {
// SSH 전송 플러그인 사용
sshPublisher(
// 오류 발생 시 진행을 멈춤
continueOnError: false,
// 오류 발생 시 파이프라인을 실패시킴
failOnError: true,
// 전송자 목록
publishers: [
// SSH 전송 설명
sshPublisherDesc(
// SSH 서버 설정 이름 지정 ( master 노드 )
configName: "k8s-master",
// 자세한 출력 모드 활성화
verbose: true,
transfers: [
sshTransfer(
// 전송할 파일 지정
sourceFiles: "backend-deployment.yml",
// 원격 디렉토리 지정 ( 원격서버로 파일을 전송할 위치 )
remoteDirectory: "/root/",
// 전송 후 야멜 파일의 VERSION을 파이프라인 빌드 숫자로 변경
// backend-deployment 야멜 파일 실행
execCommand: '''
sed -i "s/VERSION/$BUILD_ID/g" /root/backend-deployment.yml
kubectl apply -f /root/backend-deployment.yml
'''
)
]
)
]
)
}
post {
// SSH Transfer 성공 시 슬랙 채널 ( #테스트 ) 로 성공 알림 발송❗
success {
slackSend(
channel: '#테스트',
color: 'good',
message: "frontend-deployment.yml transfer success.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
// SSH Transfer 실패 시 슬랙 채널 ( #테스트 ) 로 실패 알림 발송❗
failure {
slackSend(
channel: '#테스트',
color: 'danger',
message: "frontend-deployment.yml transfer failed.",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token')
}
}
}
// 6. 슬랙 알림❗
stage('Slack Notification') {
steps {
script {
// 파이프라인 단계가 끝나고 슬랙으로 최종 알림 발송
slackSend(
channel: '#테스트',
color: 'good',
message: "Build version : ${env.BUILD_NUMBER} is finally successful!",
teamDomain: 'jenkins-alert-hq',
tokenCredentialId: 'slack-jenkins-token'
)
}
}
}
}
}
🐮 Jenkins CI를 이용한 Slack 알람 발송
1. Slack 채널 오른쪽 클릭 ➡ 채널 세부정보 보기 ➡ 통합 ➡ 앱추가 클릭
2. Jenkins CI 앱 추가 클릭
3. 채널 선택 후 Jenkins CI 통합 앱 추가 클릭
4. 3단계의 "팀 하위 도메인" 과 "통합 토큰 자격 증명 ID" 를 적어두고 저장한다.
5. Jenkins 대시보드에서 Jenkins 관리의 Plugins 클릭
6. Slack Notification 플러그인을 설치한다.
7. Jenkins 관리의 Credentials에서 "Add Credentials"를 클릭한다.
➡ Secret text 선택 후 Secret 에는 위에서 발급받은 토큰 자격 증명 ID를 입력한다.
8. Jenkins file 에서 아래와 같이 슬랙 알람 발송 코드를 작성한다.
slackSend(
channel: '#젠킨스알림', // 슬랙 채널 명
color: 'good', // good, warn, danger 등이 있다.
message: "Build version : ${env.BUILD_NUMBER} is finally successful!",
teamDomain: 'jenkins-XXXX-XX', // Jenkins CI 추가 시 3단계에서 저장해놨던 것
tokenCredentialId: 'test' // 위에서 생성한 Credentials 이름
)