forked from belgattitude/nextjs-monorepo-example
-
Notifications
You must be signed in to change notification settings - Fork 0
164 lines (143 loc) · 5.47 KB
/
ci-e2e-nextjs-app.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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
name: CI-e2e-nextjs-app
on:
push:
branches:
- dev
- main
# Only consider those paths to trigger the action
paths:
- 'apps/nextjs-app/**'
- 'packages/**'
- '.yarnrc.yml'
- '.github/workflows/**'
pull_request:
types:
- opened
- synchronize
- reopened
# Only consider those paths to trigger the action
paths:
- 'apps/nextjs-app/**'
- 'packages/**'
- '.yarnrc.yml'
- '.github/workflows/**'
jobs:
e2e:
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
node-version:
- 16
database:
- e2e-postgres
os:
- ubuntu-latest
include:
- os: ubuntu-latest
playwright_binary_path: ~/.cache/ms-playwright
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
# Why not using setup-node 2.2+ cache option (yet) ?
# see https://github.com/belgattitude/nextjs-monorepo-example/pull/369
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn config get cacheFolder)"
- name: Restore yarn cache
uses: actions/cache@v3
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: yarn-cache-folder-${{ hashFiles('**/yarn.lock', '.yarnrc.yml') }}
restore-keys: |
yarn-cache-folder-
# see https://github.com/vercel/next.js/pull/27362
- name: Restore nextjs build nextjs-app from cache
uses: actions/cache@v3
with:
path: |
${{ github.workspace }}/apps/nextjs-app/.next/cache
${{ github.workspace }}/.cache
${{ github.workspace }}/**/tsconfig.tsbuildinfo
key: ${{ runner.os }}-nextjs-app-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('apps/nextjs-app/src/**.[jt]sx?', 'apps/nextjs-app/src/**.json') }}
restore-keys: |
${{ runner.os }}-nextjs-app-${{ hashFiles('**/yarn.lock') }}-
- name: Start database
working-directory: packages/db-main-prisma
run: docker-compose -f docker-compose.e2e.yml up --detach ${{ matrix.database }}
- name: Install dependencies
run: |
yarn install --immutable --inline-builds
env:
PRISMA_SKIP_POSTINSTALL_GENERATE: true
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
HUSKY: 0
- name: Create and seed test database
working-directory: packages/db-main-prisma
run: |
yarn prisma db push
yarn prisma db seed
env:
PRISMA_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/webapp-e2e?schema=public
- name: Build nextjs-app
working-directory: apps/nextjs-app
run: |
yarn build
env:
PRISMA_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/webapp-e2e?schema=public
# Don't need to lint / typecheck for e2e, they're done in another workflow
NEXTJS_IGNORE_ESLINT: true
NEXTJS_IGNORE_TYPECHECK: true
NEXT_DISABLE_SOURCEMAPS: true
NEXT_TELEMETRY_DISABLED: true
NEXTJS_SENTRY_UPLOAD_DRY_RUN: true
# Keep cached playwright binaries to required version
# https://playwright.dev/docs/ci#caching-browsers
- name: Get current Playwright version
id: playwright-version
shell: bash
run: |
playwright_version=$(npm info @playwright/test version)
echo "::set-output name=version::${playwright_version}"
- name: Get playwright cache-key
id: playwright-cache-key
run: |
playwright_cache_key="${{ runner.os }}-playwright-cache-${{ steps.playwright-version.outputs.version }}-1"
echo "::set-output name=key::${playwright_cache_key}"
- name: Cache Playwright binaries
uses: actions/cache@v3
id: playwright-cache
with:
path: ${{ matrix.playwright_binary_path }}
key: ${{ steps.playwright-cache-key.outputs.key }}
- name: Playwright debug
shell: bash
run: |
echo "OS: ${{ matrix.os }}"
echo "Playwright version: ${{ steps.playwright-version.outputs.version }}"
echo "Playwright install dir: ${{ matrix.playwright_binary_path }}"
echo "Cache key: ${{ steps.playwright-cache-key.outputs.key }}"
echo "Cache hit: ${{ steps.playwright-cache.outputs.cache-hit == 'true' }}"
- name: Install Playwright OS Deps
run: yarn playwright install-deps
- name: Install Playwright Browsers
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: yarn playwright install chromium webkit
- name: E2E run nextjs-app playwright tests
working-directory: apps/nextjs-app
run: |
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test-e2e
env:
E2E_WEBSERVER_MODE: BUILD_AND_START
CI: 1
PRISMA_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/webapp-e2e?schema=public
- uses: actions/upload-artifact@v3
if: always()
with:
name: nextjs-app-playwright-test-results-${{ runner.os }}
path: apps/nextjs-app/e2e/.out