ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CI/CD] 컨테이너 환경에서 CI/CD 구축하기
    devops/CICD 2024. 12. 13. 17:31

     

    컨테이너 환경에서 CI/CD 구축하기

     


    CI/CD 흐름

    1. 깃허브푸시
    2. 깃허브액션에서 도커이미지 생성
    3. 도커 이미지를 ECR로 전달
    4.(깃허브액션이 EC2에게) ECR로부터 도커 이미지를 다운받아 배포진행하도록 명령
    5.(EC2가) 도커이미지 다운후 배포진행

    장점

    도커 컨테이너 기반의 서비스일때 가장 간단하게 구성할 수 있는 인프라 구조

     


    단점

    무중단배포를 구현하거나 여러 EC2 인스턴승 배포해야하는 상황이라면 직접 깃허브액션 스크립트에 작성해서 구현해야한다. 꽤 복잡해진다.


     

    언제쓰는방식인가?

    컨테이너 기반으로 인프라를 구성했을때 이방법을 많이 활용한다.

    서버 여러대 운영하지않을 정도의 소규모 프로젝트일때 주로 활용



     

    준비사항

     

    0.  AWS CLI설치

    로컬, ec2모두에 설치 

    설치방법:

    https://ki-ju.tistory.com/209



    1. Ec2 우분투에서 도커, 도커컴포즈 설치

    sudo apt-get update && \
    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
    sudo apt-key fingerprint 0EBFCD88 && \
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
    sudo apt-get update && \
    sudo apt-get install -y docker-ce && \
    sudo usermod -aG docker ubuntu && \
    sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
    sudo chmod +x /usr/local/bin/docker-compose && \
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    	
    # 잘 설치됐는 지 확인
    docker -v # Docker 버전 확인
    docker compose version # Docker Compose 버전 확인



    2. Github Actions의 IAM에 권한 추가

    2-1) AmazonEC2ContainerRegistryFullAccess 권한 추가

    2-2) 깃허브 레포지토리에 사용자 액세스키 등록


    3. AWS ECR 생성

     

     

    준비사항 끝

     

     

     

     

     

     

     

    1.dockerfile 작성하기

    dockerfile

    FROM node:alpine
    
    WORKDIR /usr/src/app
    
    COPY . .
    
    RUN npm install
    
    RUN npm run build
    
    EXPOSE 3000
    
    CMD [ "node", "dist/main.js" ]

     

    .dockerignore

    /dist
    /node_modules
    /build
    .env

     

     

    2.EC2가 Private ECR에 접근할 수 있게 세팅

    2-1) Amazon ECR Docker Credential Helper 설치하기

    # Ubuntu일 경우
    sudo apt update
    sudo apt install amazon-ecr-credential-helper

     

    2-2) Configuration 설정하기

    `~` 경로에서 `.docker`라는 폴더 만들고, `config.json` 파일 만들어서 위와 같이 작성해라.
    ~/.docker/config.json

    {
    	"credsStore": "ecr-login"
    }



     

     

    2-3) IAM Role을 활용해 EC2가 ECR에 접근할 수 있도록 권한부여하기

    EC2에 연결되어있는 IAM 역할에 AmazonEC2ContainerRegistryFullAccess권한 부여


    3. docker기반 CI/CD구축하기

    3-1) GitHub actions파일 작성

    name: 컨테이너환경 배포
    
    on:
      push:
        branches:
          - main
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
          - name: Github 레포지토리 파일 불러오기
            uses: actions/checkout@v4
    
          - name: node설치
            uses: actions/setup-node@v4
            with:
              node-version: '20'
    
          - name: 의존성설치
            run: npm ci
    
          - name: .env파일만들기
            run: |
              touch .env
              echo '${{ secrets.ENV }}' >> .env
    
          - name: 테스트코드 실행
            run: npm run test
    
          - name: AWS Resource에 접근할수 있게 AWS credential설정
            uses: aws-actions/configure-aws-credentials@v4
            with:
              aws-region: ap-northeast-2
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_ACCESS_SECRET_KEY }}
    
          - name: ECR에 로그인
            id: login-ecr
            uses: aws-actions/amazon-ecr-login@v2
    
          - name: Docker 이미지 생성
            run: docker build -t docker-cicd-practice .
    
          - name: Docker 이미지에 Tag 붙이기
            run: docker tag docker-cicd-practice ${{ steps.login-ecr.outputs.registry }}/docker-cicd-practice:latest
    
          - name: ECR에 Docker 이미지 Push하기
            run: docker push ${{ steps.login-ecr.outputs.registry }}/docker-cicd-practice:latest
    
            #EC2 ip
            #EC2 유저 ubuntu
            #EC2 keypair 내용
          - name: SSH로 EC2에 접속하기
            uses: appleboy/ssh-action@v1.0.3
            with:
              host: ${{ secrets.AWS_EC2_HOST }}
              username: ${{ secrets.AWS_EC2_USER }}
              key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
              script_stop: true
              script: |
                docker stop docker-cicd-practice || true
                docker rm docker-cicd-practice || true
                docker pull ${{ steps.login-ecr.outputs.registry }}/docker-cicd-practice:latest
                docker run -d --name docker-cicd-practice -p 3000:3000 ${{ steps.login-ecr.outputs.registry }}/docker-cicd-practice:latest

     


    3-2) CI/CD 과정 잘 작동하는지 확인

Designed by Tistory.