포스트

2024.08.01 프로그래머스 - 웹 개발 파이프라인 구축 - 4(UAT)

웹 개발 파이프 라인 구축 - 4 (UAT)

인수 테스트 (UAT : User Acceptance Test)

  • 요구사항대로 기능이 구현되었는지를 확인하는 과정
    • 전체 시스템을 사용자 관점에서 시험하며, 블랙박스 테스트 를 포함
  • CI/CD 구축을 위해 반드시 필요
  • UAT 를 자동화 하는 것이 어려운 요인들
    • 사용자 참여 : 요구사항의 최족 확인은 실 사용자 여야 한다.
    • 의존성 통합 : 테스트할 Application은 모든 의존성을 포함하여 실행 되어야 한다.
    • 스테이징 환경 : 프로덕션 환경 과 동일한 스테이징 환경에서 이루어져야 한다.
    • 애플리케이션 동일성 : 한 번만 빌드하여 프로덕션에서와 동일한 바이너리를 이용해야 한다.
    • 릴리스 준비 : UAT를 통과한 App은 즉시 릴리스 준비가 되어야 한다.

도커 레지스트리 (Docker Registry)

  • 컨테이너화된 소프트웨어의 산출물인 도커 이미지를 관리할 수 있는 레포지토리

  • 클라우드 방식 레지스트리
    • Docker Hub
    • 상용 클라우드에서 제공하는 서비스 (AWS ECR, GCP Artifact Registry, Azure COntainer Registry.. )
  • 자체 호스팅 방식 레지스트리
    • 사내 네트워크가 아닌 외부에 소프트웨어를 보관하는 것을 금지하는 경우에는 유일한 해결방법
    • 직접 관리해야하는 부담이 있고 접근 제어 및 인증서 설정 등의 번거로운 작업이 수반됨

이미지 레지스트리 구축 실습

  • Docker 를 이용한 로컬 PC의 컨테이너로 레지스트리 서비스 테스트
    • Docker Registry 이미지 사용
  • k8s 클러스터에 레지스트리 서비스 배포
    • 기본 동작 테스트
    • OpenSSL 인증서 설치, 설정
    • PV 와 PVC 를 만들어 레지스트리 데이터가 호스트에 남아있도록 설정
    • Docker push 와 kubectl run 으로 기본적 확인

1. registry 컨테이너 실행

1
docker run -d --rm -p 8765:5000 --name registry registry:2 

실습에서는 ubuntu:22.04 에 대한 image 가 필요한데

나는 해당 이미지가 없어서 ubuntu image를 pull 하였다.

1
2
3
4
5
# ubuntu 이미지 없을때 
docker pull ubuntu:22.04

docker tag ubuntu:22.04 localhost:8765/ubuntu:22.04
docker push localhost:8765/ubuntu:22.04

위의 과정까지 진행하면 무엇인가? push 가 진행 된다

curl 명령어로 확인 해보자

1
2
3
4
5
6
7
8
9
curl localhost:8765/v2/_catalog

# 결과
{"repositories":["ubuntu"]}

curl localhost:8765/v2/ubuntu/tags/list

# 결과
{"name":"ubuntu","tags":["22.04"]}
  • 저장된 이미지의 목록과, 태그 목록을 조회했다.

2. k8s manifest 로 pod와 svc 생성

  • registry namespace 가 필요!

    1
    
      kubectl create namespace registry
    
  • registry.yaml 파일 작성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: registry
        namespace: registry
        labels:
          run: registry
      spec:
        replicas: 1
        selector:
          matchLabels:
            run: registry
        template:
          metadata:
            labels:
              run: registry
          spec:
            containers:
              - name: registry
                image: registry:2
                ports:
                  - containerPort: 5000
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: registry-service
        namespace: registry
      spec:
        type: LoadBalancer
        selector:
          run: registry
        ports:
          - name: registry-tcp
            protocol: TCP
            port: 30100
            targetPort: 5000
            nodePort: 30100
        
    
  • 게시 확인

    1
    2
    3
    4
    
       curl localhost:30100/v2/_catalog
         
       # 결과
       {"repositories":[]}
    
  • taggin 및 push

    1
    2
    
      docker tag ubuntu:22.04 localhost:30100/ubuntu:22.04
      docker push localhost:30100/ubuntu:22.04 
    
  • curl 을 통한 확인

    1
    2
    3
    4
    5
    6
    7
    8
    
      curl localhost:30100/v2/_catalog
        
      # 결과
      {"repositories":["ubuntu"]}
        
      curl localhost:30100/v2/ubuntu/tags/list
        
      # {"name":"ubuntu","tags":["22.04"]}
    

Jenkins 파이프 라인에서의 인수 테스트

  1. 개발자가 변경한 코드를 Github에 푸시
  2. Jenkins가 변경을 감지하고 코드를 인출해 빌드를 시작,
    • 코드 점검(단위테스트 수행)
  3. Jenkins가 빌드를 완료하여 도커 이미지 생성
  4. Jenkins가 생성한 이미지를 레지스트리로 푸시
  5. Jenkins가 스테이징 환경을 구성하고 도커 컨테이너 실행
  6. 스테이징 환경의 도커호스트가 이미지를 pull 하여 컨테이너 실행
  7. Jenkins 가 스테이징 환경에서 실행중인 애플리케이션을 대상으로 UAT 실행
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.