CI/CD
서비스를 개발한 후 사용자에게 전달하기 위해서는 배포를 진행해야 합니다. 물리적인 서버를 구성해서 서비스를 배포하는 것 보다 AWS에서 제공하는 IaaS를 이용해 on demand 형식으로 서버를 구성하면 합리적인 가격으로 서비스를 운영할 수 있습니다.
한 걸음 더 나아가 CI/CD는 Continuous Integration / Continuous Deploy의 약자로 github과 같은 형상관리자에서 수정사항을 push 하면 이것을 트리거로 잡아서 원격 서버에 자동으로 배포까지 진행해주는 서비스입니다. 간단하게 수정사항만 신경쓰면 되고, 이후 작업은 알아서 해주니 편리하지 않을 수 없습니다.
CI의 경우 빌드와 테스트처리를 자동으로 할 수 있습니다. 배포하기 전 정상적으로 테스트를 통과하는지, 그리고 프로덕션 버전으로 배포판을 작성할 수 있어야 합니다.
CD의 경우 원격 서버 혹은 S3 버킷과 같은 정적 웹 사이트 배포가 가능하도록 합니다.
이번 시리즈에서 구성하는 기술 스택은 다음과 같습니다.
CVS : Github
CI/CD : Github Actions
Server : AWS
Program : Node.js(express server)
Image : Docker
배포 아키텍처
전체적인 배포 구성을 보면 아래 그림과 같습니다. Node.js에서 작성한 서버 프로그램은 Dockerfile로 형상화를 한 후 AWS EC2로 배포를 진행합니다.
기존의 경우 로컬에서 작업한 서버 프로그램(Express)를 테스트 돌리고 도커파일로 이미지화 한 후 github에 push하고, AWS EC2로 원격접속해서 이미지를 다운 받고 컨테이너를 만들어서 돌려야 합니다. 이 과정을 github actions으로 자동화하는 것이 CI/CD입니다.
Step1 : Express 서버 프로그램 작성
Terminal에서 새로운 Node.js 프로젝트를 실행합니다.
$ npm init -y
Express를 설치합니다. 배포를 위한 간단한 서버 프로그램을 작성해 볼 예정이므로, 추가적으로 설치가 없다고 해서 실망할 필요는 없습니다. 추가로 환경변수 설정을 위해 dotenv를 설치합니다.
$ npm install express dotenv
엔트리 포인트가 되는 app.js 파일을 생성합니다.
$ touch app.js
app.js에서 간단한 서버 프로그램을 작성합니다.
const express = require('express')
const app = express();
const dotenv = require('dotenv')
dotenv.config()
app.get("/", (req, res)=>{
res.status(200).json("hello server! / This is deployed by Github Actions")
})
app.listen(process.env.PORT, ()=>{
console.log(`server is on ${process.env.PORT}`)
})
환경 변수를 생성해줍니다.
$ touch .env
환경 변수에 PORT번호를 입력합니다.
PORT = 9901
여기까지 디렉토리 구조는 다음과 같습니다.
.
├── app.js
├── .env
├── node_modules
├── package.json
└── package-lock.json
서버 실행을 위해 package.json 파일을 수정해줍니다.
"scripts": {
"start": "node app",
"test": "echo \"Error: no test specified\" && exit 1"
},
서버를 실행합니다.
$ npm run start
이제 localhost:9901로 접속하면 서버가 우리를 반겨주기 시작합니다.
이제 배포를 위한 서버 프로그램이 완성되었습니다. 다음 포스팅에서는 Dockerfile 작성과 AWS EC2 인스턴스 생성을 알아보도록 하겠습니다.
🚀️ 도움이 되셨다면 구독과 좋아요 부탁드립니다 👍️
'Programming' 카테고리의 다른 글
CI/CD #3 배포 구성하기 Github Actions (0) | 2022.12.29 |
---|---|
CI/CD #2 배포 구성하기 Dockerfile (0) | 2022.12.29 |
React build blank 페이지 뜰 때 해결법 (0) | 2022.12.27 |
ios 앱 개발 공부 순서 (0) | 2022.12.23 |
[DEX PJ] #2 성공적인 프로젝트의 조건 (0) | 2022.11.01 |
댓글