기주

[CI/CD] 컨테이너 환경에서 CI/CD 구축하기 본문

devops/CICD

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

기주그지마 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 과정 잘 작동하는지 확인