Jenkins Pipeline은 Jenkins에서 CI/CD 프로세스를 코드로 정의할 수 있는 기능입니다.
스크립트 형식으로 작성하여 자동화된 빌드, 테스트, 배포 과정을 관리할 수 있습니다.
Jenkins Pipeline에는 크게 두 가지 방식이 있습니다.
node {
stage('Build') {
echo 'Building the application...'
// 빌드 작업
}
stage('Test') {
echo 'Running tests...'
// 테스트 작업
}
stage('Deploy') {
echo 'Deploying the application...'
// 배포 작업
}
}pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building the application...'
// 빌드 작업
}
}
stage('Test') {
steps {
echo 'Running tests...'
// 테스트 작업
}
}
stage('Deploy') {
steps {
echo 'Deploying the application...'
// 배포 작업
}
}
}
}결론은,
저는 아래와 같이 파이프라인을 구성했습니다. 해당 파이프라인에서의 주요 목표는 프론트엔드와 백엔드의 빌드 및 배포 자동화입니다.
참고로 아래의 스크립트에서 Python의 venv를 통해 가상환경을 생성하는데요, 그 이유는 AWS CLI 및 관련 패키지의 버전 관리 때문입니다. Jenkins 환경에서 실행되는 경우, 서버에 설치된 Python 패키지나 AWS CLI 버전이 다를 수 있기에 가상 환경을 만들어 1. 서버의 기존 환경과 충돌을 방지하고 2. 독립적인 실행 환경을 유지하도록 했습니다.
프론트엔드 코드를 Docker 이미지로 빌드한 후 AWS ECR에 업로드하는 스크립트입니다.
#!/bin/bash
# 가상 환경 만들기 및 활성화
if [ ! -d "$HOME/myenv" ]; then
echo "Creating virtual environment..."
python3 -m venv "$HOME/myenv"
fi
echo "Activating virtual environment..."
source "$HOME/myenv/bin/activate"
# AWS 환경 변수 출력
echo "AWS_REGION: $AWS_REGION"
echo "FRONTEND_ECR_REPOSITORY_NAME: $FRONTEND_ECR_REPOSITORY_NAME"
echo "FRONTEND_GIT_COMMIT_HASH: $FRONTEND_GIT_COMMIT_HASH"
# AWS 계정 ID 가져오기
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
echo "AWS_ACCOUNT_ID: $AWS_ACCOUNT_ID"
# 1. ECR 로그인
echo "Logging in to ECR..."
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com"
if [ $? -ne 0 ]; then
echo "ECR 로그인 실패"
exit 1
fi
# 2. 프론트엔드 Docker 이미지 빌드
echo "Building Docker image for frontend..."
docker build -t "$FRONTEND_ECR_REPOSITORY_NAME:$FRONTEND_GIT_COMMIT_HASH" ./frontend
if [ $? -ne 0 ]; then
echo "Docker 빌드 실패"
exit 1
fi
# 3. Docker 이미지 태깅
echo "Tagging Docker image for ECR..."
docker tag "$FRONTEND_ECR_REPOSITORY_NAME:$FRONTEND_GIT_COMMIT_HASH" "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$FRONTEND_ECR_REPOSITORY_NAME:$FRONTEND_GIT_COMMIT_HASH"
if [ $? -ne 0 ]; then
echo "Docker 이미지 태깅 실패"
exit 1
fi
# 4. Docker 이미지 푸시 (ECR로 이미지 푸시)
echo "Pushing Docker image to ECR..."
docker push "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$FRONTEND_ECR_REPOSITORY_NAME:$FRONTEND_GIT_COMMIT_HASH"
if [ $? -ne 0 ]; then
echo "Docker 푸시 실패"
exit 1
fi
echo "Docker image for frontend successfully pushed to ECR!"
# 가상 환경 비활성화
deactivate
백엔드도 동일한 방식으로 Docker 이미지를 생성하여 ECR에 저장합니다.
#!/bin/bash
# 가상 환경 만들기 및 활성화
if [ ! -d "$HOME/myenv" ]; then
echo "Creating virtual environment..."
python3 -m venv "$HOME/myenv"
fi
echo "Activating virtual environment..."
source "$HOME/myenv/bin/activate"
# AWS 환경 변수 출력
echo "AWS_REGION: $AWS_REGION"
echo "BACKEND_ECR_REPOSITORY_NAME: $BACKEND_ECR_REPOSITORY_NAME"
echo "BACKEND_GIT_COMMIT_HASH: $BACKEND_GIT_COMMIT_HASH"
# AWS 계정 ID 가져오기
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
echo "AWS_ACCOUNT_ID: $AWS_ACCOUNT_ID"
# 1. ECR 로그인
echo "Logging in to ECR..."
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com"
if [ $? -ne 0 ]; then
echo "ECR 로그인 실패"
exit 1
fi
# 2. 백엔드 Docker 이미지 빌드
echo "Building Docker image for backend..."
docker build -t "$BACKEND_ECR_REPOSITORY_NAME:$BACKEND_GIT_COMMIT_HASH" ./backend
if [ $? -ne 0 ]; then
echo "Docker 빌드 실패"
exit 1
fi
# 3. Docker 이미지 태깅
echo "Tagging Docker image for ECR..."
docker tag "$BACKEND_ECR_REPOSITORY_NAME:$BACKEND_GIT_COMMIT_HASH" "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$BACKEND_ECR_REPOSITORY_NAME:$BACKEND_GIT_COMMIT_HASH"
if [ $? -ne 0 ]; then
echo "Docker 이미지 태깅 실패"
exit 1
fi
# 4. Docker 이미지 푸시 (ECR로 이미지 푸시)
echo "Pushing Docker image to ECR..."
docker push "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$BACKEND_ECR_REPOSITORY_NAME:$BACKEND_GIT_COMMIT_HASH"
if [ $? -ne 0 ]; then
echo "Docker 푸시 실패"
exit 1
fi
echo "Docker image for backend successfully pushed to ECR!"
# 가상 환경 비활성화
deactivate
파이프라인이 돌아가고 아래처럼 뜨면 파이프라인이 잘 설정되고, 이미지도 성공적으로 푸시된겁니다! 🥳

혹시 파이프라인이 멈추고 실패가 떠도 너무 걱정하지 마세요. 콘솔 로그를 확인하면 다 나오니까 로그를 꼼꼼히 확인해 보는 게 좋겠죠?