본격적으로 Jenkins로 CI/CD 파이프라인을 구축해보자.
📌 지난 포스팅
1. Jenkins에 Git 연결
'Dashboard > Jenkins 관리 > Security' 로 들어가 'Manage Credentials'를 선택한다.
그 다음 'Jenkins > Global credentials'를 차례로 누른다.
그 다음 'Add Credentials'를 클릭해서 추가해준다.
1) Git에서 Access Token 발급
나는 기존에 발급받은 토큰을 그대로 사용했다.
- username: Github 아이디
- password: GitHub 토큰
- id는 자유롭게 정해주면 된다. (나는 GitToken이라고 지정했다.)
2. Jenkinsfile 작성
폴더의 root에 Jenkinsfile을 생성한다.
그리고 원하는 pipeline에 대한 코드를 작성한다.
이때 Jenkins 내부에 AWS 환경변수 설정이 필요하다.
AWS를 사용하기 때문에 다음 3가지에 대한 설정을 위해 AWS 콘솔에 다시 로그인한다.
environment {
AWS_ACCESS_KEY_ID = credentials('awsAccessKeyId')
AWS_SECRET_ACCESS_KEY = credentials('awsSecretAccessKey')
AWS_DEFAULT_REGION = 'ap-northeast-2'
HOME = '.' // Avoid npm root owned
}
1) AWS IAM 사용자 추가
- IAM 사용자 추가를 한다.
- 엑세스 키에 선택.
- 권한 설정은 기존 사용자와 동일하게 설정했다. (EC2 등 사용하는 서비스의 정책만 추가하면 될 것 같다.)
- 사용자 추가가 끝나면 엑세스 키와 비밀키를 받을 수 있다.
2) Credentials 추가
앞 단에서 git 엑세스 토큰을 저장할 때와 같은 방식으로 AWS 엑세스 토큰과 비밀키를 추가한다.
이때 ID는 Jenkinsfile에서 설정한 변수명과 동일하게 작성한다.
3) 파일 작성
pipeline {
// 스테이지 별로 다른 거
agent any // 아무 노드나 사용
// 파이프라인을 3분 주기로
triggers {
pollSCM('*/3 * * * *')
}
environment {
AWS_ACCESS_KEY_ID = credentials('awsAccessKeyId')
AWS_SECRET_ACCESS_KEY = credentials('awsSecretAccessKey')
AWS_DEFAULT_REGION = 'ap-northeast-2'
HOME = '.' // Avoid npm root owned
}
stages {
// 레포지토리를 다운로드 받음
stage('Prepare') {
agent any
steps {
echo 'Clonning Repository'
git url: 'https://github.com/ParkJungYoon/CICD-practice.git',
branch: 'main',
credentialsId: 'git_token'
}
post {
// If Maven was able to run the tests, even if some of the test
// failed, record the test results and archive the jar file.
success {
echo 'Successfully Cloned(pull) Repository'
}
// always {
// echo "i tried..."
// }
cleanup {
echo "after all other post condition"
}
}
}
// aws s3 에 파일을 올림
stage('Deploy Frontend') {
steps {
echo 'Deploying Frontend'
// 프론트엔드 디렉토리의 정적파일들을 S3 에 올림, 이 전에 반드시 EC2 instance profile 을 등록해야함.
dir ('./website'){
sh '''
aws s3 sync ./ s3://namhoontest
'''
}
}
post {
// If Maven was able to run the tests, even if some of the test
// failed, record the test results and archive the jar file.
success {
echo 'Successfully Cloned Repository'
mail to: 'frontalnh@gmail.com',
subject: "Deploy Frontend Success",
body: "Successfully deployed frontend!"
}
failure {
echo 'I failed :('
mail to: 'frontalnh@gmail.com',
subject: "Failed Pipelinee",
body: "Something is wrong with deploy frontend"
}
}
}
stage('Lint Backend') {
// Docker plugin and Docker Pipeline 두개를 깔아야 사용가능!
agent {
docker {
image 'node:latest'
}
}
steps {
dir ('./server'){
sh '''
npm install&&
npm run lint
'''
}
}
}
stage('Test Backend') {
agent {
docker {
image 'node:latest'
}
}
steps {
echo 'Test Backend'
dir ('./server'){
sh '''
npm install
npm run test
'''
}
}
}
stage('Bulid Backend') {
agent any
steps {
echo 'Build Backend'
dir ('./server'){
sh """
docker build . -t server --build-arg env=${PROD}
"""
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Deploy Backend') {
agent any
steps {
echo 'Build Backend'
dir ('./server'){
sh '''
docker rm -f $(docker ps -aq)
docker run -p 80:80 -d server
'''
}
}
post {
success {
mail to: 'frontalnh@gmail.com',
subject: "Deploy Success",
body: "Successfully deployed!"
}
}
}
}
}
📌 Reference
반응형
'Cloud > Docker | K8s + CI, CD' 카테고리의 다른 글
[Docker] Flask로 NLP 모델 서빙하기 (0) | 2022.06.25 |
---|---|
[Docker] TypeScript + Node, Dockerfile 작성 및 build (0) | 2022.06.25 |
[CI/CD][#1] EC2(ubuntu)에 Jenkins 설치하기 (0) | 2022.05.23 |
[CI/CD][#1] CircleCI 를 활용한 자동화 파이프라인 구축 (0) | 2022.05.17 |
댓글