GitHub Actions로 SFTP 자동 배포 스크립트 만들기

코드를 수정할 때마다 매번 FTP 프로그램을 열어 해당 파일을 백업하고, 새로운 파일로 교체하는 것은 어쩌다 한두 번이면 몰라도 계속되는 개발 환경에서는 매우 번거로운 일이며 이런 부분에서 효율이 떨어지면 작업 자체가 피곤해지기 마련이다. 깃허브에서는 GitHub Actions를 이용해 소스 코드를 푸시(Push)하기만 하면 서버에 자동으로 반영되는 오토메이션 환경을 구축할 수 있는데 이번 글에서 최대한 쉽게 알아보도록 하자.


GitHub Actions ?

GitHub Actions는 소프트웨어 개발 워크플로우를 깃허브 저장소(Repository) 내에서 직접 자동화할 수 있게 해주는 강력한 CI/CD 플랫폼이다. 단순히 코드를 옮기는 것을 넘어, 코드의 품질 검사부터 빌드, 테스트, 배포에 이르는 전 과정을 하나의 파이프라인으로 연결할 수 있다.

1. 핵심 개념 및 작동 원리

GitHub Actions는 **이벤트 중심(Event-driven)**으로 작동한다. 저장소에서 특정 사건(Event)이 발생하면 설정된 환경(Runner)에서 작업이 실행되는 형태.

  • 이벤트 (Events): 워크플로우를 트리거하는 특정 활동. (예: push, pull_request, 또는 매일 특정 시간에 실행되는 schedule)
  • 워크플로우 (Workflows): 하나 이상의 작업을 실행하는 자동화된 절차. .github/workflows/ 디렉토리에 YAML(.yml) 파일로 정의됩니다.
  • 러너 (Runners): 워크플로우가 실행되는 서버. GitHub에서 호스팅하는 가상 머신(Ubuntu, Windows, macOS)을 사용하거나 사용자의 자체 서버를 연결할 수 있다.
github action auto deploy
전반적인 작동 흐름을 한장의 이미지에 담아봤다. 생성 LLM : 제미나이

2. 워크플로우의 구조 (Hierarchy)

효율적인 스크립트 작성을 위해 다음 계층 구조를 이해하는 쪽이 유리하다.

GITHUB ACTIONS HIERARCHY
Job 작업 동일한 러너에서 실행되는 Step들의 묶음. 여러 Job은 기본적으로 병렬 실행되지만 의존성 설정을 통해 순차 실행도 가능.
Step 단계 커맨드를 실행하거나 작업을 수행하는 가장 작은 실행 단위. 코드 체크아웃, 환경 설정, 스크립트 실행 등이 여기에 포함.
Action 액션 반복되는 작업을 재사용 가능하게 만든 컴포넌트. 예: Checkout, FTP Deploy, Slack 알림 등.

3. GitHub Actions 사용의 장점

  • 저장소와의 통합성: 별도의 외부 CI/CD 도구(Jenkins 등)를 연동할 필요 없이 GitHub 안에서 모든 이력을 관리할 수 있다.
  • 방대한 마켓플레이스: 전 세계 개발자들이 미리 만들어둔 수만 개의 GitHub Marketplace 액션을 가져와서 조합하기만 하면 복잡한 배포도 손쉽게 가능.
  • 매트릭스 빌드 (Matrix Build): 하나의 코드로 여러 OS 환경이나 다양한 언어 버전(PHP 7.4, 8.0, 8.2 등)에서의 테스트를 동시에 진행할 수 있다.

4. 활용 방법 몇가지 소개

GitHub Actions는 지금 이 글에서 설명하는 배포 deploy 외에도 다음과 같은 용도로 활발히 사용된다고 한다.

  1. 코드 린팅(Linting): 코드가 스타일 가이드에 맞게 작성되었는지 자동 검사
  2. 유닛 테스트: 코드가 수정될 때마다 기존 기능이 망가지지 않았는지 확인
  3. 이미지 최적화: 저장소에 이미지를 올리면 자동으로 용량을 줄여서 커밋
  4. 릴리스 자동화: 새 버전을 태그하면 자동으로 배포 노트를 작성하고 배포 파일 생성


배포(Deploy)의 개념 이해하기

배포란 내가 내 컴퓨터(Local)에서 작업한 코드를 실제 사용자들이 접속하는 서버(Server) 환경으로 옮기는 과정을 말한다. 깃허브를 사용하지 않으면서 작업하려면 일일이 내 파일을 FTP나 SSH로 서버에 직접 업로드 하고 파일을 교체하는 작업을 손으로 진행하게 되겠지만 위에서 소개한 액션 기능을 사용하면 그저 깃허브에서 코드를 수정하고 push 하는 것만으로 배포가 완료된다. 게다가 깃허브에서 제공하는 히스토리 기능을 고스란히 사용할 수 있으니 작업 환경 자체가 굉장히 쾌적해진다.


보안을 위해서라면 SFTP

FTP는 파일을 올리고 받는데 편리한 서비스지만 보안을 신경 쓴다면 무조건 SFTP를 사용해야 한다. 아래 표를 보면 알겠지만, 일반 FTP 프로토콜은 사용하는 것만으로도 보안에 문제가 생긴다고 할 수 있다. 개인 사용자라 할지라도 SFTP 사용은 필수라 하겠다. 특히 SSH key 방식은 비밀번호를 외울 필요도 없고, 내가 키를 배포한 클라이언트만 접속할 수 있으므로 가장 추천하는 방식이다. 이번 글에서도 SSH key를 이용하는 방식을 기준으로 설명한다.

FTP vs SFTP COMPARISON
구분 FTP SFTP
보안 데이터가 암호화되지 않음
(패킷 감청 위험)
SSH 암호화를 통해 데이터를 안전하게 전송
포트 기본 21번 기본 22번
인증 방식 아이디/비밀번호 방식만 지원 비밀번호 외에 SSH Key 인증 지원

SFTP 자동 배포 세팅 방법 (상세 가이드)

단계 1: GitHub Secrets 등록하기

텍스트로 된 서버 주소나 비밀번호를 소스 코드에 직접 기록하면 당연히 보안성이 없다. 흔히 말하는 플레인 텍스트1를 사용한다는건 보안 측면에서 지양해야 하는 부분이다. 이를 방지하기 위해 깃허브에는 암호화 저장되는 메뉴를 별도로 제공한다. 흔히 시크릿 Secret 이라 부르며 이곳에 각종 정보를 암호화 기록해 두고 사용한다.

GitHub 저장소의 Settings > Secrets and variables > Actions 에서 New repository secret 버튼을 누르고 아래 사항들을 등록한다.

  • FTP_SERVER: 서버 아이피 또는 도메인 주소
  • FTP_USERNAME: 서버 접속 아이디
  • SFTP_SSH_KEY: 서버의 Private Key (내용 전체 복사)

앞쪽의 FTP_SERVER 이 부분을 Name에 입력하고 서버 아이피 또는 도메인 주소 부분을 내용에 기록한다. 정확하게 입력해야한다.

📌 SSH Key 발급에 대해서

SSH 보안키는 서버측에서 한 쌍의 키를 생성해서 클라이언트에게는 접속용 키만 넘겨주면 된다. 흔히 privatekey 라고 불리는 형태인데 이번 글에서는 발급 과정 자체는 다루지 않겠다. 아래 제미나이나 챗gpt 같은 ai에 질문해서 ssh 키 생성에 대한 상세한 정보를 얻을수 있는 프롬프트를 준비했으니 이를 활용하시기 바란다. 참고로 본인처럼 카페25 호스팅을 받는다면 손쉽게 관리자 메뉴에서 바로 받을수 있다.

SSH 키 발급용 질문 생성 프롬프트

🤖 SSH Key 발급 질문 생성기
✅ 아래 문장을 복사해서 AI에게 질문하세요:

단계 2: 워크플로우 스크립트 작성

내 프로젝트 루트 폴더에 .github/workflows/deploy.yml 파일을 만들고 아래 코드를 복사해 넣는다. 깃허브에서는 폴더 생성 기능이 따로 없고 파일 생성때 경로를 입력하면 해당 폴더들이 같이 생성되니 참고하도록 하자.

NOTICE

⚠️ 주의 사항

아래 2개 스크립트는 동일한 내용이다. 첫번째는 붙여넣기를 위해 주석을 생략한 것이고, 2번째 스크립트는 최대한 상세하게 각 줄마다 무엇을 위한 구문인지에 대한 주석을 달았다. 초보자분들께 도움이 되었으면 한다.

스크립트 01 : 붙여넣기 용

name: Deploy via SFTP

on:
  push:
    branches: [ "main" ] # main 브랜치에 푸시될 때 실행

jobs:
  ftp-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: SFTP Deploy
        uses: wlixcc/SFTP-Deploy-Action@v1.2.4
        with:
          username: ${{ secrets.FTP_USERNAME }}
          server: ${{ secrets.FTP_SERVER }}
          ssh_private_key: ${{ secrets.SFTP_SSH_KEY }}
          port: 22
          # 로컬의 전송할 폴더 경로
          local_path: ./test/
          # 서버의 배포 위치 (상대 경로 주의)
          remote_path: www/wp-content/themes/test/
      

스크립트 02 : 해설용

# 1. 워크플로우의 이름입니다. GitHub Actions 탭에서 이 이름으로 표시됩니다.
name: Deploy via SFTP

# 2. 이 스크립트가 언제 실행될지(트리거) 결정합니다.
on:
  push:
    # "main" 브랜치에 코드가 push(업로드)될 때마다 이 자동화가 시작됩니다.
    branches: [ "main" ]

# 3. 실제 수행할 작업들의 묶음입니다.
jobs:
  # 작업의 고유 ID입니다. 여기서는 'ftp-deploy'라고 정했습니다.
  ftp-deploy:
    # 이 작업이 실행될 가상 환경(서버)을 지정합니다. 
    # 최신 우분투 리눅스 환경에서 작업을 수행하겠다는 뜻입니다.
    runs-on: ubuntu-latest

    # 4. 작업의 세부 단계들입니다.
    steps:
      # [1단계] 현재 저장소(GitHub)에 있는 소스 코드를 가상 환경으로 가져옵니다.
      - name: Checkout code
        uses: actions/checkout@v3

      # [2단계] SFTP를 이용해 파일을 실제 서버로 전송합니다.
      - name: SFTP Deploy
        # 다른 개발자가 미리 만들어둔 'SFTP-Deploy-Action'이라는 도구를 가져다 씁니다.
        uses: wlixcc/SFTP-Deploy-Action@v1.2.4
        
        # 도구 실행에 필요한 설정값(입력값)들입니다.
        with:
          # GitHub Settings > Secrets에 저장한 서버 아이디를 가져옵니다.
          username: ${{ secrets.FTP_USERNAME }}
          
          # 서버 주소(IP 또는 도메인)를 보안 저장소에서 가져옵니다.
          server: ${{ secrets.FTP_SERVER }}
          
          # 가장 중요한 SSH 개인키입니다. 역시 보안 저장소에서 가져옵니다.
          ssh_private_key: ${{ secrets.SFTP_SSH_KEY }}
          
          # SFTP가 사용하는 기본 포트인 22번을 지정합니다.
          port: 22
          
          # [중요] 깃허브 저장소 내에서 서버로 보낼 폴더의 경로입니다.
          # 현재는 저장소 루트의 'test' 폴더만 보내도록 설정되어 있습니다.
          local_path: ./test/
          
          # [중요] 파일이 도착할 실제 서버의 경로입니다.
          # 카페24 같은 호스팅 서비스의 실제 테마 폴더 경로를 정확히 적어야 합니다.
          remote_path: www/wp-content/themes/test/

단계 3: 배포 확인 및 주의사항

경로 설정: remote_path를 설정할 때 서버의 루트 폴더가 어디인지 정확히 확인해야 한다. 잘 모르겠다면 본인의 호스팅 업체에 문의 하면 된다.
SSH Key 형식: 키 내용의 처음(—–BEGIN…)과 마지막(—–END…) 줄을 모두 포함해야 하며, 마지막에 빈 줄이 하나 포함되어야 오류가 없다. 그냥 메모장으로 파일 열고 Ctrl+A 한뒤에 그대로 붙여넣기 하고 아무것도 건드리지말고 저장하면 특별한 경우가 아니면 문제가 없을 것이다.


맺음말

이제 코드를 수정하고 git push만 하면, 자동으로 서버에 파일이 업로드된다. 매번 FTP 열고, 서버 접속해서 수정할 파일 찾아 백업하고 교체하고…그런 귀찮음은 끝이다. SFTP라서 보안도 아무 걱정 없다. 힘겹게(?) 코딩 하고 편안하게 배포하는 즐거움만 남을 것이다. 다음번에는 여기서 한 스텝 더 나아가서, 배포 완료 후 알림을 텔레그램으로 받는 방법에 대해서 소개하도록 하겠다.

  1. Plain Text. 아스키 코드같은 단순한 문자로만 이뤄진 텍스트. 일체의 그림이나 코드 없이 맨눈으로 읽을수 있는 글자로만 이뤄져 있다. 당연히 암호화가 없으니 유출되기 쉽다. 흔히 TV에서 통신사 개인정보 유출 같은 뉴스가 나올때 잘 살펴보면 “해당 정보가 플레인 텍스트로 암호화되지 않아 피해가 더 커져…” 같은 내용을 볼 수 있다. ↩︎

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다