CI/CD
Github actions 이란?
Github actions은 build, test, deployment 파이프라인을 자동화를 할 수 있게 하는 CI/CD 플랫폼이다.
CI/CD 란?
Continuous Integration / Continuous Delivery
지속적 통합 및 지속적 제공/배포를 의미하며, 소프트웨어 개발 라이프 사이클을 간소화하고 가속화하는 것을 목표로 한다.
CI: 코드의 변경 사항을 지속적으로 통합하고 빌드하며 테스트하는 것
CD: 소프트웨어를 지속적으로 배포하고 최종 사용자에게 제공하기 위해 필요한 단계를 자동화하는 것
CI/CD 파이프라인을 구축하는 이유
직접 배포하는 과정을 코드를 수정할때마다 수정하기엔 번거롭고 서버를 재시작하는 과정에서 중단이 발생하므로 서비스르 제공할 수 없는 시기가 발생한다.
Docker
Docker 란?
애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.
소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는데 필요한 모든 것이 포함되어 있다. 도커를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 수 있다.
Docker 작동방식
도커는 컨테이너를 위한 운영체제이다. 가상 머신이 서버 하드웨어를 가상화하듯, 컨테이너는 서버 운영체제를 가상화한다.
각 서버에 설치된 컨테이너를 구축, 시작 또는 중단하는데 사용할 수 있는 간단한 명령을 제공한다.
도커 명령어
sudo docker ps
도커가 돌아가고 있는지 확인
Github actions와 Docker를 CI/CD 구축하기
1. Docker hub 회원가입
https://hub.docker.com/
username과 password를 기억하기
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
2. Docker hub에서 폴더 생성
3. EC2 생성
https://arongsnuna.tistory.com/23
EC2 로 배포하기 (+ iTerm 이용한 빠른 접속 설정)
EC2란EC2 : Elastic Compute CloudEC2 는 AWS 에서 제공하는 클라우드 컴퓨팅 서비스다.이 서비스를 통해서 아마존이 각 세계에 구축한 데이터 센터의 서버용 컴퓨터들의 자원을 원격으로 사용할 수 있다.
arongsnuna.tistory.com
4. .github/workflows 디렉토리에 ci.yml 파일을 만들기
yml 파일명은 상관없지만 폴더명은 동일하게 해야함!
name: CI/CD
on:
pull_request:
types: [closed] # pull_request closed 됐을 경우
jobs:
build:
runs-on: ubuntu-20.04 # OS 환경
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'dev'
# pull_request가 dev 브랜치에 merge 됐을 경우
# node-version 과 같이 배열로 돼있으면, 해당 원소를 순회하면서 작업이 반복해서 실행된다.
# 응용해서 runs-on에 여러 OS에서 돌릴 수도 있다.
strategy:
matrix:
node-version: [20.x]
# uses 개념은 다른 사람이 작성한 내용을 실행하는 개념이다.
# actions/checkout: GitHub의 마지막 커밋으로 Checkout 한다.
# actions/setup-node: Node.js를 설치한다.
# run 개념은 명령어를 실행한다. 셸 스크립트와 동일하다.
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
# npm ci는 npm install과 같은 기능을 수행한다.
- run: npm ci
# --if-present 옵션은 npm 스크립트가 존재할 때만 실행시키라는 의미이다.
# 만약 build 스크립트가 없는 경우, 오류 없이 지나간다.
- run: npm run build --if-present
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker build
run: |
docker build -t ${{ secrets.PROJECT_NAME }} .
docker tag ${{ secrets.PROJECT_NAME }} ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
docker push ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_SERVER_HOST }}
username: ubuntu
key: ${{ secrets.PRIVATE_KEY }}
envs: GITHUB_SHA
script: |
docker rmi $(docker images -q)
docker pull ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
docker tag ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7} ${{ secrets.PROJECT_NAME }}
docker stop ${{ secrets.PROJECT_NAME }}
docker rm ${{ secrets.PROJECT_NAME }}
docker run -d --name ${{ secrets.PROJECT_NAME }} -p 3001:3001 ${{ secrets.PROJECT_NAME }}
5. 환경변수 설정
ci.yml 에 필요한 환경변수는 다음과 같다.
github repo settings > security > secrets and variables > actions 에서 설정할 수 있다
- DOCKER_HUB_REPO
(도커허브 폴더명, 이때 'USERNAME/' 이 부분도 포함되어야 함) - EC2_SERVER_HOST
(EC2 public IP) - PRIVATE_KEY
(EC2 만들때 설정한 키페어(.pem), -----BEGIN RSA PRIVATE KEY-----,-----END RSA PRIVATE KEY----- 를 포함해야 함) - PROJECT_NAME (임의로 설정, 언더바대문자 안됨)
- DOCKER_USERNAME, DOCKER_PASSWORD (도커허브 계정)
6. EC2에 Docker 설치
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt install docker-ce
sudo usermod -aG docker
// $USER 권한 설정도 해줘야핵
7. Pull Request 생성
작업중인 브랜치를 dev 브랜치에 pr 생성해서 merge를 하게 되면 script(ci.yml) 파일 대로 작업을 수행하게 된다.
8. 결과
- github actions배포가 잘 되었음을 확인할 수 있다.
- docker hubpr를 하고 컨테이너가 생성될때마다 태그들이 생성된다.
troubleshooting 정리
파트장님과 어언 3시간 반을 소비했고, 또 혼자할때도 꽤나 오류가 .. 하핫
- npm과 babel 관련 오류npm 을 통해 필요한 것들을 설치해줬다.
- pacakge.json, package-lock.json 관련 오류였고, 패키지들이 제대로 설치되지 않아서 발생한 오류였다.
- secrets 관련 오류
- 환경변수를 정확히 설정해줘야 한다
[ 참고자료 ]
https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions
GitHub Actions 이해 - GitHub Docs
GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform that allows you to automate your build, test, and deployment pipeline. You can create workflows that build and test every pull request to your repository, or deploy merged
docs.github.com
https://aws.amazon.com/ko/docker/
Docker란 무엇입니까? | AWS
Q: Docker로 어떤 작업을 할 수 있습니까? Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다. 이는 Doc
aws.amazon.com
'DevOps' 카테고리의 다른 글
[에러해결] CDN 주소를 찾지 못함 (0) | 2024.10.23 |
---|---|
EC2 로 배포하기 (+ iTerm 이용한 빠른 접속 설정) (0) | 2024.06.20 |