[Jenkins] Jenkins Pipeline

leejk1072·2025년 2월 17일

클라우드

목록 보기
8/8
  • 1부: Jenkins 란?
  • 2부: Docker와 Jenkins
  • 3부: Jenkins 설정하기
  • 4부: Jenkins Pipeline

1. Jenkins Pipeline 이란?

Jenkins Pipeline은 Jenkins에서 CI/CD 프로세스를 코드로 정의할 수 있는 기능입니다.
스크립트 형식으로 작성하여 자동화된 빌드, 테스트, 배포 과정을 관리할 수 있습니다.

주요 장점

  • 코드 기반 설정: Jenkins UI에서 클릭하는 방식이 아니라 코드로 정의
  • 자동화된 배포: 코드 변경 시 자동으로 빌드 및 배포
  • 유연한 확장성: 조건문, 병렬 실행 등을 활용한 다양한 설정 가능

종류

Jenkins Pipeline에는 크게 두 가지 방식이 있습니다.

  1. Scripted Pipeline (스크립트형)
    Groovy 스크립트를 기반으로 하여, 유연하고 복잡한 빌드 및 배포 프로세스를 구성할 수 있습니다. 이 방식은 각 단계에서 세밀하게 제어할 수 있는 장점이 있지만, 그만큼 코드가 복잡해질 수 있겠죠?
    node {
      stage('Build') {
          echo 'Building the application...'
          // 빌드 작업
      }
      
      stage('Test') {
          echo 'Running tests...'
          // 테스트 작업
      }
      
      stage('Deploy') {
          echo 'Deploying the application...'
          // 배포 작업
      }
    }
  • 장점
    • 각 단계에서 세부적인 로직과 제어가 가능함. 예를 들어, 조건문, 반복문 등을 활용한 복잡한 로직 적용 가능
    • 파이프라인의 흐름을 더 자유롭게 정의할 수 있어, 매우 복잡한 자동화 작업에도 적합함
  • 단점
    • 코드가 길어지고 복잡해질 수 있으며, 유지보수가 어려울 수 있음
    • 이 기술을 처음 접한다면, 초반엔 이해와 관리가 힘들 수 있음
  1. Declarative Pipeline (선언형)
    보다 간결하고 선언적인 방식으로 파이프라인을 정의할 수 있습니다. 복잡한 스크립트를 작성할 필요 없이, 파이프라인의 구조를 간단히 선언하고, 각 단계를 명확하게 정의할 수 있습니다. Jenkins Pipeline을 처음 접해보는 분들에겐 선언형이 좀 더 유리합니다.
    pipeline {
      agent any
      
      stages {
          stage('Build') {
              steps {
                  echo 'Building the application...'
                  // 빌드 작업
              }
          }
          
          stage('Test') {
              steps {
                  echo 'Running tests...'
                  // 테스트 작업
              }
          }
          
          stage('Deploy') {
              steps {
                  echo 'Deploying the application...'
                  // 배포 작업
              }
          }
      }
    }
  • 장점
    • 파이프라인의 구조가 명확하고 간단함. 초보자가 이해하기 좋음
    • 기본적인 빌드, 테스트, 배포 흐름을 쉽게 정의 가능
    • 문법이 간단 & 선언적 -> 오류 줄이고 관리가 수월함
  • 단점
    • 복잡한 로직 구현엔 한계가 있을 수 있음
    • 특정한 로직 제어가 필요한 경우엔 불편할 수 있음

결론은,

  • Scripted Pipeline은 더 많은 제어와 유연성을 제공하지만, 그만큼 복잡하고 유지보수가 어려울 수 있습니다. 따라서 고급 사용자나 복잡한 워크플로우를 요구하는 경우에 유용합니다.
  • Declarative Pipeline은 간결하고 선언적이며, 초보자에게 친숙한 방식입니다. 복잡한 제어가 필요 없고, 기본적인 CI/CD 작업을 빠르게 구성하려는 경우에 적합합니다.

2. Jenkins Pipeline 구성

저는 아래와 같이 파이프라인을 구성했습니다. 해당 파이프라인에서의 주요 목표는 프론트엔드와 백엔드의 빌드 및 배포 자동화입니다.

Pipepline 단계

  1. 환경 변수 설정: AWS 리전, ECR 리포지토리, Git Commit Hash 등의 정보 불러오기
  2. ECR 로그인: AWS ECR(Elastic Container Registry)에 로그인
  3. Docker 이미지 빌드: 프론트엔드 & 백엔드의 Docker 이미지를 생성
  4. Docker 이미지 태깅: 생성된 이미지를 ECR에 업로드할 수 있도록 태깅
  5. Docker 이미지 푸시: 태깅된 이미지를 ECR에 업로드

3. Jenkins Pipeline 스크립트

참고로 아래의 스크립트에서 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

파이프라인이 돌아가고 아래처럼 뜨면 파이프라인이 잘 설정되고, 이미지도 성공적으로 푸시된겁니다! 🥳

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

0개의 댓글