Study/ACC 2기

[스터디] 2주차 - CI/CD

shin0112 2024. 4. 4. 01:34

2024.04.03(수) ACC KHU 2기 모임 2주차 - CI/CD (19:00-20:20)
생성일 : 2024.04.04

수정일 수정 사항
2024.04.03 init
2024.04.04 tistory - 깨진 이미지 삭제 및 주석 처리 / notion - 변경 x
2024.12.18 tistory 스킨 커스텀 후 수정 시도(1)
  • 원본 code

https://github.com/SuminSSon/ACC_handson

  • 실습 git repository

https://github.com/shin0112/ACC_hands_on_2


1주차에 배운 docker와 kubernetes 간단히 review하고 ci/cd git actions 핸즈온 진행!

Review

docker - Amazon ECS

: 컨테이너

  1. 신속성
  2. 운영 표준화
  3. 원활한 이전 : local 기반 → aws 환경
  4. 비용 절감

kubernetes - Amazon EKS

: 컨테이너 오케스트레이션 플랫폼

  • serverless : 서버를 관리할 필요 x

Amazon ECR

: Amazon Elastic Containter Registry

  • 완전 관리형 컨테이너 레지스트리
  • docker랑 비슷

Hands-on

docker 이미지 build & run

  1. git clone <원본 repository 주소>

  2. dockerfile 확인

  3. docker 이미지 생성

    docker build -t acc-hands-on-2 .
    • -t : 이름을 설정해주는 option
      • . : 현재 파일 경로 지정
    • 성공!
  1. docker 실행

     docker run [옵션] [이미지] [명령어] [인자]
     docker run -d --name acc-hands-on-2 -p 8000:8000 acc-hands-on-2
    • -d| --detach : 컨테이너를 백그라운드에서 실행
    • -p : host와 container의 포트 연결 (포트포워딩)
      • <host port>:<container port>
      • host에 8000로 접근 → 컨테이너 내부 8000로 자동 접속
    • --name : 컨테이너 이름
  1. 테스트
    . Untitled

  2. docker hub에 이미지 업로드

    1. 1차 시도

      docker push acc-hands-on-2

      [!CATION]
      ⚠️ denied: requested access to the resource is denied
      구글링.. 문제 원인은 크게 2가지

      1. docker hub 로그인을 안함
      2. docker hub 아이디와 이미지의 태그 이름이 일치하지 않음
        ⇒ docker image를 만들면서 tag를 지정해주지 않았음!

    2. 2차 시도

        태그 지정
          docker tag [이미지 이름] [아이디]/[이미지 이름]
          docker tag acc-hands-on-2 wnslcosltimo12/acc-hands-on-2
        docker hub에 다시 업로드
          docker push wnslcosltimo12/acc-hands-on-2
  3. DevOps

    development + operation / 개발 + 운영 (개발 방법론)

    CI/CD

    Source → Build → Test → Deploy

    CI
    : Continuous integration - 지속적 통합

    • 다수의 개발자 → 형상관리 툴 사용
      • github
    • build → test → merge
    • ms 환경 - 서비스를 잘게 쪼개서 개발
    • 빠른 버그 찾기 & 합치기

    CD
    : Continuous Delivery & Continuous Deployment - 지속적 배포

    • 고객의 상품 환경으로 자동 release
    • production 레벨(고객의 상품 환경)까지 자동 deploy

    Jenkins

    • 컴파일러 오류 찾기
    • 자동화 테스트
    • 정적 코드 분석 → 코딩 규약 준수 ☑️
    • 프로파일링 툴 → 성능 변화 감지
    • 결합 테스트 환경

    Github Action

    • workflows
    • events
    • jobs
    • steps
    • actions
    • runners

    AWS code series

    1. AWS CodeCommit

      • aws에서 호스팅 하는 완전 관리형 서비스
      • 코드를 안전하게 저장 & 제어
      • 시간과 파일에 관계 없이 저장 가능
      • git 기반 repostiroy에서 이주 가능
    2. AWS CodeBuild

      • 완전 관리형 빌드 서비스
      • 빌드 도구에 맞게 사전 패키지된 빌드 환경 제공
    3. AWS CodeDeploy

      • 배포할 서버 선택 - EC2, ECS → application 배포 자동화
      • 배포 과정에서 세부사항 제어
        1. 모니터링
      • 동시 배포

      +) AWS beanstalk

      1. 알아서 로드밸런싱
      2. 모니터링

    4. codepipeline

      • 애플리케션을 지속적으로 배포해주는 것을 자동화
      • source → build → test → staging → production
      • Untitled

    Hands-on

    Github Action을 이용한 AWS ECR에 docker 이미지 올리기

    1. ECR 레포 생성

    2. IAM user 생성
      AmazonEC2ContainerRegistryFullAccess 정책 추가 → ecr-hands-on-2 생성

    3. AccessKey, SecretKey 발급 → git settings에 연동

    4. repository 만들고, git remote add origin

    5. git actoins로 되는 거 확인하기!

      • git actions는 .github/workflows/acc.yml 내부의 코드를 읽어서 실행됨

      🌟 jobs : workflow에서 하나의 처리 단위
      steps : jobs의 구성 단위, job은 하나 이상의 step으로 구성

      ```
      # 이름
      name: Docker image push to ECR
      
      # actions이 실행되는 trigger
      # main으로 push되었을 때
      on:
      push:
        branches: [ "main" ]
      
      jobs:
        # build하기
      build:
        name: Build and push Docker image
        # git actions이 실행될 가상 os 환경
        runs-on: ubuntu-latest
      
        steps:
          - name: Checkout
            uses: actions/checkout@v3
      
                    # python 환경 만들기
          - name: Set up Python 3.9
            uses: actions/setup-python@v2
            with:
              python-version: 3.9
      
          - name: Install dependencies
            run: |
              python -m pip install --upgrade pip
      
                    # settings에 넣었던 actions repository secrets 연동 
                    # ECR에 연동하는 IAM user의 access key기 때문에, 자동으로 연동
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v2
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ap-northeast-2 # 서버 위치
      
          - name: Login to Amazon ECR
            id: login-ecr
            uses: aws-actions/amazon-ecr-login@v1
      
                    # ECR에 docker 이미지 올리기
          - name: Push Docker image to Amazon ECR
            env:
              REGISTRY: ${{ steps.login-ecr.outputs.registry }}
              REPOSITORY: acc-hands-on-2
              IMAGE_TAG: ${{ github.sha }}
            run: |
              docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG .
              docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
      ```
      
      > ⚠️ **name unknown: The repository with name 'acc-khu' does not exist in the registry with id '\*\*\*'** 
      > ⇒ workflow의 yml 파일에서 repository설정에 작성한 이름과 내가 만든 ECR 이름 맞춰주기
      
      ![Untitled](e27ea0d0-fa3c-4213-b99b-b5b2b1f55e9f.png)
      
      ![Untitled](3d3d9d42-2cfa-496e-af3b-15f8d9f7c282.png)
      • Untitled

    참고

    [Docker] docker run 명령어 개념 [주요 옵션 설명]

    docker push 에러 (denied: requested access to the resource is denied)