목차
1. 배포환경에 대한 테스트를 위해서 로컬의 도커를 이용하여 테트리스 띄우기 (Dockerfile 테스트)
2. Github Actions workflow 작성
3. Github Actions secrets 작성
4. EC2 설정(Docker 설치)
5. 실행
테트리스는 html/javascript 로 간단하게 만들어둔 레포를 깃허브에서 fork해서 사용합니다.
GitHub - jakesgordon/javascript-tetris: A simple javascript tetris game
A simple javascript tetris game. Contribute to jakesgordon/javascript-tetris development by creating an account on GitHub.
github.com

테트리스 게임 레포의 파일들은 다음과 같습니다.
간단히 html만 띄워주면 되기 때문에 python3 웹서버를 사용하면 됩니다.
1. 배포환경에 대한 테스트를 위해서 로컬의 도커를 이용하여 테트리스 띄우기 (Dockerfile 테스트)
Dockerfile 작성
vi Dockerfile
FROM python:3.9-buster
WORKDIR /root
ADD ./* .
CMD ["python3", "-m", "http.server", "8888"]
Docker 이미지 빌드
docker build -t {도커 image 이름} .
Docker 이미지를 repo에 push
docker push {docker repo 이름}/{docker image 이름}:latest
생성한 도커 이미지파일로 로컬에서 컨테이너 생성
docker run -d \
--name tetris \
-p 8080:8888 \
{docker repo 이름/ docker image 이름}
// Dockerfile 에서 python3 웹서버 실행을 8888포트로 바인딩 했고 로컬에서는
// 8888포트에 자리가 없어서 로컬의 8080포트와 컨테이너의 8888포트로 연결했습니다.
localhost:8080 접속 결과

다음과 같이 테트리스 게임이 정상적으로 서버에 띄워진 것을 확인했습니다.
Dockerfile로 만든 OS환경이 적절하다는 것을 확인했으니 이제 Github Actions workflow를 작성으로 넘어가겠습니다.
2. Github actions workflow 작성
Github actions의 workflow에 작성해될 프로세스입니다.
Docker 이미지 build -> Docker 이미지 push -> ssh로 EC2 접속 -> Docker 이미지 pull -> Docker 컨테이너 실행
Git Repository의 아래 경로에 *.yml 파일로 workflow를 설정합니다. 이 파일은 배포전에 존재하고 있어야 Github Actions에서 이벤트를 감지해 workflow를 실행하게 됩니다.

main.yml:
# GitHub Actions Workflow: Tetris 빌드 및 배포 자동화
# Workflow 실행 조건:
# master 브랜치에 코드가 push되었을 때 실행됨
name: build and deploy tetris
on:
push:
branches: [ "master" ] # master 브랜치에 push될 때만 실행됨
# Actions에서 코드 내용을 읽을 수 있도록 설정
permissions:
contents: read # 코드 저장소 내용을 읽을 수 있는 권한 부여
# Jobs 정의
jobs:
build:
runs-on: ubuntu-latest # 최신 버전의 Ubuntu에서 실행
steps:
# 1. 저장소 코드 체크아웃
- uses: actions/checkout@v3 # 현재 저장소의 코드를 가져옴
# 2. Docker 빌드 및 Docker Hub로 푸시
- name: Docker build & push to docker repo
run: |
# Docker Hub 로그인 (GitHub Secrets 사용)
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
# Docker 이미지 빌드
docker build -t ${{ secrets.DOCKER_REPO }}/tetris .
# Docker Hub에 푸시
docker push ${{ secrets.DOCKER_REPO }}/tetris
# 3. 원격 서버에 배포
- name: Deploy to server
uses: appleboy/ssh-action@master # SSH 액션을 사용하여 원격 서버에 접속
id: deploy
with:
host: ${{ secrets.HOST }} # SSH 접속할 서버 주소 (GitHub Secrets에 저장)
username: ubuntu # 원격 서버의 사용자명
key: ${{ secrets.KEY }} # SSH 개인 키 (GitHub Secrets에 저장)
# 원격 서버에서 실행할 명령어들
script: |
# 실행 중인 모든 Docker 컨테이너 중지 및 삭제
sudo docker rm -f $(sudo docker ps -qa)
# 최신 Docker 이미지 가져오기
sudo docker pull ${{ secrets.DOCKER_REPO }}/tetris
# 새로운 컨테이너 실행
sudo docker run -d --name tetris -p 8080:8888 ${{ secrets.DOCKER_REPO }}/tetris
다음과 같이 작성된 .yml 파일은 깃허브 레포지토리 최상위 디렉토리에서 .github/workflows 경로에 추가해줍니다.
3. Github Actions secrets 작성
workflow 에서 사용된 secrets를 위해 깃허브에 접속하여 해당 레포의 secrets를 추가해주겠습니다.
secrets에 추가해야될 것
- DOCKER_USERNAME
- DOCKER_PASSWORD
- DOCKER_REPO
- HOST (EC2 접속을 위한 HOST IP)
- KEY(EC2 인스턴스를 생성할때 정해둔 키 .pem 파일의 내용)

레포지토리의 Settings에 들어가면 Secrets를 추가할 수 있습니다.

workflow에 필요한 모든 secrets를 추가했습니다.
4. EC2 설정(Docker 설치)
[Docker] Ubuntu 22.04 Docker 설치
Ubuntu 22.04 에 Docker 설치하기
velog.io
ec2에 사용할 OS에 따라 docker 설치 방법이 달라지기 때문에 Ubuntu에 사용하는 방법에 대한 다른분의 글을 첨부해두겠습니다.
EC2의 보안그룹에는 ssh 접속을 위한 22포트와 tetris 게임을 위한 8080포트를 열어두었습니다.
5. 실행
Github Actions의 workflow에서 감지하는 이벤트가 master branch로의 push 이기 때문에, 작성해둔 Dockerfile을 push 하겠습니다. (이때, workflow를 작성한 .yml 파일은 이미 존재해야합니다.)

레포지토리에 push가 발생하자마자 Actions의 wf.yml 의 workflow가 정상적으로 완료된 것을 확인할 수 있었습니다.
정상적으로 테트리스 게임이 배포되었는지 확인하기 위해서 EC2의 http://{퍼블릭ip}:8080로 접속해보겠습니다.

Github Actions, Docker, AWS EC2 를 사용해서 간단한 테트리스 게임 배포를 성공했습니다.
'DevOps' 카테고리의 다른 글
컨테이너 인프라 환경 (0) | 2025.01.24 |
---|