student life social platform
1ARG CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX=docker.io # override with git.inpt.fr/churros/dependency_proxy/containers, for example
2ARG REPOSITORY_URL=https://git.inpt.fr/churros/churros
3
4
5
6#####
7# Common builder
8#####
9
10
11FROM $CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX/node:20.18.3-alpine AS builder
12
13ARG TAG=dev
14
15WORKDIR /app
16
17RUN apk add --no-cache git patch
18
19# Yarn
20COPY .yarn/ /app/.yarn/
21COPY .yarnrc.yml /app/
22COPY yarn.lock /app/
23
24# packages
25COPY package.json /app/
26
27COPY CHANGELOG.md /app/CHANGELOG.md
28COPY .env.example /app/.env.example
29COPY .merge-drivers.yml /app/.merge-drivers.yml
30COPY .git /app/.git
31COPY packages/ /app/packages/
32COPY scripts/ /app/scripts/
33
34# Remove unused packages
35RUN rm -rf packages/mock-n7-ldap pack
36RUN rm -rf packages/oauth-client
37
38RUN if ! yarn install; then cat /tmp/xfs-*/build.log; exit 1; fi
39RUN yarn cp-env
40RUN yarn generate-buildinfo
41
42# Build arborist
43RUN yarn workspace arborist build
44
45
46#####
47# Package-specific builders
48#####
49
50
51FROM builder AS builder-api
52
53WORKDIR /app
54RUN apk add --update --no-cache openssl
55RUN yarn workspace @churros/api build
56
57FROM builder AS builder-app
58
59WORKDIR /app
60COPY packages/app/schema.graphql /app/packages/api/build/schema.graphql
61ENV NODE_OPTIONS="--max-old-space-size=4096"
62RUN --mount=type=secret,id=SENTRY_AUTH_TOKEN \
63 SENTRY_AUTH_TOKEN=$(cat /run/secrets/SENTRY_AUTH_TOKEN || true) \
64 yarn workspace @churros/app build
65
66FROM builder AS builder-sync
67
68WORKDIR /app
69RUN yarn workspace @churros/db generate
70RUN yarn workspace @churros/sync build
71
72
73
74####
75# Runtime common base
76####
77
78
79
80FROM $CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX/node:20.18.3-alpine AS base
81
82WORKDIR /app
83
84COPY yarn.lock /app/
85COPY .yarnrc.yml /app/
86COPY .yarn/ /app/.yarn/
87COPY package.json /app/
88
89# Builded arborist
90COPY --from=builder /app/packages/arborist/ /app/packages/arborist/
91
92
93
94####
95# Final images
96####
97
98
99#### API
100
101
102FROM base AS api
103
104LABEL org.opencontainers.image.source=$REPOSITORY_URL/packages/api
105
106WORKDIR /app
107
108ENV NODE_ENV="production"
109
110RUN apk add --update --no-cache openssl git
111
112# Prisma
113COPY --from=builder-api /app/packages/db/prisma/ /app/packages/db/prisma/
114COPY --from=builder-api /app/packages/db/src/ /app/packages/db/src/
115COPY --from=builder-api /app/packages/db/package.json /app/packages/db/
116
117# Builded api
118COPY --from=builder-api /app/packages/api/build/src/ /app/packages/api/build/src/
119COPY --from=builder-api /app/packages/api/build/schema.graphql /app/packages/api/build/schema.graphql
120COPY --from=builder-api /app/packages/api/static/ /app/packages/api/static/
121COPY --from=builder-api /app/packages/api/package.json /app/packages/api/
122
123# Install dependencies
124RUN yarn workspaces focus @churros/api --production
125
126# Copy prisma client script
127COPY packages/api/prisma-client.sh /app/prisma-client.sh
128
129# Copy entrypoint
130COPY packages/api/entrypoint.sh /app/entrypoint.sh
131RUN chmod +x /app/entrypoint.sh
132
133ENTRYPOINT ["./entrypoint.sh"]
134
135
136### App
137
138
139FROM base AS app
140
141LABEL org.opencontainers.image.source=$REPOSITORY_URL/packages/app
142
143WORKDIR /app
144
145# Builded app
146ENV NODE_ENV="production"
147COPY --from=builder-app /app/packages/app/build/ /app/packages/app/build/
148COPY --from=builder-app /app/packages/app/package.json /app/packages/app/
149
150# Install dependencies
151RUN yarn workspaces focus @churros/app --production
152
153# Copy entrypoint
154COPY packages/app/entrypoint.sh /app/entrypoint.sh
155RUN chmod +x /app/entrypoint.sh
156
157ENTRYPOINT ["./entrypoint.sh"]
158
159
160### Sync
161
162
163FROM base AS sync
164
165LABEL org.opencontainers.image.source=$REPOSITORY_URL/packages/sync
166
167RUN apk add --update --no-cache openssl
168
169ENV NODE_ENV="production"
170COPY --from=builder-sync /app/packages/db/src/ /app/packages/db/src/
171COPY --from=builder-sync /app/packages/db/package.json /app/packages/db/
172
173COPY --from=builder-sync /app/packages/sync/build/src/ /app/packages/sync/build/src/
174COPY --from=builder-sync /app/packages/sync/package.json /app/packages/sync/
175
176RUN yarn workspaces focus @churros/sync --production
177
178WORKDIR /app
179
180ENTRYPOINT ["node", "packages/sync/build/src/index.js"]
181
182
183### Database
184
185
186FROM $CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX/node:20.18.3-alpine AS prisma
187
188LABEL org.opencontainers.image.source=$REPOSITORY_URL/packages/db
189
190RUN apk add --update --no-cache openssl
191
192WORKDIR /app
193COPY packages/db/prisma/ /app/packages/db/prisma/
194COPY packages/db/prisma /app/prisma
195COPY packages/db/package.json /app/package.json
196COPY packages/db/entrypoint.sh /app/entrypoint.sh
197
198RUN chmod +x /app/entrypoint.sh
199
200RUN npm install -g corepack
201RUN yarn install
202
203ENTRYPOINT ["./entrypoint.sh"]
204
205
206#####
207# Artifacts
208#####
209
210FROM scratch as graphql-schema
211
212COPY --from=builder-api /app/packages/api/build/schema.graphql /schema.graphql