Chore/update workflows (#22) #56
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Boombim(Back-End) - Build and Deploy | |
on: | |
push: | |
tags: | |
- v[0-9]+.[0-9]+.[0-9]+ | |
- v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+ | |
# GitHub Actions탭에서 수동실행 가능하도록 설정 | |
workflow_dispatch: | |
# 동시성 설정: 같은 그룹의 배포가 여러개 실행되면 가장 마지막에 실행된 배포외에는 취소 시킨다. | |
## [참고](https://docs.github.com/ko/actions/using-workflows/workflow-syntax-for-github-actions#example-using-concurrency-to-cancel-any-in-progress-job-or-run) | |
concurrency: | |
group: ${{ github.ref }} | |
cancel-in-progress: true | |
# 환경변수 설정 | |
env: | |
VERSION: ${{ github.sha }} | |
jobs: | |
build: | |
name: Build | |
runs-on: ubuntu-22.04 #self-hosted 동일한 os 사용 | |
strategy: | |
matrix: | |
node-version: [v18.14.2] | |
steps: | |
# 1. 워크플로를 수행하기 위해 해당 브랜치로 checkout | |
- name: Checkout actions Repository | |
uses: actions/checkout@v2 | |
# 2. node 버전 설정 | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
# 3. node_modules 캐시 설정 | |
# docs: https://github.com/actions/cache | |
# outputs.cache-hit: 캐시가 존재하면 true, 존재하지 않으면 false | |
- name: Cache node_modules | |
id: cache | |
uses: actions/cache@v3 | |
with: | |
# cache의 대상을 정한다. | |
path: '**/node_modules' | |
# 무효화의 기준이 되는 cache의 key를 정한다. | |
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} | |
# key가 깨졌을때 복구하는 방법 명시, "${{ runner.os }}-node-" 와 일치하는 캐시를 가져와 사용한다. | |
restore-keys: ${{ runner.os }}-node- | |
# 일치하는 캐시가 없다면 의존성 설치 | |
- name: Install Dependencies | |
if: steps.cache.outputs.cache-hit != 'true' | |
run: npm ci | |
- name: Run Build App | |
run: npm run build | |
# 배포 Job | |
deploy: | |
needs: build | |
name: Deploy | |
# self-hosted: 물리서버에 설치된 자체 러너에서 작업 수행 | |
runs-on: [self-hosted] | |
timeout-minutes: 10 # 10분 | |
strategy: | |
matrix: | |
node-version: [v18.14.2] | |
steps: | |
- name: Checkout actions Repository | |
uses: actions/checkout@v2 | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: Cache node_modules | |
id: cache | |
uses: actions/cache@v3 | |
with: | |
path: '**/node_modules' | |
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: ${{ runner.os }}-node- | |
- name: Install Dependencies | |
if: steps.cache.outputs.cache-hit != 'true' | |
run: npm ci | |
# Note: (v0.0.1-beta.3) ec2 사양(t2.micro) 이슈로, 기존 node app을 kill하고 빌드가 수행되도록 순서 변경 | |
- name: Stop old server (ignore error) | |
run: | | |
killall -9 node || true | |
- name: Run Build App | |
run: npm run build | |
- name: Remove old server in ~/boombim (ignore error) | |
run: | | |
rm -rf ~/boombim || true | |
- name: Copy new server to ~/boombim | |
run: | | |
mkdir -p ~/boombim | |
cp -R ./ ~/boombim | |
# 용량을 줄이기 위해 원본 소스는 제거한다. | |
- name: Remove github.workspace (working directory) | |
## deploy.yaml은 없으면 안되기 때문에 지우지 않는다. | |
run: | | |
cd .. | |
cp -r ${{ github.workspace }}/.github/workflows/deploy.yaml ./deploy.yaml | |
rm -rf ${{ github.workspace }} || true | |
mkdir -p ${{ github.workspace }}/.github/workflows | |
cp ./deploy.yaml ${{ github.workspace }}/.github/workflows/deploy.yaml | |
# 백그라운드 실행 설정(데몬 실행 x) | |
- name: Setting ENV and Run app | |
env: | |
# 고아프로세스를 죽이지 않는 설정이다.(보안상 위험하기 때문에 꼭 필요한 경우에만 사용한다.) | |
## [참고](https://www.praetorian.com/blog/self-hosted-github-runners-are-backdoors/) | |
RUNNER_TRACKING_ID: 0 # or '' | |
run: | | |
cd ~/boombim | |
PRODUCTION_ENV=${{ secrets.PRODUCTION_ENV }} | |
echo $PRODUCTION_ENV | base64 --decode > .env | |
export $(grep -E "^[^#]+=" .env) && rm .env | |
# 로그 임시로 ~/boombim 폴더에 저장 | |
#nohup node dist/src/main.js >> ~/boombim/app.log 2>&1 & echo $! > node_pid | |
nohup node dist/src/main.js >> /dev/null 2>&1 & echo $! > node_pid | |
disown $(cat node_pid) |