DevOps 환경에서 효율적인 소프트웨어 개발 및 배포를 위해 CI/CD(지속적 통합/지속적 배포) 파이프라인을 구축하는 것은 필수적입니다. 이번 포스트에서는 GitHub Actions를 활용하여 간단한 CI/CD 파이프라인을 구축하는 미니 프로젝트를 진행해보겠습니다.

GitHub Actions란?

GitHub Actions는 GitHub 저장소에서 자동화된 작업을 수행할 수 있게 해주는 기능입니다. 이를 통해 코드 변경 사항이 발생할 때마다 자동으로 테스트를 실행하고, 빌드 및 배포를 수행하는 등의 작업을 쉽게 설정할 수 있습니다.

미니 프로젝트 개요

이번 프로젝트에서는 간단한 Node.js 애플리케이션을 만들고, GitHub Actions를 사용하여 테스트 및 배포하는 CI/CD 파이프라인을 구축할 것입니다. 애플리케이션은 간단한 API 서버로, HTTP GET 요청을 처리하여 "Hello, World!" 메시지를 반환합니다.

1. Node.js 애플리케이션 생성

먼저, Node.js 애플리케이션을 생성해봅시다. 다음 명령어를 사용하여 새로운 디렉토리를 만들고, Node.js 프로젝트를 초기화합니다.

mkdir my-node-app
cd my-node-app
npm init -y

이제 index.js 파일을 생성하고 기본적인 HTTP 서버를 작성합니다.

// index.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, World!\n');
});

server.listen(port, hostname, () => {
  console.log(Server running at http://${hostname}:${port}/);
});

2. GitHub 저장소 생성 및 코드 푸시

GitHub에 새로운 저장소를 생성하고, 로컬 프로젝트를 푸시합니다. 다음 명령어를 사용하여 Git 초기화 및 원격 저장소 추가 후 푸시합니다.

git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/USERNAME/my-node-app.git
git push -u origin master

3. GitHub Actions 설정

이제 CI/CD 파이프라인을 설정해 보겠습니다. .github/workflows 디렉토리를 생성하고, 그 안에 ci.yml 파일을 생성합니다.

mkdir -p .github/workflows
touch .github/workflows/ci.yml

이제 ci.yml 파일을 열고 다음과 같이 설정합니다.

name: CI

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest

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

    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'

    - name: Install dependencies
      run: npm install

    - name: Run tests
      run: npm test

4. 테스트 스크립트 추가

package.json 파일을 수정하여 테스트 스크립트를 추가합니다. 예를 들어, jest를 사용하여 간단한 테스트를 추가할 수 있습니다.
npm install --save-dev jest
package.json에 다음과 같이 테스트 스크립트를 추가합니다.
"scripts": {
  "test": "jest"
}

테스트 파일을 __tests__/app.test.js에 추가합니다.

// __tests__/app.test.js
const http = require('http');

test('Server responds with Hello, World!', (done) => {
  http.get('http://localhost:3000', (res) => {
    let data = '';
  
    res.on('data', (chunk) => {
      data += chunk;
    });
  
    res.on('end', () => {
      expect(data).toBe('Hello, World!\n');
      done();
    });
  });
});

5. GitHub Actions 실행 확인

모든 설정이 완료되었습니다. 이제 master 브랜치에 푸시하면 GitHub Actions가 자동으로 실행됩니다. GitHub 저장소의 Actions 탭에서 실행 로그를 확인할 수 있습니다.

마무리

GitHub Actions를 사용한 CI/CD 파이프라인 구축을 통해 코드 변경 사항이 있을 때마다 자동으로 테스트를 실행하고, 빌드를 수행하는 과정을 간편하게 설정할 수 있었습니다. 이번 미니 프로젝트를 통해 GitHub Actions의 기본적인 이해와 활용 방법을 익히셨길 바랍니다. 이러한 CI/CD 프로세스를 채택하면 코드 품질을 향상시키고, 배포 과정을 간소화할 수 있습니다. 앞으로도 DevOps 환경에서 더 많은 자동화 및 효율성을 구현해 보시길 바랍니다.