Skip to content

Commit aa9d140

Browse files
FLS-1473: Dockerfile update and image build changes
1 parent 00c73e0 commit aa9d140

File tree

5 files changed

+142
-228
lines changed

5 files changed

+142
-228
lines changed

.github/workflows/copilot_deploy.yml

Lines changed: 36 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ jobs:
6969
steps:
7070
- name: Checkout repo
7171
uses: actions/checkout@v4
72+
with:
73+
submodules: recursive
74+
75+
- name: Remove submodule dockerignore / yarn.lock (if present)
76+
if: ${{ hashFiles('digital-form-builder/.dockerignore') != '' || hashFiles('digital-form-builder/yarn.lock') != '' }}
77+
run: |
78+
rm -f digital-form-builder/.dockerignore digital-form-builder/yarn.lock
7279
7380
- name: "Set version in env"
7481
id: set-version
@@ -95,68 +102,17 @@ jobs:
95102
username: ${{ github.actor }}
96103
password: ${{ secrets.GITHUB_TOKEN }}
97104

98-
- uses: actions/checkout@v4
99-
- name: Use Node.js
100-
uses: actions/setup-node@v3
101-
with:
102-
node-version: "20.x"
103-
104-
- name: Get yarn cache directory path
105-
id: yarn-cache-dir-path
106-
run: echo "::set-output name=dir::$(yarn config get cacheFolder)"
107-
108-
- name: Get into the directory
109-
id: change-dir
110-
run: yarn config set enableImmutableInstalls false
111-
112-
- name: Create .env for runner workspace
113-
run: |
114-
touch ./runner/.env
115-
echo LAST_TAG_GH=runner >> ./runner/.env
116-
echo LAST_COMMIT_GH=runner >> ./runner/.env
117-
cat ./runner/.env
118-
119-
- name: Run Unit test before docker build
120-
run: |
121-
echo "-- Git submodule initialize into local --"
122-
git submodule update --init
123-
echo "-- Pulling git submodules into local --"
124-
git pull --recurse-submodules
125-
echo "-- Installing digital-form-builder-adapter locally --"
126-
node update-package.js
127-
yarn install
128-
echo "-- Building digital-form-builder-adapter locally --"
129-
yarn setup
130-
echo "-- Building digital-form-builder locally --"
131-
# shellcheck disable=SC2164
132-
cd digital-form-builder
133-
yarn
134-
echo "-- Building digital-form-builder model locally --"
135-
yarn model build
136-
echo "-- Building digital-form-builder queue-model locally --"
137-
yarn queue-model build
138-
echo "-- Building digital-form-builder-adapter model locally --"
139-
cd ..
140-
yarn model build
141-
echo "-- Running unit tests --"
142-
yarn runner test-cov
143-
144105
- name: Set up Docker Buildx property
145106
run: echo "DOCKER_BUILDKIT=1" >> $GITHUB_ENV
146107

147-
- name: Cache Docker layers
148-
uses: actions/cache@v4
149-
with:
150-
path: ~/.buildx/cache
151-
key: ${{ runner.os }}-buildx-runner-${{ hashFiles('./runner/Dockerfile') }}-${{ hashFiles('./runner/package.json') }}
152-
restore-keys: |
153-
${{ runner.os }}-buildx-runner-${{ hashFiles('./runner/Dockerfile') }}-${{ hashFiles('./runner/package.json') }}
154-
155108
- name: Set up Docker Buildx
156109
uses: docker/setup-buildx-action@v3
157110
with:
158111
driver: docker-container
159112

113+
- name: Cache stats (Buildx)
114+
run: docker buildx du --verbose || true
115+
160116
- name: Build and push docker image
161117
uses: docker/build-push-action@v4
162118
with:
@@ -168,16 +124,22 @@ jobs:
168124
build-args: |
169125
INSTALL_NODEMON=false
170126
LAST_TAG='${{env.VERSION}}'
171-
LAST_COMMIT='${{ github.sha }}'
172-
cache-from: type=gha,scope=buildx
173-
cache-to: type=gha,mode=max,scope=buildx
127+
cache-from: type=gha,scope=runner
128+
cache-to: type=gha,mode=max,scope=runner
174129

175130
docker-designer-build:
176131
runs-on: ubuntu-latest
177132
needs: [ setup ]
178133
steps:
179134
- name: Checkout repo
180135
uses: actions/checkout@v4
136+
with:
137+
submodules: recursive
138+
139+
- name: Remove submodule dockerignore / yarn.lock (if present)
140+
if: ${{ hashFiles('digital-form-builder/.dockerignore') != '' || hashFiles('digital-form-builder/yarn.lock') != '' }}
141+
run: |
142+
rm -f digital-form-builder/.dockerignore digital-form-builder/yarn.lock
181143
182144
- name: "Set version in env"
183145
id: set-version
@@ -211,19 +173,14 @@ jobs:
211173
echo LAST_COMMIT_GH=designer >> ./designer/.env
212174
cat ./designer/.env
213175
214-
- name: Cache Docker layers
215-
uses: actions/cache@v4
216-
with:
217-
path: ~/.buildx/cache
218-
key: ${{ runner.os }}-buildx-runner-${{ hashFiles('./designer/Dockerfile') }}-${{ hashFiles('./designer/package.json') }}
219-
restore-keys: |
220-
${{ runner.os }}-buildx-designer-${{ hashFiles('./designer/Dockerfile') }}-${{ hashFiles('./designer/package.json') }}
221-
222176
- name: Set up Docker Buildx
223177
uses: docker/setup-buildx-action@v3
224178
with:
225179
driver: docker-container
226180

181+
- name: Cache stats (Buildx)
182+
run: docker buildx du --verbose || true
183+
227184
- name: Build and push docker image
228185
uses: docker/build-push-action@v4
229186
with:
@@ -234,9 +191,8 @@ jobs:
234191
file: ./designer/Dockerfile
235192
build-args: |
236193
LAST_TAG='${{env.VERSION}}'
237-
LAST_COMMIT='${{ github.sha }}'
238-
cache-from: type=gha,scope=buildx
239-
cache-to: type=gha,mode=max,scope=buildx
194+
cache-from: type=gha,scope=designer
195+
cache-to: type=gha,mode=max,scope=designer
240196

241197
e2e-test:
242198
needs: [ setup, docker-runner-build, docker-designer-build ]
@@ -252,14 +208,21 @@ jobs:
252208
hash: ${{ steps.hashFile.outputs.hash }}
253209
steps:
254210
- uses: actions/checkout@v4
211+
with:
212+
submodules: recursive
255213
- name: Use Node.js
256214
uses: actions/setup-node@v3
257215
with:
258216
node-version: "20.x"
259217

260-
- name: Get into the directory
261-
id: change-dir
262-
run: yarn config set enableImmutableInstalls false
218+
- name: Use Yarn 3.2.2 via Corepack
219+
run: |
220+
corepack enable
221+
corepack prepare [email protected] --activate
222+
yarn -v
223+
224+
- name: Ensure workspace-tools plugin
225+
run: yarn plugin import workspace-tools
263226

264227
- uses: actions/cache@v3
265228
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
@@ -274,18 +237,10 @@ jobs:
274237
275238
- name: Setup e2e dependencies
276239
run: |
277-
echo "-- Git submodule initialize into local --"
278-
git submodule update --init
279-
echo "-- Pulling git submodules into local --"
280-
git pull --recurse-submodules
281-
echo "-- Installing digital-form-builder-adapter locally --"
282-
node update-package.js
240+
echo "-- Installing dependencies --"
283241
yarn install
284242
echo "-- Install e2e dependencies --"
285243
yarn e2e-test install
286-
echo "-- Building digital-form-builder locally --"
287-
cd digital-form-builder
288-
yarn
289244
290245
- name: Injecting image into docker compose e2e
291246
run: |
@@ -469,7 +424,7 @@ jobs:
469424
app_name: forms
470425
environment: test
471426
notify_slack: true
472-
427+
473428
uat_deploy:
474429
needs: [ setup, docker-designer-build, docker-runner-build, dev_deploy, test_deploy, post_test_deploy_tests ]
475430
if: ${{ always() && contains(fromJSON(needs.setup.outputs.jobs_to_run), 'uat') && (! contains(needs.*.result, 'failure') ) && (! contains(needs.*.result, 'cancelled') ) }}

designer/.dockerignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
.git
2+
.gitmodules
3+
**/node_modules
4+
**/.next
5+
**/dist
6+
**/build
7+
**/coverage
8+
**/.DS_Store
9+
.yarn/cache
10+
.yarn/unplugged
11+
.yarn/build-state.yml
12+
.pnp.*

designer/Dockerfile

Lines changed: 40 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,89 @@
11
# ----------------------------
22
# Stage 1
3-
# Base image contains the node version and app user creation
4-
# It also configures the non-root user that will be given permission to copied files/folders in every subsequent stages
53
FROM node:20-alpine AS base-image
4+
5+
ARG INSTALL_NODEMON=false
6+
67
RUN mkdir -p /usr/src/app/digital-form-builder-adapter && \
78
addgroup -g 1001 appuser && \
89
adduser -S -u 1001 -G appuser appuser && \
910
chown -R appuser:appuser /usr/src/app/digital-form-builder-adapter && \
1011
chmod -R +x /usr/src/app/digital-form-builder-adapter && \
1112
apk update && \
1213
apk add --no-cache bash git
14+
RUN if [ "$INSTALL_NODEMON" = "true" ]; then \
15+
npm install -g nodemon --ignore-scripts; \
16+
fi
1317

1418

1519
# ----------------------------
1620
# Stage 2
17-
# Cache layer contains yarn configurations
18-
# It will re-run only if there is a yarn configuration change
19-
FROM base-image AS yarn-build
21+
FROM base-image AS build-configuration
2022
WORKDIR /usr/src/app/digital-form-builder-adapter
23+
USER appuser
24+
2125
COPY --chown=appuser:appuser ../.yarn .yarn
2226
COPY --chown=appuser:appuser ../.yarnrc.yml .yarnrc.yml
23-
USER 1001
24-
25-
26-
# ----------------------------
27-
# Stage 3
28-
# Cache layer contains digital-form-builder-adapter configurations
29-
# It will re-run only if there is a configuration change
30-
FROM yarn-build AS digital-form-builder-adapter-pre-build
31-
WORKDIR /usr/src/app/digital-form-builder-adapter
32-
USER 1001
33-
COPY --chown=appuser:appuser .git ./.git
34-
COPY --chown=appuser:appuser .gitmodules ./.gitmodules
35-
RUN git submodule update --init --recursive
3627
COPY --chown=appuser:appuser ../package.json package.json
3728
COPY --chown=appuser:appuser ../tsconfig.json tsconfig.json
38-
COPY --chown=appuser:appuser ../update-package.js update-package.js
3929
COPY --chown=appuser:appuser ../yarn.lock yarn.lock
4030
COPY --chown=appuser:appuser ../designer/package.json ./designer/package.json
4131
COPY --chown=appuser:appuser ../runner/package.json ./runner/package.json
4232
COPY --chown=appuser:appuser ../model/package.json ./model/package.json
33+
COPY --chown=appuser:appuser ../e2e-test/package.json ./e2e-test/package.json
4334

44-
45-
# ----------------------------
46-
# Stage 4
47-
# Cache layer contains digital-form-builder-adapter dependencies
48-
# It will re-run only if there is a dependency change
49-
FROM digital-form-builder-adapter-pre-build AS digital-form-builder-adapter-install
50-
WORKDIR /usr/src/app/digital-form-builder-adapter
51-
USER 1001
52-
RUN --mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-adapter-install \
53-
node update-package.js && yarn setup && yarn install
35+
COPY --chown=appuser:appuser ../digital-form-builder/designer/package.json ./digital-form-builder/designer/package.json
36+
COPY --chown=appuser:appuser ../digital-form-builder/model/package.json ./digital-form-builder/model/package.json
37+
COPY --chown=appuser:appuser ../digital-form-builder/e2e/package.json ./digital-form-builder/e2e/package.json
38+
COPY --chown=appuser:appuser ../digital-form-builder/queue-model/package.json ./digital-form-builder/queue-model/package.json
39+
COPY --chown=appuser:appuser ../digital-form-builder/runner/package.json ./digital-form-builder/runner/package.json
5440

5541

5642
# ----------------------------
57-
# Stage 5
58-
# Cache layer contains XGovFormBuilder with yarn build with dependencies
59-
# It will re-run only if there is a XGovFormBuilder change
60-
FROM digital-form-builder-adapter-install AS digital-form-builder-build
43+
# Stage 3
44+
FROM build-configuration AS dependency-install
6145
WORKDIR /usr/src/app/digital-form-builder-adapter
62-
USER 1001
63-
WORKDIR /usr/src/app/digital-form-builder-adapter/digital-form-builder
64-
RUN --mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-build \
65-
--mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-adapter-install \
66-
yarn && yarn model build && yarn queue-model build
46+
USER appuser
47+
RUN --mount=type=cache,target=/usr/src/app/digital-form-builder-adapter/.yarn/cache,uid=1001,mode=0755,id=yarn-cache \
48+
yarn install --immutable
6749

6850

6951
# ----------------------------
70-
# Stage 6
71-
# Cache layer contains model changes
72-
# It will re-run only if there is a model change
73-
FROM digital-form-builder-build AS digital-form-builder-adapter-model-pre-build
52+
# Stage 4
53+
FROM dependency-install AS parent-configuration
7454
WORKDIR /usr/src/app/digital-form-builder-adapter
75-
USER 1001
76-
COPY --chown=appuser:appuser ../model ./model
55+
USER appuser
56+
COPY --chown=appuser:appuser ../digital-form-builder/designer ./digital-form-builder/designer
57+
COPY --chown=appuser:appuser ../digital-form-builder/model ./digital-form-builder/model
58+
COPY --chown=appuser:appuser ../digital-form-builder/e2e ./digital-form-builder/e2e
59+
COPY --chown=appuser:appuser ../digital-form-builder/queue-model ./digital-form-builder/queue-model
60+
COPY --chown=appuser:appuser ../digital-form-builder/runner ./digital-form-builder/runner
61+
COPY --chown=appuser:appuser ../digital-form-builder/tsconfig.json ./digital-form-builder/tsconfig.json
7762

7863

7964
# ----------------------------
80-
# Stage 7
81-
# Cache layer contains model build
82-
# It will re-run only if there is a model change and a build change
83-
FROM digital-form-builder-adapter-model-pre-build AS digital-form-builder-adapter-model-build
65+
# Stage 5
66+
FROM parent-configuration AS model-build
8467
WORKDIR /usr/src/app/digital-form-builder-adapter
85-
USER 1001
86-
RUN --mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-build \
87-
--mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-adapter-install \
88-
--mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-adapter-model-build
89-
RUN yarn model build
68+
USER appuser
69+
COPY --chown=appuser:appuser ../model ./model
70+
RUN --mount=type=cache,target=/usr/src/app/digital-form-builder-adapter/.yarn/cache,uid=1001,mode=0755,id=yarn-cache \
71+
yarn digital-form-builder/model build && yarn model build
9072

9173

9274
# ----------------------------
93-
# Stage 8
94-
# Cache layer contains designer changes
95-
# It will re-run only if there is a designer change
96-
FROM digital-form-builder-adapter-model-build AS digital-form-builder-adapter-designer-pre-build
75+
# Stage 6
76+
FROM model-build AS designer-configuration
9777
WORKDIR /usr/src/app/digital-form-builder-adapter
9878
USER 1001
9979
COPY --chown=appuser:appuser ../designer ./designer
10080

10181

10282
# ----------------------------
103-
# Stage 9
104-
# Cache layer contains designer build
105-
# It will re-run only if there is a designer change and a build change
106-
FROM digital-form-builder-adapter-designer-pre-build AS digital-form-builder-adapter-designer-build
83+
# Stage 7
84+
FROM designer-configuration AS designer-build
10785
WORKDIR /usr/src/app/digital-form-builder-adapter
10886
USER 1001
109-
RUN --mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-build \
110-
--mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-adapter-install \
111-
--mount=type=cache,target=.yarn/cache,uid=1001,mode=0755,id=digital-form-builder-adapter-model-build \
87+
RUN --mount=type=cache,target=/usr/src/app/digital-form-builder-adapter/.yarn/cache,uid=1001,mode=0755,id=yarn-cache \
11288
yarn designer build
11389
CMD ["yarn", "designer", "production"]
114-
115-
116-
117-
118-
119-
120-
121-

runner/.dockerignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
.git
2+
.gitmodules
3+
**/node_modules
4+
**/.next
5+
**/dist
6+
**/build
7+
**/coverage
8+
**/.DS_Store
9+
.yarn/cache
10+
.yarn/unplugged
11+
.yarn/build-state.yml
12+
.pnp.*

0 commit comments

Comments
 (0)