-
github actions을 사용해 ec2에 docker 서버 빌드배포하기(ci/cd)Infra/DevOps 2023. 6. 14. 19:12
프로젝트를 클라우드 환경에서 테스트를 하는데, 매번 파일을 업로드하고 빌드/실행 하는게 번거로워서
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 잡이 완료된걸 확인 할 수 있다.
모두 성공했다면 아래와 같은 결과가 나타난다.
참고
'Infra > DevOps' 카테고리의 다른 글