GitHub Actions는 GitHub 저장소에서 이벤트 기반으로 자동화된 작업을 실행할 수 있는 기능이다.
이벤트 기반이라는 말은 push가 일어났을 때, PR이 일어났을 때 등 특정 시점에서 코드가 동작한다는 뜻이다.
GitHub Actions는 크게 세 요소로 구성된다.
Workflow
.github/workflows/*.yml 파일로 정의Job
Step & Action
GitHub Actions에서 배포 작업을 수행할 때, runner는 GitHub가 제공하능 외부 클라우드 환경에서 실행된다.
즉, 배포하려는 서버는 GitHub 네트워크 밖에 있는 VM의 접근을 받아야 한다.
Node.js, Next.js, Docker, PM2 등 어떤 스택이든 GitHub Actions에서 원격 배포하려면 SSH를 사용한다.
SSH의 기본 포트는 22번이다.
따라서 서버 방화벽이 22번 포트를 외부 접속(0.0.0.0/0) 또는 GitHub Actions IP 대역에 대해 열어주지 않으면 runner가 접속할 수 없다.
이 글에서는 클라우드 방화벽에 대해서는 서술하지 않는다.
인스턴스 내부 방화벽 해제
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
GitHub Actions는 외부 서버 접근, API 호출, 빌드 과정 등에서 민감한 값(비밀번호, SSH 키, API 토큰, 환경 구성 정보)을 사용할 수 밖에 없다.
이 값을 GitHub 저장소나 workflow 파일에 그대로 적으면 즉시 유출 위험이 생기기 때문에 GitHub는 두 개의 저장 매커니즘을 제공한다.
저장소의 Settings -> Security -> Secrets and variables로 이동하면 Secrets와 Variables를 등록할 수 있다.
이 곳에서 자동화 배포를 하기 위해서는 Secrets에 세가지 정보를 입력해 주어야 한다.
위 모든 설정을 마쳤으면, 간단한 워크 플로우를 작성하여 실제 인스턴스 서버에 SSH로 연결되는지 확인해보자
# .github/workflows/connection.yml
name: ssh connection test
on:
push:
branches: main
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Hello World
run: echo "Hello from GitHub Actions!"
- name: Current time
run: date
- name: Test SSH connection
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
echo "SSH connection successful!"
echo "Server: $(hostname)"
echo "User: $(whoami)"
echo "Time: $(date)"
