github actions을 사용해 ec2에 docker 서버 빌드배포하기(ci/cd)
프로젝트를 클라우드 환경에서 테스트를 하는데, 매번 파일을 업로드하고 빌드/실행 하는게 번거로워서
Github Actions를 이용해 간단한 CI/CD를 만들었다.
적용된 프로젝트는 nestjs로 만든 서버이다.
1. Dockerfile 생성
나의 경우 node 18.12.1 버전으로 개발했지만, 최신 버전을 사용하려면 lts를 붙이면 된다. (latest의 약자다.)
FROM node:18.12.1
ARG PORT=9090
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . ./
RUN yarn install
RUN npx prisma generate
RUN yarn build:prod
EXPOSE $PORT
CMD [ "yarn", "start:prod" ]
2. .github/workflows/cicd.yaml
github actions 워크플로우를 아래와 같이 작성했다.
name: cicd
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.12.1]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:latest
push-args: --disable-content-trust
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: ssh connect & production
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
cd server
docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password ${{ secrets.DOCKERHUB_PASSWORD }}
docker system prune -a --volumes -f
docker compose pull -q
docker compose up --force-recreate --build -d --quiet-pull 2>log.out
cat log.out
3. secrets 추가
secrets는 아래 이미지 처럼 추가했다.
password를 사용하는 방법은 좋지 않아 token 키를 발행하는게 좋은데, 편의상 이대로 진행했다.
4. ec2 생성
AWS에서 EC2 인스턴스를 생성한다.
나의 경우 ubuntu를 구축했다.
인스턴스가 생성되면 콘솔에서 접속한다.
5. ubuntu 사용자의 passwd를 지정해주자.
패스워드는 깃허브에서 설정한 패스워드와 같아야한다.
sudo passwd ubuntu
# Enter new UNIX password:
# Retype new UNIX password:
# passwd: password updated successfully
6. 도커를 설치해주자.
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
7. 도커 권한 설정.
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
8. 프로젝트 디렉토리를 생성해주자.
디렉토리명은 앞서 cicd.yaml 파일에서 deploy > scripts 작성된 이름과 일치해야 한다.
mkdir ~/server
9. 해당 폴더에 docker-compose.yaml 파일을 생성하자.
image부분은 나의 경우 docker hub private repository를 사용했다.
version: "3"
services:
app:
env_file:
- .env
container_name: server
restart: always
image: IMAGE_URL:latest
ports:
- "3000:3000"
나의 경우엔 .env 파일을 직접 생성했다.
github에 .env도 같이 push 하면 안해줘도 된다.
10. github 푸시
main으로 push 이벤트가 발생되면, github actions가 발동된다.
git push origin main
진행상황은 Actions 탭에서 확인 할 수 있다.
build와 deploy 잡이 완료된걸 확인 할 수 있다.
모두 성공했다면 아래와 같은 결과가 나타난다.
참고