-
Notifications
You must be signed in to change notification settings - Fork 1
130 lines (124 loc) · 4.64 KB
/
build.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
name: Build and Test
on:
pull_request:
branches:
- main
push:
branches:
- main
jobs:
service-matrix:
runs-on: ubuntu-latest
outputs:
changes: ${{ steps.determine-matrix.outputs.changes }}
# IF you add a new filter it ALSO needs to be here
services: >-
["account", "content-publishing", "content-watcher", "graph"]
# Resolves to true if it should run everything, aka when common files change
run-all: ${{ steps.determine-matrix.outputs.changes.common }}
steps:
- name: Check Out Repo
uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: determine-matrix
with:
# Adding a filter? Check for the need to add to the outputs as well
filters: |
common:
- 'Docker/**'
- '.github/**'
- 'docker-compose.yaml'
- 'libs/types'
- 'libs/utils'
- 'libs/consumer'
account:
- 'apps/account-api/**'
- 'apps/account-worker/**'
- 'libs/account-lib/**'
graph:
- 'apps/graph-api/**'
- 'apps/graph-worker/**'
- 'libs/graph-lib/**'
content-publishing:
- 'apps/content-publishing-api/**'
- 'apps/content-publishing-worker/**'
- 'libs/content-publishing-lib/**'
- 'libs/storage/**'
content-watcher:
- 'apps/content-watcher/**'
- 'libs/content-watcher-lib/**'
- 'libs/storage/**'
build:
name: '[${{ matrix.service }}] Build and Test'
runs-on: ubuntu-latest
needs: service-matrix
strategy:
fail-fast: false
matrix:
service: ${{ fromJson(needs.service-matrix.outputs.services) }}
# NOTE: The if statement has to be on each step. :(
# This is because the job level if statement cannot handle matrix values
steps:
- name: Run or Skip
id: should
run: echo "RUN=${{ needs.service-matrix.outputs.run-all || contains(fromJson(needs.service-matrix.outputs.changes), matrix.service) }}" >> "$GITHUB_OUTPUT"
- name: Checkout
if: ${{ steps.should.outputs.RUN == 'true' }}
uses: actions/checkout@v4
- name: Install Node.js
if: ${{ steps.should.outputs.RUN == 'true' }}
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
registry-url: 'https://registry.npmjs.org'
cache-dependency-path: ./package-lock.json
- name: Install dependencies
if: ${{ steps.should.outputs.RUN == 'true' }}
run: npm ci
- name: Build NestJS
if: ${{ steps.should.outputs.RUN == 'true' }}
run: npm run build:${{ matrix.service }}
- name: Lint
if: ${{ steps.should.outputs.RUN == 'true' }}
run: npm run lint:${{ matrix.service }}
- name: Unit Test
if: ${{ steps.should.outputs.RUN == 'true' }}
run: npm run test:${{ matrix.service }}
- name: License Check
if: ${{ steps.should.outputs.RUN == 'true' }}
# List all the licenses and error out if it is not one of the supported licenses
run: npx license-report --fields=name --fields=licenseType | jq 'map(select(.licenseType | IN("MIT", "Apache-2.0", "ISC", "BSD-3-Clause", "BSD-2-Clause", "(Apache-2.0 AND MIT)", "Apache-2.0 OR MIT") | not)) | if length == 0 then halt else halt_error(1) end'
- name: Build OpenAPI spec
if: ${{ steps.should.outputs.RUN == 'true' }}
uses: ./.github/workflows/common/openapi-build
with:
service: ${{ matrix.service }}
# Test build of the Docker images
- name: Set up QEMU
if: ${{ steps.should.outputs.RUN == 'true' }}
uses: docker/setup-qemu-action@v3
with:
platforms: |
linux/amd64
- name: Set up Docker Buildx
if: ${{ steps.should.outputs.RUN == 'true' }}
uses: docker/setup-buildx-action@v3
# Use GitHub Container Registry instead due to rate limits
with:
buildkitd-config-inline: |
[registry."ghcr.io"]
- name: Login to DockerHub
if: ${{ steps.should.outputs.RUN == 'true' }}
uses: docker/login-action@v3
with:
username: ${{secrets.DOCKERHUB_USERNAME}}
password: ${{secrets.DOCKERHUB_TOKEN}}
- name: Build Docker Image
if: ${{ steps.should.outputs.RUN == 'true' }}
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64
push: false
file: Docker/Dockerfile.${{ matrix.service }}