Software Engineering

Github Actions로 초간단 코드 배포하기 (SSH)

머니기어 2024. 2. 2. 10:23
반응형

 

 이번 포스팅에서는 Github Actions를 이용해 아주 간단하게 코드를 원격 리눅스 서버에 배포하는 기능을 구성해보도록 하겠다. 코드 배포에는 Ubuntu를 기준으로 작성되었으며 SSH와 SCP를 이용한다. 이게 제일 간단하다. SCP를 이용하면 복사할 때 중복되는 파일을 덮어쓰기 됨에 유의하자.

 

 

Prerequisites

- 서버의 public access 개방

- 배포할 서버에 접속할 수 있는 key pair (pem파일)

Quick Start

 Github Actions에 들어가서 main 브랜치에 대해 actions를 생성한다. 아래 내용을 작성하면 자동으로 아래 경로에 yml파일이 만들어 진다. 

 

.github/workflows/main.yml

name: Code deploy

on:
  workflow_dispatch:
  push:
    branches:
      - main
      
jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Create SSH Key
        run: |
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/private-key.pem
          chmod 600 ~/private-key.pem
      - name: Create SSH directory
        run: |
          mkdir -p ~/.ssh
      - name: Add known host
        run: |
          ssh-keyscan ${{ secrets.REMOTE_HOST }} >> ~/.ssh/known_hosts
      - name: Copy files to remote server
        run: |
          cd ${{ github.workspace }}
          scp -i ~/private-key.pem -r ./* ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }}:${{ secrets.REMOTE_TARGET }}
          echo "Copied files to remote server"

 

 

레포 Settings에 들어가서 Repository secrets에 아래 항목들을 만들어 준다.

 

  • REMOTE_HOST
  • REMOTE_TARGET
  • REMOTE_USER
  • SSH_PRIVATE_KEY

 

Github Actions 만들기

 

Github Actions 탭에 들어가서 workflow를 새로 만들어 준다. 사전에 정의된 Template를 사용할 수도 있겠으나 이번엔 'set up a workflow yourself'를 눌러서 직접 workflow를 작성하자.

 

Worflow 작성

작성화면에 본문 상단의 내용을 붙여넣기 한다. 코드의 내용을  주석과 함께 자세히 뜯어 보자.

 

name: Code deploy

on:
  workflow_dispatch: # 이 태그가 있으면 workflow를 매뉴얼하게 트리거할 수 있음.
  push: # push할 때 작동
    branches: # 대상이 될 브랜치
      - main
      
jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Create SSH Key
        run: | # access key를 actions 내부 워크스페이스에 pem파일로 저장하고 권한을 확보
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/private-key.pem
          chmod 600 ~/private-key.pem
      - name: Create SSH directory # .ssh 디렉토리 생성
        run: | 
          mkdir -p ~/.ssh
      - name: Add known host # known host에 해당 키를 추가
        run: |
          ssh-keyscan ${{ secrets.REMOTE_HOST }} >> ~/.ssh/known_hosts
      - name: Copy files to remote server # github repo의 모든 파일을 target 경로에 복사함.
        run: |
          cd ${{ github.workspace }}
          scp -i ~/private-key.pem -r ./* ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }}:${{ secrets.REMOTE_TARGET }}
          echo "Copied files to remote server"

 

 

Secrets 등록

 

 

 Actions의 내용은 코드로 관리된다. 코드에 노출되면 안되는 부분은 Actions 머신이 접근할 수 있게 github에서 제공하는 secrets라는 숨겨진 환경변수에 등록해주어야 한다. Settings탭에서 Secrets and variables -> Actions에 들어간 후 Repository secrets에 아래 항목들을 만들어 준다.

  • REMOTE_HOST : 서버의 public 주소. eg. 1.1.1.1 or [도메인]
  • REMOTE_TARGET : 파일을 복사하고자 하는 원격 서버의 디렉토리. 당연하게도 해당 디렉토리에 쓰기 권한이 있어야 한다.
  • REMOTE_USER : 접속할 사용자. root가 아닌 일반사용자를 권장한다.
  • SSH_PRIVATE_KEY : SSH 키 <- pem파일을 메모장으로 열어서 전체 내용을 그대로 복사해 넣으면 된다.

 

모든 작업이 끝났으면 main에 push하거나 actions탭에서 run workflow를 눌러 직접 실행해볼 수 있다.

반응형