본문 바로가기
Infra & Cloud/DevOps

[Jenkins] Jenkins를 활용한 CI/CD 파이프라인 구축 (1)

by newstellar 2021. 9. 10.
반응형

2021.09.10 - [웹 & 앱 개발] - [AWS] AWS로 서버 배포(Deployment) (1) : EC2 인스턴스 생성

 

[AWS] AWS로 서버 배포(Deployment) (1) : EC2 인스턴스 생성

[AWS] 1. EC2 입문 : 인스턴스 생성 0. AWS 가입하기 AWS는 가입 후 1년까지 매우 낮은 수준의 가상 컴퓨터를 무료로 제공하는 프리티어 (Free Tier) 서비스를 제공하고 있다. (단, 가입 시 1$가 소비되니 넉

newstellar.tistory.com

Jenkins를 시작하기 전, AWS (또는 Azure, GCP)를 통해 배포하는 법부터 익히자!


 

[Jenkins] Jenkins를 활용한 CI/CD 파이프라인 구축 (1)

1. CI/CD란?

  • CI (Continuous Integration)
    • 여러 개발자들의 코드베이스를 계속해서 통합하는 것.

 

  • CD (Continuous Delivery / Deployment)
    • 사용자들에게 제품 서비스를 지속적으로 배달하기 위해 코드베이스를 항상 배포가능한 상태로 유지 및 자동화하는 것.
    • 혼자 열심히 개발하는 상황에서 CI는 필요 없을지 몰라도 여러 명이 협업하는 상황에서는 코드를 통합하는 상황에서 아수라장이 펼쳐질 확률이 높다.
    • 개발자가 코드만 짤 수 있도록 사전에 테스트 코드를 짜두는 것이 중요한 이유다.




2. Jenkins란?

  • Jenkins
    • Java Runtime 위에서 동작하여 build, test, deployment 등 Pipeline을 통해 모든 것을 자동화해주는 자동화 서버
      • 다양한 plugin을 활용하여 각종 자동화 작업을 처리할 수 있다.
      • Credentials Plugin, Git Plugin, Pipeline Plugin 등등
      • 개발자가 개발만 할 수 있도록 도와주는 비서 역할.

 

  • Plugin 살펴보기
    • Credentials Plugin : 단지 서버에 불과한 Jenkins가, 배포 시에 필요한 각종 리소스로 접근하기 위한 정보를 저장해주는 플러그인
    • AWS Token, Git Access Token 등 저장
    • Pipeline Plugin : Jenkins의 핵심인 Pipeline을 관리할 수 있게 해주는 플러그인
    • Docker Plugin / Docker Pipeline : Docker agent를 사용하고 Jenkins에서 Docker를 사용하기 위한 플러그인

 

  • Pipeline
    • Pipeline이란 CI/CD 파이프라인을 Jenkins에 구현하기 위한 일련의 플러그인들의 집합
    • 여러 플러그인들을 Pipeline의 용도에 맞게 정의함으로써 서비스가 배포된다.
    • Pipeline DSL(Domain Specific Language)로 작성한다.
    • 두 가지 형태의 Pipeline syntax (Declarative, Scripted)가 존재하는데, 보다 최신이고 가독성이 좋은 Declarative Pipeline syntax를 사용할 예정이며, pipeline syntax에 대해 밑에서 더 자세히 알아보자.

 


3. Pipeline Syntax

  • Sections
    • Agent / Post / Stages / Steps 이렇게 네 가지 section으로 구성된다.
  • (1) Agent Section
    • Jenkins는 혼자서 많은 일을 해야하는 대신 Slave node를 두고 일을 시키는데 Agent Section에서는 어떤 Jenkins 일할 지를 지정한다.
    • Jenkins 노드 관리에서 새롭게 노드를 띄우거나 혹은 Docker image를 통해 처리할 수 있다.
    • 전체 pipeline이나 특정 stage에 대해 agent를 지정할 수 있는데, pipeline block의 제일 처음에는 반드시 정의해주어야 하며, stage 단계에서는 optional하다. 더 자세한 정보는 jenkins docs를 참고하길 바란다.
  • (2) Post Section
    • Stage가 끝난 이후의 결과에 따라 후속 조치를 취할 수 있다.
    • success, failure, always, cleanup 등의 결과에 따라 이메일이나 슬랙 메시지 전송, 중단 혹은 건너뛰기 등의 기능을 실행할 수 있다.
 post {
     // If it was able to run the tests, record the test results and archive the jar file.
     success {
         echo 'success'
     }
}

 

post {
    success {
        mail  to: 'dk02315@gmail.com',
              subject: "Deploy Success",
              body: "Successfully deployed!"

    }
}

 

  • (3) Stages Section
    • 어떤 일들을 처리할 것인지 일련의 stage를 정의한다.
  • (4) Steps Section
    • 하나의 Stage 안에서 여러 단계로 일련의 steps를 지정한다.
stages {
    stage('Prepare') {
        steps {
            git url: 'https://github.com/yeonghyeonKO/Archaeology.git',
                branch: 'master',
                credentialsId: 'jenkinsgit'
            sh 'ls'
            dir ('./docs') {
                sh ``
                aws s3 sync ./ s3://yeonghyeontest
                `` // ` 두 개가 아니라 세 개 붙여야 함.
            }
        }

        post {
             success {
                 echo 'success'
             }
        }
    }

    stage('Build') {
        steps {
            echo 'Building...'
        }
    }
}         

위 코드는 Stages 및 내부의 Steps Section이 어떻게 돌아가는지 보여준다.

 

  • Declaratives
    • Environment : 어떤 pipeline이나 stage scope의 환경 변수설정
 environment {
     AWS_ACCESS_KEY_ID = credentials('awsAccessKeyId')
     AWS_SECRET_ACCESS_KEY = credentials('awsSecretAccessKey')
     AWS_DEFAULT_REGION = 'ap-northeast-2'
     HOME = '.' // Avoid npm root owned
 }
  • Parameter : pipeline 실행 시 parameter를 받음
  • Triggers : 어떤 형태로 trigger되는가
  • When : 언제 실행되는가
 stage('Only for production') {
     when {
         branch 'production'
         environment name: 'APP_ENV', value: 'prod'
         anyOf {
             environment name: 'DEPLOY_TO', value: 'production'
             environment name: 'DEPLOY_TO', value: 'staging'
         }
     }
 }



  • 다음 포스트에서는 실제로 Jenkins를 설치하고 Dashboard에 접속하여 실습해보겠다.

 

 

 

2021.09.10 - [웹 & 앱 개발/DevOps] - [Jenkins] Jenkins를 활용한 CI/CD 파이프라인 구축 (2)

 

[Jenkins] Jenkins를 활용한 CI/CD 파이프라인 구축 (2)

2021.09.10 - [웹 & 앱 개발] - [Jenkins] Jenkins를 활용한 CI/CD 파이프라인 구축 (1) [Jenkins] Jenkins를 활용한 CI/CD 파이프라인 구축 (1) 2021.09.10 - [웹 & 앱 개발] - [AWS] AWS로 서버 배포(Deployment..

newstellar.tistory.com

 


참고자료
T-Academy Jenkins를 활용한 CI/CD
반응형

댓글