GitHub Actions 를 사용한 배포 환경 구축

손대중·2022년 3월 15일
0

개요

API 서버를 구축하기 전에 편리한 개발환경을 조성하는게 좋을 것 같다.

이런건 해본적도 없고 문외한이긴 하지만... 뭐 어떻게든 되겠지.

일단 내가 원하는 건 타겟 브랜치에 푸시 혹은 pr 이 될 경우 자동으로 API 서버에 배포되고 API 서버가 재시작하는 그림이고, 이걸 GitHub Actions 를 사용해서 구현하고자 한다.

사전에 GitHub 레파지토리를 생성하고 테스트를 위한 App.js 를 미리 푸시해두었다. (https://github.com/crazydj2/blog-backend)

import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';

const app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.get('/', (req, res) => {
    console.log('access......');
    res.end('Test......');
});


// // [RUN SERVER]
const port = process.env.PORT || 8080;
const server = app.listen(port, () => {
 console.log("Express server has started on port " + port)
});

// // CONNECT TO MONGODB SERVER
const db = mongoose.connection;
db.on('error', console.error);
db.once('open', function(){
    // CONNECTED TO MONGODB SERVER
    console.log("Connected to mongod server");
});

mongoose.connect('mongodb://localhost/test');

console.log('start......');

GitHub Actions

실제로 GitHub Actions 를 적용하기 전에, 내가 참조한 링크를 보는 게 더 도움이 될 것이다.
여기가 더 정리가 잘되어 있다;;;;;

self-hosted runner 설치

runner 란?

Github Actions 를 실제로 돌리는 프로그램으로 하나의 Runner 당 하나의 Workflow를 수행할 수 있으며, Github 이 호스팅하는 Github-hosted Runner 와 직접 호스팅하는 self-hoted Runner로 두 가지 종류가 있다. (https://hyperconnect.github.io/2021/11/08/github-actions-for-everyone-1.html)

난 내 서버에서 돌려야 하니까 self-hosted runner 를 설치해야겠지?

먼저 GitHub 레포 -> Settings -> Actions -> Runners 화면으로 들어가 "New self-hosted runner" 버튼을 클릭해보자

이 버튼을 누르면 개발 환경에 맞게 Runner 를 설치할 수 있는 명령어들을 안내해준다.

난 리눅스니까 리눅스를 클릭하고 가이드대로 명령어를 실행해봤다.

먼저 다운로드 명령어부터...

# Create a folder
$ mkdir actions-runner && cd actions-runner
# Download the latest runner package
$ curl -o actions-runner-linux-x64-2.288.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.288.1/actions-runner-linux-x64-2.288.1.tar.gz
# Optional: Validate the hash
$ echo "325b89bdc1c67264ec6f4515afda4534f14a6477d9ba241da19c43f9bed2f5a6  actions-runner-linux-x64-2.288.1.tar.gz" | shasum -a 256 -c
# Extract the installer
$ tar xzf ./actions-runner-linux-x64-2.288.1.tar.gz

난 리눅스에 shasum 이 안깔려있어서 추가로 설치하고 진행했었음... (yum install perl-Digest-SHA -y)

마지막 명령어까지 다 입력하고 정상적으로 실행되었으면 아래와 같이 나온다.

이제 runner 환경설정 차례다.

뭐 똑같이 가이드한 명령어치면 된다. (명령어 내용을 보니 토큰을 가지고 GitHub 이랑 짝짜쿵하는듯)

# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/crazydj2/blog-backend --token ANUWPMEC45YHYTHQHVANN3LCGAO4A
# Last step, run it!
$ ./run.sh

다시 GitHub 레포 -> Settings -> Actions -> Runners 화면으로 들어가보면 방금 생성한 runner 가 추가되어 있는 것을 확인할 수 있다.

이제 YAML 파일을 작성해서 워크플로우를 정의하면 될듯하다.

YAML 파일 작성 (워크플로우 정의)

먼저 .github/workflows 에 YAML 파일을 작성한다. (파일명은 상관없을듯?)

뭐 여러가지 시행착오를 겪었지만... 일단은 아래와 같이 작성해서 실행되는 것 확인했다.

name: api-server-deploy
on: 
  push:
    branches: [ master ]
jobs:
  api-server-deploy:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v2

      - name: remove
        run: rm -rf /home/opc/api-server/*

      - name: cp
        run: cp -r ./* /home/opc/api-server/

      - name: yarn install
        run: yarn install
        working-directory: /home/opc/api-server/
  • name: api-server-deploy
    • 워크플로우 이름
  • on: ...
    • 타겟 이벤트 & 브랜치 정의
  • jobs: ...
    • 여러개의 job 들 (실제로 수행해야할 태스크라고 이해) 에 대한 리스트 컨테이너 (참고로 job 하나당 러너 하나랑 매칭되어야 함)
  • api-server-deploy:
    • 하나의 job 의 이름
  • runs-on: self-hosted
    • 해당 job 에서 사용할 러너명
  • steps:
    • 실제 실행되는 동작들
    • uses: actions/checkout@v2
      • 레포 checkout
    • name: remove
      • 기존 api 코드 remove
    • name: cp
      • 새로 가져온 코드 복사
    • name: yarn install
      • module 인스톨 (기존 파일들을 다 날렸기 때문에)
      • working-directory 는 현재 명령어를 실행할 위치 (디렉토리) 를 지정하는 옵션
    • 추후 서버 재실행하는 코드 넣어야함 (pm2 쓰면 된다함)

GitHub 내에서 나의 워크플로우 리스트, 러너 실행 내역들을 볼 수 있으며, 에러 내용도 나오니까 뭔가 잘 안되면 여기서 확인해보면 될듯.

0개의 댓글