-
Notifications
You must be signed in to change notification settings - Fork 0
136 lines (114 loc) · 4.68 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
name: build
snippets:
step-set-common-vars: &step-set-common-vars
name: Set common variables
id: commonVars
run: |
commit_id_8=${GITHUB_SHA::8}
echo commit_id_8=$commit_id_8 >> $GITHUB_OUTPUT
echo repo_link=https://github.com/${{ github.repository }} >> $GITHUB_OUTPUT
step-set-project-vars: &step-set-project-vars
name: Set project variables
id: projectVars
run: |
tmp=${{ github.job }}
proj=${tmp#docker-}
echo proj=$proj >> $GITHUB_OUTPUT
docker_image=daotl/web-monorepo-starter-${proj}
echo docker_image=$docker_image >> $GITHUB_OUTPUT
echo commit_id_image=$docker_image:commit-${{ steps.commonVars.outputs.commid_id_8 }}
if [[ ${{ needs.build.outputs.affectedProjs }} =~ (^|,)${proj}($|,) ]]; then
affected = true
else
affected =
fi
echo affected=$affected >> $GITHUB_OUTPUT
step-docker-setup-buildx: &step-docker-setup-buildx
uses: docker/setup-buildx-action@v3
if: steps.projectVars.affected == 'true' && github.ref == 'refs/heads/main' && github.event_name == 'push'
step-docker-login: &step-docker-login
uses: docker/login-action@v3
if: steps.projectVars.affected == 'true' && github.ref == 'refs/heads/main' && github.event_name == 'push'
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
step-docker-build-push: &step-docker-build-push
uses: docker/build-push-action@v5
if: steps.projectVars.affected == 'true' && github.ref == 'refs/heads/main' && github.event_name == 'push'
with:
context: apps/${{ github.job }}
file: apps/${{github.job}}/docker/Dockerfile.ci
push: true
tags: ${{ steps.projectVars.outputs.docker_image }}:commit-${{ steps.commonVars.outputs.commit_id_8 }},${{ steps.projectVars.outputs.docker_image }}:${{ github.ref_name }},${{ steps.projectVars.outputs.docker_image }}:latest
# cache-from: type=registry,ref=${{ steps.projectVars.outputs.docker_image }}:buildcache-${{ github.ref_name }}
# cache-to: type=registry,ref=${{ steps.projectVars.outputs.docker_image }}:buildcache-${{ github.ref_name }},mode=max
job-docker: &job-docker
needs: [build]
runs-on: ubuntu-latest
env:
RUNNER_TOOL_CACHE: /toolcache
steps:
- *step-set-common-vars
- *step-set-project-vars
- *step-docker-setup-buildx
- *step-docker-login
- *step-docker-build-push
on:
push:
branches: [main, single-page, feat/*, fix/*, chore/*, debug/*]
pull_request:
branches: [main]
workflow_dispatch: {}
jobs:
build:
runs-on: ubuntu-latest
outputs:
affectedProjs: ${{ steps.affected.outputs.apps }}
# Workaround for tools (e.g., Node.js) not cached:
# https://gitea.com/gitea/act_runner/issues/70#issuecomment-734824
env:
RUNNER_TOOL_CACHE: /toolcache
strategy:
matrix:
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
node-version: [18.x, 20.x]
steps:
- *step-set-common-vars
# Needs to come first, `actions/setup-node` uses `pnpm-lock.yaml`
- uses: actions/checkout@v3
with:
# TO IMPROVE: We need to fetch all branches and commits so that Nx affected has a base to compare against.
fetch-depth: 0
- name: Derive appropriate SHAs for base and head for `nx affected` commands
id: setSHAs
uses: nrwl/nx-set-shas@v4
# - run: |
# echo "BASE: ${{ env.NX_BASE }}" or ${{ steps.setSHAs.outputs.base }}"
# echo "HEAD: ${{ env.NX_HEAD }}" or ${{ steps.setSHAs.outputs.head }}"
- uses: pnpm/action-setup@v2
with:
version: 8
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: pnpm
- name: install zx,@traf/nx @traf/nx
run: pnpm add -g zx
- name: Calculate affected projects
id: affected
run: |
projs=$(npx @traf/nx affected --base=${NX_BASE} --json=true)
projs=${projs#[}
projs=${projs%]}
projs=$(echo ${projs} | sed -e 's/\"//g')
echo Affected projects: ${projs}
echo projs=${projs} >> $GITHUB_OUTPUT
- name: pnpm install
# Fix: `pnpm install --filter` installing dependencies of all projects
# https://github.com/pnpm/pnpm/issues/6300#issuecomment-1722120409
run: CYPRESS_INSTALL_BINARY=0 ./scripts/pnpm-install-filtered.js --frozen-lockfile=true ${{ steps.affected.outputs.projs }}
- name: build & lint
run: pnpm nx affected -t build lint
docker-web: *job-docker
docker-desktop: *job-docker