And Brain said,

Jenkins, CI/CD 파이프라인의 지휘관 - [2] 본문

IT/Jenkins

Jenkins, CI/CD 파이프라인의 지휘관 - [2]

The Man 2022. 12. 25. 23:45
반응형

https://www.jenkins.io/artwork/

 

오늘은 크리스마스 기념 Jenkins를 들고왔다.

 

내가 직접 수많은 오류를 내면서 작성했던 Pipeline Script를 여러분들에게 선물로 드리겠다.

 

 

일단 Jenkins가 왜 CI/CD 파이프라인의 지휘관인지, Git - Jenkins - Docker - Kubernetes의 간략한 아키텍처에 대해 내가 아는 수준에서 설명하겠다.

 

먼저 Git에 소스를 푸쉬하면 Jenkins는 그 변화를 감지하고 변경된 소스를 클론하여 Docker 이미지로 빌드하고 레포지토리에 푸쉬한다.

 

이후, Kubernetes는 레포지토리에 푸쉬된 이미지를 yaml 파일 또는 CLI  명령어등의 방법으로 컨테이너로 실행시킨다.

 

여기서 또한, Jenkins 파일에 Kubernetes 명령어들을 적어서 자동으로 실행시켜줄 수 있다.

 

이것이 Jenkins를 이용한 CI/CD 자동화의 개괄이다. (디테일하게 들어가면 더 복잡하고 나도 아직 다 이해하지 못했다)

 

 

거두절미하고,  Git - Jenkins의 연동은 나의 이전 글을 참고하시기 바라며, 오늘은 Jenkins - Docker를 연동하는 Pipeline Script에 대해 알아보자.

https://theworldaswillandidea.tistory.com/97

 

Jenkins, CI/CD 파이프라인의 지휘관

오늘은 Github 소스를 Jenkins를 이용하여 Docker 컨테이너로 생성하는 CI/CD 파이프라인에 대해 간략히 알아보겠다. 일단 기본적인 Docker 네트워크를 만들고 나는 기존의 컨테이너와 이미지들을 전부

theworldaswillandidea.tistory.com

 

 

pipeline {
    agent any
    
    environment{
        repository = "localhost:5000/${PROJECT_NAME}"
        ENV="${PROJECT_NAME}"
    }
    stages{
        stage('discovery'){
            when{
                environment name:"ENV", value:"discovery"
                }
            stages {
                stage('CLONE') {
                    steps {
                        echo 'Clone'
                        git credentialsId: 'git-signin', url: 'https://github.com/${PROJECT_NAME}'
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; rm -rf *'
                        sh 'mv * /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}'
                    }
                }
                stage('CLEAN') {
                    steps {
                        sh 'chmod +x /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}/gradlew'
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; ./gradlew clean'
                    }   
                }
                stage('BUILD') {
                    steps {
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; ./gradlew build'
                    }
                }
                stage('DOCKER-REGISTRY PUSH') {
                    steps {
                        // 최신 이미지 삭제
                        sh 'docker rmi -f $repository:latest'
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; docker build -t $repository:latest .'
                        sh 'docker push $repository:latest'
                    }
                }
                stage("DOCKER RUN") {
                    steps {
                        // 최신 컨테이너 삭제
                        sh 'docker rm -f ${PROJECT_NAME}'
                        // 이미지 확인
                        sh 'docker images'
                        // 최신 이미지 RUN
                        sh 'docker run -d --name ${PROJECT_NAME} -p 8761:8761 $repository:latest'
                        // 컨테이너 확인
                        sh 'docker ps'
                    }
                }
            }
        }

 

이게 discovery 쪽이다.

 

stage('apigateway'){
            when{
                environment name:"ENV", value:"apigateway"
                }
            stages {
                stage('CLONE') {
                    steps {
                        echo 'Clone'
                        git credentialsId: 'git-signin', url: 'https://github.com/${PROJECT_NAME}'
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; rm -rf *'
                        sh 'mv * /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}'
                    }
                }
                stage('CLEAN') {
                    steps {
                        sh 'chmod +x /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}/gradlew'
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; ./gradlew clean'
                    }   
                }
                stage('BUILD') {
                    steps {
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; ./gradlew build -x test'
                    }
                }
                stage('DOCKER-REGISTRY PUSH') {
                    steps {
                        // 최신 이미지 삭제
                        sh 'docker rmi -f $repository:latest'
                        sh 'cd /var/jenkins_home/workspace/jenkins-msa/${PROJECT_NAME}; docker build -t $repository:latest .'
                        sh 'docker push $repository:latest'
                    }
                }
                stage("DOCKER RUN") {
                    steps {
                        // 최신 컨테이너 삭제
                        sh 'docker rm -f ${PROJECT_NAME}'
                        // 이미지 확인
                        sh 'docker images'
                        // 최신 이미지 RUN
                        sh 'docker run -d --name ${PROJECT_NAME} -p 8000:8000 $repository:latest'
                        // 컨테이너 확인
                        sh 'docker ps'
                    }
                }
            }
        }

 

이게 apigateway 쪽이다.

 

크게 다르지 않음을 확인할 수 있을 것이다.

 

마찬가지로 다른 서비스들도 이 구조에서 크게 벗어나진 않다.

 

여러분들이라면 이보다 더 멋있게 파이프라인을 구축할 수도 있을 것 같다.

 

 

크리스마스가 다 끝났지만 행복한 크리스마스가 됐길 바라며,

 

Thanks for watching, Have a nice day.

반응형

'IT > Jenkins' 카테고리의 다른 글

Jenkins, Publish over SSH; 원격 서버 배포  (2) 2023.02.19
Jenkins, CI/CD 파이프라인의 지휘관  (0) 2022.12.23
[Jenkins] Jenkins, Come here!  (0) 2022.09.26
Comments