@corbat-tech/coding-standards-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +371 -0
- package/assets/demo.gif +0 -0
- package/dist/agent.d.ts +53 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +629 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +651 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/config.d.ts +73 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +105 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/profiles.d.ts +39 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +526 -0
- package/dist/profiles.js.map +1 -0
- package/dist/prompts-legacy.d.ts +25 -0
- package/dist/prompts-legacy.d.ts.map +1 -0
- package/dist/prompts-legacy.js +600 -0
- package/dist/prompts-legacy.js.map +1 -0
- package/dist/prompts-v2.d.ts +30 -0
- package/dist/prompts-v2.d.ts.map +1 -0
- package/dist/prompts-v2.js +310 -0
- package/dist/prompts-v2.js.map +1 -0
- package/dist/prompts.d.ts +30 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +310 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +18 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +95 -0
- package/dist/resources.js.map +1 -0
- package/dist/tools-legacy.d.ts +196 -0
- package/dist/tools-legacy.d.ts.map +1 -0
- package/dist/tools-legacy.js +1230 -0
- package/dist/tools-legacy.js.map +1 -0
- package/dist/tools-v2.d.ts +92 -0
- package/dist/tools-v2.d.ts.map +1 -0
- package/dist/tools-v2.js +410 -0
- package/dist/tools-v2.js.map +1 -0
- package/dist/tools.d.ts +92 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +410 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +3054 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +515 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/retry.d.ts +44 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +74 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +79 -0
- package/profiles/README.md +199 -0
- package/profiles/custom/.gitkeep +2 -0
- package/profiles/templates/_template.yaml +159 -0
- package/profiles/templates/angular.yaml +494 -0
- package/profiles/templates/java-spring-backend.yaml +512 -0
- package/profiles/templates/minimal.yaml +102 -0
- package/profiles/templates/nodejs.yaml +338 -0
- package/profiles/templates/python.yaml +340 -0
- package/profiles/templates/react.yaml +331 -0
- package/profiles/templates/vue.yaml +598 -0
- package/standards/architecture/ddd.md +173 -0
- package/standards/architecture/hexagonal.md +97 -0
- package/standards/cicd/github-actions.md +567 -0
- package/standards/clean-code/naming.md +175 -0
- package/standards/clean-code/principles.md +179 -0
- package/standards/containerization/dockerfile.md +419 -0
- package/standards/database/selection-guide.md +443 -0
- package/standards/documentation/guidelines.md +189 -0
- package/standards/event-driven/domain-events.md +527 -0
- package/standards/kubernetes/deployment.md +518 -0
- package/standards/observability/guidelines.md +665 -0
- package/standards/project-setup/initialization-checklist.md +650 -0
- package/standards/spring-boot/best-practices.md +598 -0
- package/standards/testing/guidelines.md +559 -0
- package/standards/workflow/llm-development-workflow.md +542 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
# Containerization Guidelines
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Guidelines for containerizing Spring Boot applications following security best practices, multi-stage builds, and optimization techniques.
|
|
6
|
+
|
|
7
|
+
## Dockerfile Best Practices
|
|
8
|
+
|
|
9
|
+
### Multi-Stage Build (Recommended)
|
|
10
|
+
|
|
11
|
+
```dockerfile
|
|
12
|
+
# ============================================
|
|
13
|
+
# Stage 1: Build
|
|
14
|
+
# ============================================
|
|
15
|
+
FROM eclipse-temurin:21-jdk-alpine AS builder
|
|
16
|
+
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
|
|
19
|
+
# Copy Maven wrapper and pom.xml first (better caching)
|
|
20
|
+
COPY mvnw .
|
|
21
|
+
COPY .mvn .mvn
|
|
22
|
+
COPY pom.xml .
|
|
23
|
+
|
|
24
|
+
# Download dependencies (cached if pom.xml unchanged)
|
|
25
|
+
RUN chmod +x mvnw && ./mvnw dependency:go-offline -B
|
|
26
|
+
|
|
27
|
+
# Copy source code
|
|
28
|
+
COPY src src
|
|
29
|
+
|
|
30
|
+
# Build the application
|
|
31
|
+
RUN ./mvnw package -DskipTests -B
|
|
32
|
+
|
|
33
|
+
# Extract layers for better caching
|
|
34
|
+
RUN java -Djarmode=layertools -jar target/*.jar extract --destination extracted
|
|
35
|
+
|
|
36
|
+
# ============================================
|
|
37
|
+
# Stage 2: Runtime
|
|
38
|
+
# ============================================
|
|
39
|
+
FROM eclipse-temurin:21-jre-alpine AS runtime
|
|
40
|
+
|
|
41
|
+
# Security: Run as non-root user
|
|
42
|
+
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
|
|
43
|
+
USER appuser
|
|
44
|
+
|
|
45
|
+
WORKDIR /app
|
|
46
|
+
|
|
47
|
+
# Copy layers in order of change frequency
|
|
48
|
+
COPY --from=builder /app/extracted/dependencies/ ./
|
|
49
|
+
COPY --from=builder /app/extracted/spring-boot-loader/ ./
|
|
50
|
+
COPY --from=builder /app/extracted/snapshot-dependencies/ ./
|
|
51
|
+
COPY --from=builder /app/extracted/application/ ./
|
|
52
|
+
|
|
53
|
+
# Health check
|
|
54
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=30s --retries=3 \
|
|
55
|
+
CMD wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1
|
|
56
|
+
|
|
57
|
+
# Expose port
|
|
58
|
+
EXPOSE 8080
|
|
59
|
+
|
|
60
|
+
# JVM optimization flags
|
|
61
|
+
ENV JAVA_OPTS="-XX:+UseContainerSupport \
|
|
62
|
+
-XX:MaxRAMPercentage=75.0 \
|
|
63
|
+
-XX:InitialRAMPercentage=50.0 \
|
|
64
|
+
-XX:+ExitOnOutOfMemoryError \
|
|
65
|
+
-Djava.security.egd=file:/dev/./urandom"
|
|
66
|
+
|
|
67
|
+
# Run with Spring Boot launcher
|
|
68
|
+
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS org.springframework.boot.loader.launch.JarLauncher"]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Alternative: Simple Dockerfile
|
|
72
|
+
|
|
73
|
+
For simpler cases:
|
|
74
|
+
|
|
75
|
+
```dockerfile
|
|
76
|
+
FROM eclipse-temurin:21-jre-alpine
|
|
77
|
+
|
|
78
|
+
# Security
|
|
79
|
+
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
|
|
80
|
+
USER appuser
|
|
81
|
+
|
|
82
|
+
WORKDIR /app
|
|
83
|
+
|
|
84
|
+
# Copy pre-built JAR
|
|
85
|
+
COPY --chown=appuser:appgroup target/*.jar app.jar
|
|
86
|
+
|
|
87
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=30s --retries=3 \
|
|
88
|
+
CMD wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1
|
|
89
|
+
|
|
90
|
+
EXPOSE 8080
|
|
91
|
+
|
|
92
|
+
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"
|
|
93
|
+
|
|
94
|
+
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### With Buildpacks (No Dockerfile)
|
|
98
|
+
|
|
99
|
+
Use Cloud Native Buildpacks via Spring Boot Maven plugin:
|
|
100
|
+
|
|
101
|
+
```xml
|
|
102
|
+
<plugin>
|
|
103
|
+
<groupId>org.springframework.boot</groupId>
|
|
104
|
+
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
105
|
+
<configuration>
|
|
106
|
+
<image>
|
|
107
|
+
<name>${project.artifactId}:${project.version}</name>
|
|
108
|
+
<env>
|
|
109
|
+
<BP_JVM_VERSION>21</BP_JVM_VERSION>
|
|
110
|
+
</env>
|
|
111
|
+
</image>
|
|
112
|
+
</configuration>
|
|
113
|
+
</plugin>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
./mvnw spring-boot:build-image
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Base Image Selection
|
|
121
|
+
|
|
122
|
+
| Image | Size | Use Case |
|
|
123
|
+
|-------|------|----------|
|
|
124
|
+
| `eclipse-temurin:21-jre-alpine` | ~180MB | Production (smallest) |
|
|
125
|
+
| `eclipse-temurin:21-jre` | ~280MB | Production (more compatible) |
|
|
126
|
+
| `eclipse-temurin:21-jdk-alpine` | ~340MB | Build stage only |
|
|
127
|
+
| `amazoncorretto:21-alpine` | ~190MB | AWS environments |
|
|
128
|
+
| `gcr.io/distroless/java21-debian12` | ~220MB | Maximum security |
|
|
129
|
+
|
|
130
|
+
### Distroless Image (Most Secure)
|
|
131
|
+
|
|
132
|
+
```dockerfile
|
|
133
|
+
FROM eclipse-temurin:21-jdk-alpine AS builder
|
|
134
|
+
WORKDIR /app
|
|
135
|
+
COPY . .
|
|
136
|
+
RUN ./mvnw package -DskipTests
|
|
137
|
+
|
|
138
|
+
FROM gcr.io/distroless/java21-debian12
|
|
139
|
+
COPY --from=builder /app/target/*.jar /app.jar
|
|
140
|
+
EXPOSE 8080
|
|
141
|
+
ENTRYPOINT ["java", "-jar", "/app.jar"]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Docker Compose
|
|
145
|
+
|
|
146
|
+
### Development Environment
|
|
147
|
+
|
|
148
|
+
```yaml
|
|
149
|
+
# docker-compose.yml
|
|
150
|
+
version: '3.8'
|
|
151
|
+
|
|
152
|
+
services:
|
|
153
|
+
app:
|
|
154
|
+
build:
|
|
155
|
+
context: .
|
|
156
|
+
dockerfile: Dockerfile
|
|
157
|
+
ports:
|
|
158
|
+
- "8080:8080"
|
|
159
|
+
environment:
|
|
160
|
+
- SPRING_PROFILES_ACTIVE=local
|
|
161
|
+
- DATABASE_URL=jdbc:postgresql://postgres:5432/orderdb
|
|
162
|
+
- DATABASE_USERNAME=postgres
|
|
163
|
+
- DATABASE_PASSWORD=postgres
|
|
164
|
+
- KAFKA_BOOTSTRAP_SERVERS=kafka:9092
|
|
165
|
+
depends_on:
|
|
166
|
+
postgres:
|
|
167
|
+
condition: service_healthy
|
|
168
|
+
kafka:
|
|
169
|
+
condition: service_healthy
|
|
170
|
+
networks:
|
|
171
|
+
- app-network
|
|
172
|
+
|
|
173
|
+
postgres:
|
|
174
|
+
image: postgres:15-alpine
|
|
175
|
+
environment:
|
|
176
|
+
POSTGRES_DB: orderdb
|
|
177
|
+
POSTGRES_USER: postgres
|
|
178
|
+
POSTGRES_PASSWORD: postgres
|
|
179
|
+
ports:
|
|
180
|
+
- "5432:5432"
|
|
181
|
+
volumes:
|
|
182
|
+
- postgres-data:/var/lib/postgresql/data
|
|
183
|
+
healthcheck:
|
|
184
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
185
|
+
interval: 5s
|
|
186
|
+
timeout: 5s
|
|
187
|
+
retries: 5
|
|
188
|
+
networks:
|
|
189
|
+
- app-network
|
|
190
|
+
|
|
191
|
+
kafka:
|
|
192
|
+
image: confluentinc/cp-kafka:7.4.0
|
|
193
|
+
environment:
|
|
194
|
+
KAFKA_BROKER_ID: 1
|
|
195
|
+
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
|
|
196
|
+
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
|
|
197
|
+
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
|
|
198
|
+
depends_on:
|
|
199
|
+
- zookeeper
|
|
200
|
+
healthcheck:
|
|
201
|
+
test: ["CMD", "kafka-topics", "--bootstrap-server", "localhost:9092", "--list"]
|
|
202
|
+
interval: 10s
|
|
203
|
+
timeout: 10s
|
|
204
|
+
retries: 5
|
|
205
|
+
networks:
|
|
206
|
+
- app-network
|
|
207
|
+
|
|
208
|
+
zookeeper:
|
|
209
|
+
image: confluentinc/cp-zookeeper:7.4.0
|
|
210
|
+
environment:
|
|
211
|
+
ZOOKEEPER_CLIENT_PORT: 2181
|
|
212
|
+
networks:
|
|
213
|
+
- app-network
|
|
214
|
+
|
|
215
|
+
# Observability stack
|
|
216
|
+
prometheus:
|
|
217
|
+
image: prom/prometheus:latest
|
|
218
|
+
ports:
|
|
219
|
+
- "9090:9090"
|
|
220
|
+
volumes:
|
|
221
|
+
- ./infrastructure/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
|
222
|
+
networks:
|
|
223
|
+
- app-network
|
|
224
|
+
|
|
225
|
+
grafana:
|
|
226
|
+
image: grafana/grafana:latest
|
|
227
|
+
ports:
|
|
228
|
+
- "3000:3000"
|
|
229
|
+
environment:
|
|
230
|
+
- GF_SECURITY_ADMIN_PASSWORD=admin
|
|
231
|
+
volumes:
|
|
232
|
+
- grafana-data:/var/lib/grafana
|
|
233
|
+
networks:
|
|
234
|
+
- app-network
|
|
235
|
+
|
|
236
|
+
jaeger:
|
|
237
|
+
image: jaegertracing/all-in-one:latest
|
|
238
|
+
ports:
|
|
239
|
+
- "16686:16686"
|
|
240
|
+
- "4317:4317"
|
|
241
|
+
environment:
|
|
242
|
+
- COLLECTOR_OTLP_ENABLED=true
|
|
243
|
+
networks:
|
|
244
|
+
- app-network
|
|
245
|
+
|
|
246
|
+
networks:
|
|
247
|
+
app-network:
|
|
248
|
+
driver: bridge
|
|
249
|
+
|
|
250
|
+
volumes:
|
|
251
|
+
postgres-data:
|
|
252
|
+
grafana-data:
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Production-Like Environment
|
|
256
|
+
|
|
257
|
+
```yaml
|
|
258
|
+
# docker-compose.prod.yml
|
|
259
|
+
version: '3.8'
|
|
260
|
+
|
|
261
|
+
services:
|
|
262
|
+
app:
|
|
263
|
+
image: ${DOCKER_REGISTRY}/order-service:${VERSION}
|
|
264
|
+
deploy:
|
|
265
|
+
replicas: 2
|
|
266
|
+
resources:
|
|
267
|
+
limits:
|
|
268
|
+
cpus: '1'
|
|
269
|
+
memory: 1G
|
|
270
|
+
reservations:
|
|
271
|
+
cpus: '0.5'
|
|
272
|
+
memory: 512M
|
|
273
|
+
restart_policy:
|
|
274
|
+
condition: on-failure
|
|
275
|
+
max_attempts: 3
|
|
276
|
+
environment:
|
|
277
|
+
- SPRING_PROFILES_ACTIVE=production
|
|
278
|
+
- DATABASE_URL=${DATABASE_URL}
|
|
279
|
+
- DATABASE_USERNAME=${DATABASE_USERNAME}
|
|
280
|
+
- DATABASE_PASSWORD=${DATABASE_PASSWORD}
|
|
281
|
+
- KAFKA_BOOTSTRAP_SERVERS=${KAFKA_BOOTSTRAP_SERVERS}
|
|
282
|
+
healthcheck:
|
|
283
|
+
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/actuator/health"]
|
|
284
|
+
interval: 30s
|
|
285
|
+
timeout: 10s
|
|
286
|
+
retries: 3
|
|
287
|
+
start_period: 40s
|
|
288
|
+
logging:
|
|
289
|
+
driver: json-file
|
|
290
|
+
options:
|
|
291
|
+
max-size: "10m"
|
|
292
|
+
max-file: "3"
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## .dockerignore
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
# Build artifacts
|
|
299
|
+
target/
|
|
300
|
+
!target/*.jar
|
|
301
|
+
build/
|
|
302
|
+
*.class
|
|
303
|
+
|
|
304
|
+
# IDE
|
|
305
|
+
.idea/
|
|
306
|
+
*.iml
|
|
307
|
+
.vscode/
|
|
308
|
+
*.swp
|
|
309
|
+
|
|
310
|
+
# Git
|
|
311
|
+
.git
|
|
312
|
+
.gitignore
|
|
313
|
+
|
|
314
|
+
# Documentation
|
|
315
|
+
*.md
|
|
316
|
+
docs/
|
|
317
|
+
|
|
318
|
+
# Tests
|
|
319
|
+
src/test/
|
|
320
|
+
tests/
|
|
321
|
+
|
|
322
|
+
# CI/CD
|
|
323
|
+
.github/
|
|
324
|
+
.gitlab-ci.yml
|
|
325
|
+
Jenkinsfile
|
|
326
|
+
|
|
327
|
+
# Docker
|
|
328
|
+
Dockerfile*
|
|
329
|
+
docker-compose*
|
|
330
|
+
.docker/
|
|
331
|
+
|
|
332
|
+
# Misc
|
|
333
|
+
*.log
|
|
334
|
+
*.tmp
|
|
335
|
+
.env
|
|
336
|
+
.env.*
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Security Checklist
|
|
340
|
+
|
|
341
|
+
- [ ] Use non-root user (`USER appuser`)
|
|
342
|
+
- [ ] Use specific image tags (not `latest`)
|
|
343
|
+
- [ ] Minimize image size (Alpine, multi-stage)
|
|
344
|
+
- [ ] Don't copy secrets into image
|
|
345
|
+
- [ ] Enable health checks
|
|
346
|
+
- [ ] Scan for vulnerabilities (`docker scan`, `trivy`)
|
|
347
|
+
- [ ] Use read-only filesystem where possible
|
|
348
|
+
- [ ] Limit resource usage (CPU, memory)
|
|
349
|
+
- [ ] Don't expose unnecessary ports
|
|
350
|
+
|
|
351
|
+
## JVM Container Settings
|
|
352
|
+
|
|
353
|
+
```dockerfile
|
|
354
|
+
ENV JAVA_OPTS="\
|
|
355
|
+
# Use container limits
|
|
356
|
+
-XX:+UseContainerSupport \
|
|
357
|
+
# Memory settings (percentage of container limit)
|
|
358
|
+
-XX:MaxRAMPercentage=75.0 \
|
|
359
|
+
-XX:InitialRAMPercentage=50.0 \
|
|
360
|
+
# Fail fast on OOM
|
|
361
|
+
-XX:+ExitOnOutOfMemoryError \
|
|
362
|
+
# Faster startup with entropy
|
|
363
|
+
-Djava.security.egd=file:/dev/./urandom \
|
|
364
|
+
# GC settings (G1 is default in JDK 21)
|
|
365
|
+
-XX:+UseG1GC \
|
|
366
|
+
-XX:MaxGCPauseMillis=200 \
|
|
367
|
+
# Better container awareness
|
|
368
|
+
-XX:+UseStringDeduplication"
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Local Development Commands
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
# Build image
|
|
375
|
+
docker build -t order-service:latest .
|
|
376
|
+
|
|
377
|
+
# Run container
|
|
378
|
+
docker run -p 8080:8080 \
|
|
379
|
+
-e SPRING_PROFILES_ACTIVE=local \
|
|
380
|
+
-e DATABASE_URL=jdbc:postgresql://host.docker.internal:5432/orderdb \
|
|
381
|
+
order-service:latest
|
|
382
|
+
|
|
383
|
+
# Build and run with compose
|
|
384
|
+
docker-compose up --build
|
|
385
|
+
|
|
386
|
+
# Run specific service
|
|
387
|
+
docker-compose up -d postgres kafka
|
|
388
|
+
|
|
389
|
+
# View logs
|
|
390
|
+
docker-compose logs -f app
|
|
391
|
+
|
|
392
|
+
# Clean up
|
|
393
|
+
docker-compose down -v
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
## Image Optimization Tips
|
|
397
|
+
|
|
398
|
+
1. **Order layers by change frequency**: Dependencies change less than code
|
|
399
|
+
2. **Use multi-stage builds**: Smaller final image
|
|
400
|
+
3. **Leverage Spring Boot layered JARs**: Better Docker layer caching
|
|
401
|
+
4. **Use Alpine images**: Smaller base image
|
|
402
|
+
5. **Clean up in same layer**: `RUN apt-get install && apt-get clean && rm -rf /var/lib/apt/lists/*`
|
|
403
|
+
6. **Minimize number of layers**: Combine related commands
|
|
404
|
+
|
|
405
|
+
## CI/CD Integration
|
|
406
|
+
|
|
407
|
+
```yaml
|
|
408
|
+
# Build and push in GitHub Actions
|
|
409
|
+
- name: Build and push Docker image
|
|
410
|
+
uses: docker/build-push-action@v5
|
|
411
|
+
with:
|
|
412
|
+
context: .
|
|
413
|
+
push: true
|
|
414
|
+
tags: |
|
|
415
|
+
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
|
|
416
|
+
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
|
417
|
+
cache-from: type=gha
|
|
418
|
+
cache-to: type=gha,mode=max
|
|
419
|
+
```
|