-
[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모두에 설치
설치방법:
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 과정 잘 작동하는지 확인'devops > CICD' 카테고리의 다른 글
[CI/CD] 컨테이너 환경에서 CI/CD 구축하기(+code deploy 적용) (0) 2024.12.14 [CI/CD] github-actions를 이용한 CI/CD구축-3 (+AWS code deploy) (0) 2024.12.04 [CI/CD] Github-Actions로 CI/CD 구축하기-2 개선 (0) 2024.12.04 [CI/CD] Github-Actions로 CI/CD 구축하기-1 (0) 2024.12.04 [Github-Actions] Github-Actions와 CI/CD 알아보기 (0) 2024.12.04