-
Notifications
You must be signed in to change notification settings - Fork 4
149 lines (127 loc) · 5.1 KB
/
ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
name: CI
on:
pull_request:
types: [opened, reopened, synchronize]
branches: ["develop","main"]
jobs:
Lint:
name: check-lint
runs-on: ubuntu-latest
env:
# 슬랙 알림을 위한 슬랙웹훅 URL - https://github.com/integrations/slack
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
# pnpm 설치 및 의존성 설치
# 이때, frozen-lockfile 옵션을 사용하여 lockfile을 사용하도록 설정
# npm을 사용할 때 "npm ci"와 같은 효과
- name: Install dependencies
run: |
npm install -g pnpm
pnpm install --frozen-lockfile
# lint 실행
- name: Run lint
run: pnpm lint
# # lint 에러 발생 시 결과를 슬랙으로 전송
# - name: Notify Slack if error exists
# if: ${{ failure() }}
# uses: act10ns/slack@v1
# with:
# status: ${{ job.status }}
# steps: ${{ toJson(steps) }}
# channel: '#ci'
# lint 에러 발생 시 깃헙액션 인스턴스를 종료
- name: Block merge if error exists
if: ${{ failure() }}
run: |
echo "Lint error found!!"
echo "Please fix them before merging."
exit 1
Test:
name: check-test
# Test는 Lint를 통과한 이후에만 실행이 되도록 의존성 설정
needs: Lint
permissions: write-all
runs-on: ubuntu-latest
# 테스트는 앞선 lint 검사와 다르게 서버를 실제로 실행시키므로,
# 필요한 환경변수를 잘 체크해서 포함시키기
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
DATABASE_URL: ${{ secrets.DEV_DATABASE_URL }}
API_VERSION: ${{ secrets.API_VERSION }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
JWT_EXPIRES_IN: ${{ secrets.JWT_EXPIRES_IN }}
MIN_COOKING_TIME: ${{ secrets.MIN_COOKING_TIME }}
MAX_COOKING_TIME: ${{ secrets.MAX_COOKING_TIME }}
BUSINESS_NUMBER_CHECK_API_KEY: ${{ secrets.BUSINESS_NUMBER_CHECK_API_KEY }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY}}
AWS_REGION: ${{ secrets.AWS_REGION }}
AWS_CLOUDWATCH_LOG_GROUP_NAME: ${{ secrets.AWS_CLOUDWATCH_LOG_GROUP_NAME }}
AWS_CLOUDWATCH_LOG_STREAM_NAME: ${{ secrets.AWS_CLOUDWATCH_LOG_STREAM_NAME }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
# docker-compose를 사용하여 테스트에 필요한 데이터베이스를 구성
# Github Action 인스턴스에는 docker가 기본적으로 설치되어 있기 때문에 별도 설치 불필요
- name: Setup datatabase with docker compose
run: |
docker-compose up -d
# pnpm 설치 및 의존성 설치
# frozen-lockfile 옵션을 사용하여 lockfile을 사용하도록 설정
# prisma client를 생성 및 마이그레이션
- name: Install dependencies
run: |
npm install -g pnpm
pnpm install --frozen-lockfile
npx prisma generate
npx prisma migrate deploy
# 테스트 실행 및 결과를 reports/jest-junit.xml에 저장
- name: Run test
run: pnpm test:report
# github action에 테스트 결과를 표시
- name: Test Report
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: JEST Tests
path: reports/jest-junit.xml
reporter: jest-junit
# # 테스트 결과를 슬랙으로 전송
# - name: Notify slack if fails
# if: ${{ failure() }}
# uses: act10ns/slack@v1
# with:
# status: ${{ job.status }}
# steps: ${{ toJson(steps) }}
# channel: '#ci'
Analysis:
name: Static Analysis
# Lint와 Test가 모두 통과한 이후에만 실행되도록 의존성 설정
needs: [Lint, Test]
runs-on: ubuntu-latest
steps:
- name: Analyze with SonarCloud
uses: SonarSource/sonarcloud-github-action@de2e56b42aa84d0b1c5b622644ac17e505c9a049
env:
GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }}
# 토큰 발행 : SonarCloud -> Account -> Security -> generate 토큰
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
args:
# SonarCloud -> 프로젝트 -> information 탭에서 복사
-Dsonar.projectKey=tdd-delivery_tdd-delivery
-Dsonar.organization=tdd-delivery
# SonarCloud에서 Slack으로 알림 보내기
# SonarCloud webhook 페이로드와 Slack에서 수용 하는 데이터 형식이 달라서, 데이터 변환을 위해 서버리스 함수를 사용했습니다.
# SonarCloud -> 프로젝트 -> Administration -> webhook -> create 버튼 클릭
# AWS API Gateway와 Lambda를 이용해서 webhook URL에 엔드포인트를 추가.