[DevOps] 4. GitHub Actions 사용해보기

jinni·2025년 11월 17일

DevOps

목록 보기
5/6

GitHub Actions

GitHub Actions는 GitHub 저장소에서 이벤트 기반으로 자동화된 작업을 실행할 수 있는 기능이다.
이벤트 기반이라는 말은 push가 일어났을 때, PR이 일어났을 때 등 특정 시점에서 코드가 동작한다는 뜻이다.

Github Actions의 구성 요소

GitHub Actions는 크게 세 요소로 구성된다.

  1. Workflow

    • .github/workflows/*.yml 파일로 정의
    • 전체 자동화 프로세스를 하나의 문서로 기술
    • 여러 Job을 포함할 수 있다.
  2. Job

    • 하나의 "단계 묶음"
    • 기본적으로 Job은 서로 독립된 VM에서 실행된다.
    • 필요하면 needs로 Job간 순서를 제어할 수 있다.
  3. Step & Action

    • Step은 실제 명령 실행
    • Step 내부에서 외부 Action을 가져와 실행할 수도 있다.
    • Action은 재사용 가능한 작업이며 npm 패키지처럼 커뮤니티에서 공유된다.

GitHub Actions setting

방화벽 설정

GitHub Actions에 방화벽이 설정이 필요한 이유

  1. GitHub Actions Runner는 외부 네트워크에서 접속한다.

GitHub Actions에서 배포 작업을 수행할 때, runner는 GitHub가 제공하능 외부 클라우드 환경에서 실행된다.
즉, 배포하려는 서버는 GitHub 네트워크 밖에 있는 VM의 접근을 받아야 한다.

  • GitHub Actions -> 서버 방향으로 SSH, SCP, HTTP, API 요청 등을 보내야 한다.
  • 서버 방화벽이 외부 요청을 막고 있다면 runner가 접근할 수 없다.
  1. 배포 프로세스는 대부분 SSH 기반이다.

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

Secrets, Variables 등록

GitHub Actions는 외부 서버 접근, API 호출, 빌드 과정 등에서 민감한 값(비밀번호, SSH 키, API 토큰, 환경 구성 정보)을 사용할 수 밖에 없다.
이 값을 GitHub 저장소나 workflow 파일에 그대로 적으면 즉시 유출 위험이 생기기 때문에 GitHub는 두 개의 저장 매커니즘을 제공한다.

  • Secrets: 암호화된 민감 정보
  • Variables: 암호화되지 않은 환경 변수

설정

저장소의 Settings -> Security -> Secrets and variables로 이동하면 Secrets와 Variables를 등록할 수 있다.

이 곳에서 자동화 배포를 하기 위해서는 Secrets에 세가지 정보를 입력해 주어야 한다.

  • SERVER_HOST: server의 ip 또는 도메인 입력
  • SERVER_USER: server의 계정명 입력
  • SERVER_SSH_KEY: server에서 생성한 ssh 공개키 입력

접속 테스트 하기

위 모든 설정을 마쳤으면, 간단한 워크 플로우를 작성하여 실제 인스턴스 서버에 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)"

0개의 댓글