3 min to read
[Jenkins] Jenkins를 활용한 CI/CD 파이프라인 구축 (1)
Jenkins, EC2, AWS, Docker, CI/CD
[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를 사용하기 위한 플러그인
- Credentials Plugin : 단지 서버에 불과한 Jenkins가, 배포 시에 필요한 각종 리소스로 접근하기 위한 정보를 저장해주는 플러그인
- 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에 접속하여 실습해보겠다.
참고자료 : T-Academy Jenkins를 활용한 CI/CD
Comments