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를 눌러 직접 실행해볼 수 있다.

    반응형