claudient 0.1.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/.claude-plugin/plugin.json +42 -0
- package/CONTEXT.md +58 -0
- package/README.md +165 -0
- package/agents/build-resolvers/de/python-resolver.md +64 -0
- package/agents/build-resolvers/de/typescript-resolver.md +65 -0
- package/agents/build-resolvers/es/python-resolver.md +64 -0
- package/agents/build-resolvers/es/typescript-resolver.md +65 -0
- package/agents/build-resolvers/fr/python-resolver.md +64 -0
- package/agents/build-resolvers/fr/typescript-resolver.md +65 -0
- package/agents/build-resolvers/nl/python-resolver.md +64 -0
- package/agents/build-resolvers/nl/typescript-resolver.md +65 -0
- package/agents/build-resolvers/python-resolver.md +62 -0
- package/agents/build-resolvers/typescript-resolver.md +63 -0
- package/agents/core/architect.md +64 -0
- package/agents/core/code-reviewer.md +78 -0
- package/agents/core/de/architect.md +66 -0
- package/agents/core/de/code-reviewer.md +80 -0
- package/agents/core/de/planner.md +63 -0
- package/agents/core/de/security-reviewer.md +93 -0
- package/agents/core/es/architect.md +66 -0
- package/agents/core/es/code-reviewer.md +80 -0
- package/agents/core/es/planner.md +63 -0
- package/agents/core/es/security-reviewer.md +93 -0
- package/agents/core/fr/architect.md +66 -0
- package/agents/core/fr/code-reviewer.md +80 -0
- package/agents/core/fr/planner.md +63 -0
- package/agents/core/fr/security-reviewer.md +93 -0
- package/agents/core/nl/architect.md +66 -0
- package/agents/core/nl/code-reviewer.md +80 -0
- package/agents/core/nl/planner.md +63 -0
- package/agents/core/nl/security-reviewer.md +93 -0
- package/agents/core/planner.md +61 -0
- package/agents/core/security-reviewer.md +91 -0
- package/guides/agent-orchestration.md +231 -0
- package/guides/de/agent-orchestration.md +174 -0
- package/guides/de/getting-started.md +164 -0
- package/guides/de/hooks-cookbook.md +160 -0
- package/guides/de/memory-management.md +153 -0
- package/guides/de/security.md +180 -0
- package/guides/de/skill-authoring.md +214 -0
- package/guides/de/token-optimization.md +156 -0
- package/guides/es/agent-orchestration.md +174 -0
- package/guides/es/getting-started.md +164 -0
- package/guides/es/hooks-cookbook.md +160 -0
- package/guides/es/memory-management.md +153 -0
- package/guides/es/security.md +180 -0
- package/guides/es/skill-authoring.md +214 -0
- package/guides/es/token-optimization.md +156 -0
- package/guides/fr/agent-orchestration.md +174 -0
- package/guides/fr/getting-started.md +164 -0
- package/guides/fr/hooks-cookbook.md +227 -0
- package/guides/fr/memory-management.md +169 -0
- package/guides/fr/security.md +180 -0
- package/guides/fr/skill-authoring.md +214 -0
- package/guides/fr/token-optimization.md +158 -0
- package/guides/getting-started.md +164 -0
- package/guides/hooks-cookbook.md +423 -0
- package/guides/memory-management.md +192 -0
- package/guides/nl/agent-orchestration.md +174 -0
- package/guides/nl/getting-started.md +164 -0
- package/guides/nl/hooks-cookbook.md +160 -0
- package/guides/nl/memory-management.md +153 -0
- package/guides/nl/security.md +180 -0
- package/guides/nl/skill-authoring.md +214 -0
- package/guides/nl/token-optimization.md +156 -0
- package/guides/security.md +229 -0
- package/guides/skill-authoring.md +226 -0
- package/guides/token-optimization.md +169 -0
- package/hooks/lifecycle/cost-tracker.md +49 -0
- package/hooks/lifecycle/cost-tracker.sh +59 -0
- package/hooks/lifecycle/pre-compact-save.md +56 -0
- package/hooks/lifecycle/pre-compact-save.sh +37 -0
- package/hooks/lifecycle/session-start.md +50 -0
- package/hooks/lifecycle/session-start.sh +47 -0
- package/hooks/post-tool-use/audit-log.md +53 -0
- package/hooks/post-tool-use/audit-log.sh +53 -0
- package/hooks/post-tool-use/prettier.md +53 -0
- package/hooks/post-tool-use/prettier.sh +49 -0
- package/hooks/pre-tool-use/block-dangerous.md +48 -0
- package/hooks/pre-tool-use/block-dangerous.sh +76 -0
- package/hooks/pre-tool-use/git-push-confirm.md +46 -0
- package/hooks/pre-tool-use/git-push-confirm.sh +36 -0
- package/mcp/configs/github.json +11 -0
- package/mcp/configs/postgres.json +11 -0
- package/mcp/de/recommended-servers.md +170 -0
- package/mcp/es/recommended-servers.md +170 -0
- package/mcp/fr/recommended-servers.md +170 -0
- package/mcp/nl/recommended-servers.md +170 -0
- package/mcp/recommended-servers.md +168 -0
- package/package.json +45 -0
- package/prompts/project-starters/de/fastapi-project.md +62 -0
- package/prompts/project-starters/de/nextjs-project.md +82 -0
- package/prompts/project-starters/es/fastapi-project.md +62 -0
- package/prompts/project-starters/es/nextjs-project.md +82 -0
- package/prompts/project-starters/fastapi-project.md +60 -0
- package/prompts/project-starters/fr/fastapi-project.md +62 -0
- package/prompts/project-starters/fr/nextjs-project.md +82 -0
- package/prompts/project-starters/nextjs-project.md +80 -0
- package/prompts/project-starters/nl/fastapi-project.md +62 -0
- package/prompts/project-starters/nl/nextjs-project.md +82 -0
- package/prompts/system-prompts/ai-product.md +80 -0
- package/prompts/system-prompts/data-pipeline.md +76 -0
- package/prompts/system-prompts/de/ai-product.md +82 -0
- package/prompts/system-prompts/de/data-pipeline.md +78 -0
- package/prompts/system-prompts/de/saas-backend.md +71 -0
- package/prompts/system-prompts/es/ai-product.md +82 -0
- package/prompts/system-prompts/es/data-pipeline.md +78 -0
- package/prompts/system-prompts/es/saas-backend.md +71 -0
- package/prompts/system-prompts/fr/ai-product.md +82 -0
- package/prompts/system-prompts/fr/data-pipeline.md +78 -0
- package/prompts/system-prompts/fr/saas-backend.md +71 -0
- package/prompts/system-prompts/nl/ai-product.md +82 -0
- package/prompts/system-prompts/nl/data-pipeline.md +78 -0
- package/prompts/system-prompts/nl/saas-backend.md +71 -0
- package/prompts/system-prompts/saas-backend.md +69 -0
- package/prompts/task-specific/changelog.md +81 -0
- package/prompts/task-specific/de/changelog.md +83 -0
- package/prompts/task-specific/de/debugging.md +78 -0
- package/prompts/task-specific/de/pr-description.md +69 -0
- package/prompts/task-specific/debugging.md +76 -0
- package/prompts/task-specific/es/changelog.md +83 -0
- package/prompts/task-specific/es/debugging.md +78 -0
- package/prompts/task-specific/es/pr-description.md +69 -0
- package/prompts/task-specific/fr/changelog.md +83 -0
- package/prompts/task-specific/fr/debugging.md +78 -0
- package/prompts/task-specific/fr/pr-description.md +69 -0
- package/prompts/task-specific/nl/changelog.md +83 -0
- package/prompts/task-specific/nl/debugging.md +78 -0
- package/prompts/task-specific/nl/pr-description.md +69 -0
- package/prompts/task-specific/pr-description.md +67 -0
- package/rules/common/coding-style.md +45 -0
- package/rules/common/de/coding-style.md +47 -0
- package/rules/common/de/git.md +48 -0
- package/rules/common/de/performance.md +40 -0
- package/rules/common/de/security.md +45 -0
- package/rules/common/de/testing.md +45 -0
- package/rules/common/es/coding-style.md +47 -0
- package/rules/common/es/git.md +48 -0
- package/rules/common/es/performance.md +40 -0
- package/rules/common/es/security.md +45 -0
- package/rules/common/es/testing.md +45 -0
- package/rules/common/fr/coding-style.md +47 -0
- package/rules/common/fr/git.md +48 -0
- package/rules/common/fr/performance.md +40 -0
- package/rules/common/fr/security.md +45 -0
- package/rules/common/fr/testing.md +45 -0
- package/rules/common/git.md +46 -0
- package/rules/common/nl/coding-style.md +47 -0
- package/rules/common/nl/git.md +48 -0
- package/rules/common/nl/performance.md +40 -0
- package/rules/common/nl/security.md +45 -0
- package/rules/common/nl/testing.md +45 -0
- package/rules/common/performance.md +38 -0
- package/rules/common/security.md +43 -0
- package/rules/common/testing.md +43 -0
- package/rules/language-specific/de/go.md +48 -0
- package/rules/language-specific/de/python.md +38 -0
- package/rules/language-specific/de/typescript.md +51 -0
- package/rules/language-specific/es/go.md +48 -0
- package/rules/language-specific/es/python.md +38 -0
- package/rules/language-specific/es/typescript.md +51 -0
- package/rules/language-specific/fr/go.md +48 -0
- package/rules/language-specific/fr/python.md +38 -0
- package/rules/language-specific/fr/typescript.md +51 -0
- package/rules/language-specific/go.md +46 -0
- package/rules/language-specific/nl/go.md +48 -0
- package/rules/language-specific/nl/python.md +38 -0
- package/rules/language-specific/nl/typescript.md +51 -0
- package/rules/language-specific/python.md +36 -0
- package/rules/language-specific/typescript.md +49 -0
- package/scripts/cli.js +161 -0
- package/scripts/link-skills.sh +35 -0
- package/scripts/list-skills.sh +34 -0
- package/skills/ai-engineering/agent-construction.md +285 -0
- package/skills/ai-engineering/claude-api.md +248 -0
- package/skills/ai-engineering/de/agent-construction.md +287 -0
- package/skills/ai-engineering/de/claude-api.md +250 -0
- package/skills/ai-engineering/es/agent-construction.md +287 -0
- package/skills/ai-engineering/es/claude-api.md +250 -0
- package/skills/ai-engineering/fr/agent-construction.md +287 -0
- package/skills/ai-engineering/fr/claude-api.md +250 -0
- package/skills/ai-engineering/nl/agent-construction.md +287 -0
- package/skills/ai-engineering/nl/claude-api.md +250 -0
- package/skills/backend/dotnet/csharp.md +304 -0
- package/skills/backend/dotnet/de/csharp.md +306 -0
- package/skills/backend/dotnet/es/csharp.md +306 -0
- package/skills/backend/dotnet/fr/csharp.md +306 -0
- package/skills/backend/dotnet/nl/csharp.md +306 -0
- package/skills/backend/go/de/go.md +307 -0
- package/skills/backend/go/es/go.md +307 -0
- package/skills/backend/go/fr/go.md +307 -0
- package/skills/backend/go/go.md +305 -0
- package/skills/backend/go/nl/go.md +307 -0
- package/skills/backend/nodejs/de/nestjs.md +274 -0
- package/skills/backend/nodejs/de/nextjs.md +222 -0
- package/skills/backend/nodejs/es/nestjs.md +274 -0
- package/skills/backend/nodejs/es/nextjs.md +222 -0
- package/skills/backend/nodejs/fr/nestjs.md +274 -0
- package/skills/backend/nodejs/fr/nextjs.md +222 -0
- package/skills/backend/nodejs/nestjs.md +272 -0
- package/skills/backend/nodejs/nextjs.md +220 -0
- package/skills/backend/nodejs/nl/nestjs.md +274 -0
- package/skills/backend/nodejs/nl/nextjs.md +222 -0
- package/skills/backend/python/de/django.md +285 -0
- package/skills/backend/python/de/fastapi.md +244 -0
- package/skills/backend/python/django.md +283 -0
- package/skills/backend/python/es/django.md +285 -0
- package/skills/backend/python/es/fastapi.md +244 -0
- package/skills/backend/python/fastapi.md +242 -0
- package/skills/backend/python/fr/django.md +285 -0
- package/skills/backend/python/fr/fastapi.md +244 -0
- package/skills/backend/python/nl/django.md +285 -0
- package/skills/backend/python/nl/fastapi.md +244 -0
- package/skills/data-ml/dbt-data-pipelines.md +155 -0
- package/skills/data-ml/de/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/de/pandas-polars.md +147 -0
- package/skills/data-ml/de/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/es/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/es/pandas-polars.md +147 -0
- package/skills/data-ml/es/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/fr/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/fr/pandas-polars.md +147 -0
- package/skills/data-ml/fr/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/nl/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/nl/pandas-polars.md +147 -0
- package/skills/data-ml/nl/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/pandas-polars.md +145 -0
- package/skills/data-ml/pytorch-tensorflow.md +169 -0
- package/skills/database/de/graphql.md +181 -0
- package/skills/database/es/graphql.md +181 -0
- package/skills/database/fr/graphql.md +181 -0
- package/skills/database/graphql.md +179 -0
- package/skills/database/nl/graphql.md +181 -0
- package/skills/devops-infra/de/docker.md +133 -0
- package/skills/devops-infra/de/github-actions.md +179 -0
- package/skills/devops-infra/de/kubernetes.md +129 -0
- package/skills/devops-infra/de/terraform.md +130 -0
- package/skills/devops-infra/docker.md +131 -0
- package/skills/devops-infra/es/docker.md +133 -0
- package/skills/devops-infra/es/github-actions.md +179 -0
- package/skills/devops-infra/es/kubernetes.md +129 -0
- package/skills/devops-infra/es/terraform.md +130 -0
- package/skills/devops-infra/fr/docker.md +133 -0
- package/skills/devops-infra/fr/github-actions.md +179 -0
- package/skills/devops-infra/fr/kubernetes.md +129 -0
- package/skills/devops-infra/fr/terraform.md +130 -0
- package/skills/devops-infra/github-actions.md +177 -0
- package/skills/devops-infra/kubernetes.md +127 -0
- package/skills/devops-infra/nl/docker.md +133 -0
- package/skills/devops-infra/nl/github-actions.md +179 -0
- package/skills/devops-infra/nl/kubernetes.md +129 -0
- package/skills/devops-infra/nl/terraform.md +130 -0
- package/skills/devops-infra/terraform.md +128 -0
- package/skills/finance-payments/de/stripe.md +187 -0
- package/skills/finance-payments/es/stripe.md +187 -0
- package/skills/finance-payments/fr/stripe.md +187 -0
- package/skills/finance-payments/nl/stripe.md +187 -0
- package/skills/finance-payments/stripe.md +185 -0
- package/workflows/code-review.md +151 -0
- package/workflows/de/code-review.md +153 -0
- package/workflows/de/debugging-session.md +146 -0
- package/workflows/de/feature-development.md +155 -0
- package/workflows/de/new-project-bootstrap.md +175 -0
- package/workflows/de/refactor-safely.md +150 -0
- package/workflows/debugging-session.md +144 -0
- package/workflows/es/code-review.md +153 -0
- package/workflows/es/debugging-session.md +146 -0
- package/workflows/es/feature-development.md +155 -0
- package/workflows/es/new-project-bootstrap.md +175 -0
- package/workflows/es/refactor-safely.md +150 -0
- package/workflows/feature-development.md +153 -0
- package/workflows/fr/code-review.md +153 -0
- package/workflows/fr/debugging-session.md +146 -0
- package/workflows/fr/feature-development.md +155 -0
- package/workflows/fr/new-project-bootstrap.md +175 -0
- package/workflows/fr/refactor-safely.md +150 -0
- package/workflows/new-project-bootstrap.md +173 -0
- package/workflows/nl/code-review.md +153 -0
- package/workflows/nl/debugging-session.md +146 -0
- package/workflows/nl/feature-development.md +155 -0
- package/workflows/nl/new-project-bootstrap.md +175 -0
- package/workflows/nl/refactor-safely.md +150 -0
- package/workflows/refactor-safely.md +148 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
> 🇪🇸 Esta es la traducción en español. [Versión en inglés](../kubernetes.md).
|
|
2
|
+
|
|
3
|
+
# Skill de Kubernetes
|
|
4
|
+
|
|
5
|
+
## Cuándo activar
|
|
6
|
+
- Escribir manifiestos de Kubernetes (Deployments, Services, ConfigMaps, Secrets, Ingress)
|
|
7
|
+
- Configurar charts de Helm o archivos de valores para una aplicación
|
|
8
|
+
- Depurar un Pod fallido, CrashLoopBackOff o contenedor OOMKilled
|
|
9
|
+
- Configurar escalado horizontal de pods (HPA) o escalado vertical (VPA)
|
|
10
|
+
- Definir solicitudes y límites de recursos para contenedores
|
|
11
|
+
- Escribir o revisar políticas RBAC (Roles, ClusterRoles, RoleBindings)
|
|
12
|
+
- Configurar sondas de liveness, readiness y startup
|
|
13
|
+
- Configurar volúmenes persistentes y reclamaciones de volúmenes persistentes
|
|
14
|
+
- Escribir políticas de red para controlar el tráfico entre pods
|
|
15
|
+
- Configurar namespaces y aislamiento multi-tenant
|
|
16
|
+
|
|
17
|
+
## Cuándo NO usar
|
|
18
|
+
- Configuraciones de Docker Compose que no se están migrando a Kubernetes
|
|
19
|
+
- Serverless (Cloud Run, Lambda, Fargate) — modelo de despliegue diferente
|
|
20
|
+
- Aplicaciones simples de un solo contenedor que no necesitan orquestación
|
|
21
|
+
- Entornos de desarrollo local donde Docker solo es suficiente
|
|
22
|
+
- Nomad, Mesos u otros orquestadores que no son Kubernetes
|
|
23
|
+
|
|
24
|
+
## Instrucciones
|
|
25
|
+
|
|
26
|
+
### Estructura del manifiesto
|
|
27
|
+
Siempre establece estos campos en cada Deployment:
|
|
28
|
+
```yaml
|
|
29
|
+
apiVersion: apps/v1
|
|
30
|
+
kind: Deployment
|
|
31
|
+
metadata:
|
|
32
|
+
name: app-name
|
|
33
|
+
namespace: production # Siempre explícito — nunca confiar en el namespace por defecto
|
|
34
|
+
labels:
|
|
35
|
+
app: app-name
|
|
36
|
+
version: "1.0.0"
|
|
37
|
+
spec:
|
|
38
|
+
replicas: 3
|
|
39
|
+
selector:
|
|
40
|
+
matchLabels:
|
|
41
|
+
app: app-name
|
|
42
|
+
template:
|
|
43
|
+
metadata:
|
|
44
|
+
labels:
|
|
45
|
+
app: app-name
|
|
46
|
+
version: "1.0.0"
|
|
47
|
+
spec:
|
|
48
|
+
containers:
|
|
49
|
+
- name: app-name
|
|
50
|
+
image: registry/app-name:tag # Nunca usar :latest en producción
|
|
51
|
+
resources:
|
|
52
|
+
requests:
|
|
53
|
+
cpu: "100m"
|
|
54
|
+
memory: "128Mi"
|
|
55
|
+
limits:
|
|
56
|
+
cpu: "500m"
|
|
57
|
+
memory: "512Mi"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Solicitudes y límites de recursos
|
|
61
|
+
- Siempre establece tanto `requests` como `limits` — nunca los omitas
|
|
62
|
+
- `requests` = recursos garantizados (usados para la programación)
|
|
63
|
+
- `limits` = máximo permitido (OOMKilled si se supera la memoria)
|
|
64
|
+
- Los límites de CPU son opcionales en clústeres con throttling de CPU desactivado — pero los límites de memoria son obligatorios
|
|
65
|
+
- Empieza de forma conservadora: requests al ~25% del esperado, limits al 2x del esperado, luego ajusta con métricas reales
|
|
66
|
+
|
|
67
|
+
### Sondas de salud
|
|
68
|
+
Todos los contenedores en producción deben tener sondas:
|
|
69
|
+
```yaml
|
|
70
|
+
livenessProbe:
|
|
71
|
+
httpGet:
|
|
72
|
+
path: /healthz
|
|
73
|
+
port: 8080
|
|
74
|
+
initialDelaySeconds: 15
|
|
75
|
+
periodSeconds: 20
|
|
76
|
+
failureThreshold: 3
|
|
77
|
+
|
|
78
|
+
readinessProbe:
|
|
79
|
+
httpGet:
|
|
80
|
+
path: /ready
|
|
81
|
+
port: 8080
|
|
82
|
+
initialDelaySeconds: 5
|
|
83
|
+
periodSeconds: 10
|
|
84
|
+
failureThreshold: 3
|
|
85
|
+
```
|
|
86
|
+
- El fallo de `livenessProbe` → reinicio del contenedor
|
|
87
|
+
- El fallo de `readinessProbe` → eliminado del balanceador de carga del Service (sin tráfico, sin reinicio)
|
|
88
|
+
- Nunca apuntes ambas al mismo endpoint — la readiness debe verificar dependencias, la liveness no
|
|
89
|
+
|
|
90
|
+
### Gestión de secretos
|
|
91
|
+
- Nunca pongas secretos en ConfigMaps — usa Secrets
|
|
92
|
+
- Nunca hagas commit de manifiestos Secret con valores reales — usa sealed-secrets, external-secrets-operator o Vault
|
|
93
|
+
- Referencia los secretos como variables de entorno, no como volúmenes, a menos que la aplicación requiera específicamente secretos basados en archivos:
|
|
94
|
+
```yaml
|
|
95
|
+
env:
|
|
96
|
+
- name: DATABASE_URL
|
|
97
|
+
valueFrom:
|
|
98
|
+
secretKeyRef:
|
|
99
|
+
name: app-secrets
|
|
100
|
+
key: database-url
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Convenciones de namespaces
|
|
104
|
+
- Namespace `default`: solo para dev/testing
|
|
105
|
+
- Las cargas de trabajo de producción siempre en namespaces con nombre
|
|
106
|
+
- Usa `ResourceQuota` y `LimitRange` en cada namespace de producción
|
|
107
|
+
- RBAC: los desarrolladores obtienen edit en namespaces de dev, view en producción
|
|
108
|
+
|
|
109
|
+
### Causas comunes de CrashLoopBackOff y soluciones
|
|
110
|
+
1. Variable de entorno faltante → revisa la sección Events de `kubectl describe pod`
|
|
111
|
+
2. Healthcheck fallido → los logs muestran el error real, la sonda solo lo detecta
|
|
112
|
+
3. OOMKilled → aumenta el límite de memoria o soluciona la fuga de memoria
|
|
113
|
+
4. Error al obtener la imagen → revisa imagePullPolicy y credenciales del registro
|
|
114
|
+
5. Fallo del contenedor init → `kubectl logs pod-name -c init-container-name`
|
|
115
|
+
|
|
116
|
+
## Ejemplo
|
|
117
|
+
|
|
118
|
+
**Usuario:** Desplegar una aplicación FastAPI con conexión a PostgreSQL, 3 réplicas, límites de recursos y health checks.
|
|
119
|
+
|
|
120
|
+
**Estructura de salida esperada:**
|
|
121
|
+
- Manifiesto de Namespace
|
|
122
|
+
- Secret para `DATABASE_URL`
|
|
123
|
+
- Deployment con 3 réplicas, requests/limits de recursos, sondas liveness + readiness apuntando a `/healthz` y `/ready`
|
|
124
|
+
- Service (ClusterIP) exponiendo el puerto 80 → puerto 8080 del contenedor
|
|
125
|
+
- HorizontalPodAutoscaler con objetivo de 70% de utilización de CPU, mínimo 3 / máximo 10 réplicas
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
> **Trabaja con nosotros:** Claudient está respaldado por [Uitbreiden](https://uitbreiden.com/) — construimos productos de IA y soluciones B2B con comunidades de desarrolladores. ¿Construyendo infraestructura Kubernetes o productos de IA cloud-native? [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
> 🇪🇸 Esta es la traducción en español. [Versión en inglés](../terraform.md).
|
|
2
|
+
|
|
3
|
+
# Skill de Terraform
|
|
4
|
+
|
|
5
|
+
## Cuándo activar
|
|
6
|
+
- Escribir módulos de Terraform para infraestructura en AWS, GCP o Azure
|
|
7
|
+
- Definir VPCs, subredes, grupos de seguridad y recursos de red
|
|
8
|
+
- Aprovisionar recursos de cómputo (EC2, GKE, AKS, ECS, Lambda)
|
|
9
|
+
- Gestionar infraestructura de bases de datos (RDS, Cloud SQL, Aurora)
|
|
10
|
+
- Configurar roles IAM, políticas y cuentas de servicio
|
|
11
|
+
- Escribir configuración de estado remoto (backend S3, GCS, Terraform Cloud)
|
|
12
|
+
- Refactorizar Terraform existente para usar módulos
|
|
13
|
+
- Escribir pipelines de CI/CD para `terraform plan` y `terraform apply`
|
|
14
|
+
- Importar infraestructura existente al estado de Terraform
|
|
15
|
+
|
|
16
|
+
## Cuándo NO usar
|
|
17
|
+
- Pulumi, CDK o Crossplane — herramientas IaC diferentes, patrones diferentes
|
|
18
|
+
- Configuración de charts de Helm (usar el skill de Kubernetes en su lugar)
|
|
19
|
+
- Configuración a nivel de aplicación (ConfigMaps de Kubernetes, variables de entorno de la app)
|
|
20
|
+
- Operaciones CLI puntuales que no se van a repetir
|
|
21
|
+
|
|
22
|
+
## Instrucciones
|
|
23
|
+
|
|
24
|
+
### Estructura del módulo
|
|
25
|
+
Cada proyecto de Terraform debe seguir esta estructura:
|
|
26
|
+
```
|
|
27
|
+
infrastructure/
|
|
28
|
+
├── modules/
|
|
29
|
+
│ ├── networking/
|
|
30
|
+
│ │ ├── main.tf
|
|
31
|
+
│ │ ├── variables.tf
|
|
32
|
+
│ │ ├── outputs.tf
|
|
33
|
+
│ │ └── versions.tf
|
|
34
|
+
│ └── compute/
|
|
35
|
+
│ ├── main.tf
|
|
36
|
+
│ ├── variables.tf
|
|
37
|
+
│ └── outputs.tf
|
|
38
|
+
├── environments/
|
|
39
|
+
│ ├── production/
|
|
40
|
+
│ │ ├── main.tf ← llama a los módulos
|
|
41
|
+
│ │ ├── variables.tf
|
|
42
|
+
│ │ ├── terraform.tfvars
|
|
43
|
+
│ │ └── backend.tf
|
|
44
|
+
│ └── staging/
|
|
45
|
+
│ └── ...
|
|
46
|
+
└── versions.tf ← versiones del proveedor raíz
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Gestión de estado — siempre remoto
|
|
50
|
+
```hcl
|
|
51
|
+
# backend.tf
|
|
52
|
+
terraform {
|
|
53
|
+
backend "s3" {
|
|
54
|
+
bucket = "company-terraform-state"
|
|
55
|
+
key = "production/networking/terraform.tfstate"
|
|
56
|
+
region = "eu-west-1"
|
|
57
|
+
encrypt = true
|
|
58
|
+
dynamodb_table = "terraform-state-lock"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
- Nunca uses estado local para nada compartido
|
|
63
|
+
- Habilita el cifrado y el bloqueo de estado (DynamoDB para backend S3)
|
|
64
|
+
- Archivos de estado separados por entorno y por módulo (no un estado gigante)
|
|
65
|
+
|
|
66
|
+
### Disciplina de variables y outputs
|
|
67
|
+
```hcl
|
|
68
|
+
# variables.tf — siempre incluir descripción y tipo
|
|
69
|
+
variable "environment" {
|
|
70
|
+
description = "Deployment environment (production, staging, development)"
|
|
71
|
+
type = string
|
|
72
|
+
validation {
|
|
73
|
+
condition = contains(["production", "staging", "development"], var.environment)
|
|
74
|
+
error_message = "Environment must be production, staging, or development."
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# outputs.tf — exportar todo lo que un módulo consumidor pueda necesitar
|
|
79
|
+
output "vpc_id" {
|
|
80
|
+
description = "The ID of the VPC"
|
|
81
|
+
value = aws_vpc.main.id
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Secretos — nunca en el estado ni en el código
|
|
86
|
+
- Nunca pongas secretos en `terraform.tfvars` ni los hardcodees en archivos `.tf`
|
|
87
|
+
- Usa `data "aws_secretsmanager_secret_version"` o `data "google_secret_manager_secret_version"` para leer secretos en el momento de apply
|
|
88
|
+
- Outputs sensibles: márcalos con `sensitive = true` para suprimir en la salida del plan
|
|
89
|
+
- `.gitignore` debe incluir: `*.tfvars`, `*.tfstate`, `*.tfstate.backup`, `.terraform/`
|
|
90
|
+
|
|
91
|
+
### Convenciones de nomenclatura de recursos
|
|
92
|
+
```hcl
|
|
93
|
+
# Nomenclatura consistente: {proyecto}-{entorno}-{recurso}-{sufijo}
|
|
94
|
+
resource "aws_vpc" "main" {
|
|
95
|
+
cidr_block = var.vpc_cidr
|
|
96
|
+
tags = {
|
|
97
|
+
Name = "${var.project}-${var.environment}-vpc"
|
|
98
|
+
Environment = var.environment
|
|
99
|
+
ManagedBy = "terraform"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
Siempre etiqueta cada recurso con `Environment` y `ManagedBy = "terraform"`.
|
|
104
|
+
|
|
105
|
+
### Planificar antes de aplicar — siempre
|
|
106
|
+
- Pipeline CI/CD: `terraform plan -out=tfplan` en el PR, `terraform apply tfplan` al hacer merge
|
|
107
|
+
- Nunca ejecutes `terraform apply` sin un plan guardado en producción
|
|
108
|
+
- Usa `-target` con moderación — crea deriva entre el estado real y el plan
|
|
109
|
+
|
|
110
|
+
### Problemas comunes
|
|
111
|
+
- `terraform destroy` sin `-target` destruye todo — siempre confirma el alcance
|
|
112
|
+
- Cambiar un atributo de recurso que fuerza reemplazo (p.ej., CIDR de VPC) elimina y recrea — revisa el plan con cuidado
|
|
113
|
+
- El versionado del proveedor es obligatorio: usa `~> 5.0` no `>= 5.0`
|
|
114
|
+
- `count` vs `for_each`: usa `for_each` con mapas — `count` causa deriva de índice cuando se eliminan elementos
|
|
115
|
+
|
|
116
|
+
## Ejemplo
|
|
117
|
+
|
|
118
|
+
**Usuario:** Crear un módulo de Terraform para una instancia privada de RDS PostgreSQL en AWS con Multi-AZ, almacenamiento cifrado y un grupo de seguridad dedicado.
|
|
119
|
+
|
|
120
|
+
**Estructura de salida esperada:**
|
|
121
|
+
- `modules/rds/main.tf` — `aws_db_instance`, `aws_db_subnet_group`, `aws_security_group`
|
|
122
|
+
- `modules/rds/variables.tf` — clase de instancia, versión del motor, nombre de la BD, IDs de VPC/subred, CIDR de entrada
|
|
123
|
+
- `modules/rds/outputs.tf` — endpoint, puerto, ID del grupo de seguridad
|
|
124
|
+
- Grupo de seguridad: permite PostgreSQL (5432) solo desde el grupo de seguridad de la app, sin acceso público
|
|
125
|
+
- `storage_encrypted = true`, `multi_az = true`, `deletion_protection = true` para producción
|
|
126
|
+
- Contraseña mediante referencia a `aws_secretsmanager_secret`, nunca hardcodeada
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
> **Trabaja con nosotros:** Claudient está respaldado por [Uitbreiden](https://uitbreiden.com/) — construimos productos de IA y soluciones B2B con comunidades de desarrolladores. ¿Construyendo infraestructura cloud o pipelines IaC? [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
> 🇫🇷 This is the French translation. [English version](../docker.md).
|
|
2
|
+
|
|
3
|
+
# Compétence Docker
|
|
4
|
+
|
|
5
|
+
## Quand activer
|
|
6
|
+
- Rédiger ou optimiser des Dockerfiles pour la production
|
|
7
|
+
- Configurer des builds multi-étapes pour réduire la taille des images
|
|
8
|
+
- Rédiger des fichiers Docker Compose pour le développement local
|
|
9
|
+
- Déboguer des échecs de démarrage de conteneurs ou des problèmes de cache de couches
|
|
10
|
+
- Configurer des utilisateurs non-root, des health checks et la sécurité des images
|
|
11
|
+
- Configurer .dockerignore pour des builds efficaces
|
|
12
|
+
- Rédiger des scripts de build ou des pipelines CI/CD de build Docker
|
|
13
|
+
|
|
14
|
+
## Quand NE PAS utiliser
|
|
15
|
+
- Manifests Kubernetes (utiliser la compétence Kubernetes)
|
|
16
|
+
- Buildpacks (Heroku, Cloud Native Buildpacks) — système de build différent
|
|
17
|
+
- Provisionnement de machines virtuelles (niveau d'abstraction différent)
|
|
18
|
+
- Builds reproductibles basés sur Nix
|
|
19
|
+
|
|
20
|
+
## Instructions
|
|
21
|
+
|
|
22
|
+
### Structure du Dockerfile de production
|
|
23
|
+
Toujours utiliser des builds multi-étapes pour les langages compilés et Node.js :
|
|
24
|
+
|
|
25
|
+
```dockerfile
|
|
26
|
+
# Étape 1 : Build
|
|
27
|
+
FROM node:20-alpine AS builder
|
|
28
|
+
WORKDIR /app
|
|
29
|
+
COPY package*.json ./
|
|
30
|
+
RUN npm ci --only=production
|
|
31
|
+
|
|
32
|
+
# Étape 2 : Runtime — image minimale
|
|
33
|
+
FROM node:20-alpine AS runtime
|
|
34
|
+
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
|
|
35
|
+
WORKDIR /app
|
|
36
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
37
|
+
COPY . .
|
|
38
|
+
USER appuser
|
|
39
|
+
EXPOSE 8080
|
|
40
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
41
|
+
CMD wget -qO- http://localhost:8080/healthz || exit 1
|
|
42
|
+
CMD ["node", "server.js"]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Règles de sécurité
|
|
46
|
+
- Ne jamais s'exécuter en tant que root en production — toujours créer et basculer vers un utilisateur non-root
|
|
47
|
+
- Ne jamais utiliser le tag `latest` — épingler à une version spécifique ou un digest
|
|
48
|
+
- Préférer les images de base Alpine ou distroless plutôt que Debian/Ubuntu complet
|
|
49
|
+
- Ne jamais copier des fichiers `.env` dans l'image — passer les secrets comme variables d'environnement à l'exécution
|
|
50
|
+
- Scanner les images avec `docker scout` ou Trivy avant de pousser en production
|
|
51
|
+
|
|
52
|
+
### Optimisation du cache de couches
|
|
53
|
+
Ordonner les instructions Dockerfile du moins au plus fréquemment modifié :
|
|
54
|
+
1. Image de base (change rarement)
|
|
55
|
+
2. Dépendances système (`apt-get`, `apk add`)
|
|
56
|
+
3. Fichiers du gestionnaire de paquets (`package.json`, `requirements.txt`)
|
|
57
|
+
4. Installation des paquets (`npm ci`, `pip install`)
|
|
58
|
+
5. Code applicatif (`COPY . .`) — change le plus souvent, doit être en dernier
|
|
59
|
+
|
|
60
|
+
### .dockerignore — toujours inclure
|
|
61
|
+
```
|
|
62
|
+
node_modules/
|
|
63
|
+
.git/
|
|
64
|
+
.env
|
|
65
|
+
.env.*
|
|
66
|
+
*.md
|
|
67
|
+
Dockerfile*
|
|
68
|
+
docker-compose*
|
|
69
|
+
.dockerignore
|
|
70
|
+
coverage/
|
|
71
|
+
.nyc_output/
|
|
72
|
+
__pycache__/
|
|
73
|
+
*.pyc
|
|
74
|
+
.pytest_cache/
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Docker Compose pour le développement local
|
|
78
|
+
```yaml
|
|
79
|
+
services:
|
|
80
|
+
app:
|
|
81
|
+
build:
|
|
82
|
+
context: .
|
|
83
|
+
target: builder # Utiliser l'étape de build, pas l'étape runtime en local
|
|
84
|
+
volumes:
|
|
85
|
+
- .:/app # Hot reload
|
|
86
|
+
- /app/node_modules # Ne pas écraser les node_modules du conteneur
|
|
87
|
+
ports:
|
|
88
|
+
- "8080:8080"
|
|
89
|
+
environment:
|
|
90
|
+
- NODE_ENV=development
|
|
91
|
+
depends_on:
|
|
92
|
+
db:
|
|
93
|
+
condition: service_healthy
|
|
94
|
+
|
|
95
|
+
db:
|
|
96
|
+
image: postgres:16-alpine
|
|
97
|
+
environment:
|
|
98
|
+
POSTGRES_USER: app
|
|
99
|
+
POSTGRES_PASSWORD: dev_password # Dev uniquement — jamais en production
|
|
100
|
+
POSTGRES_DB: appdb
|
|
101
|
+
ports:
|
|
102
|
+
- "5432:5432"
|
|
103
|
+
healthcheck:
|
|
104
|
+
test: ["CMD-SHELL", "pg_isready -U app -d appdb"]
|
|
105
|
+
interval: 5s
|
|
106
|
+
timeout: 5s
|
|
107
|
+
retries: 5
|
|
108
|
+
volumes:
|
|
109
|
+
- postgres_data:/var/lib/postgresql/data
|
|
110
|
+
|
|
111
|
+
volumes:
|
|
112
|
+
postgres_data:
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Échecs de build courants
|
|
116
|
+
- `COPY` échoue silencieusement si la source n'existe pas — vérifier que `.dockerignore` n'exclut pas les fichiers nécessaires
|
|
117
|
+
- Cache de couche invalidé de façon inattendue — vérifier si un `COPY` avant les étapes d'installation récupère des fichiers modifiés
|
|
118
|
+
- Permission refusée à l'exécution — vérifier la propriété des fichiers lors de l'utilisation de `COPY --from` avec un utilisateur non-root
|
|
119
|
+
|
|
120
|
+
## Exemple
|
|
121
|
+
|
|
122
|
+
**Utilisateur :** Rédiger un Dockerfile de production pour une application Python FastAPI avec build multi-étapes, utilisateur non-root et health check.
|
|
123
|
+
|
|
124
|
+
**Sortie attendue :**
|
|
125
|
+
- Étape 1 (builder) : `python:3.12-slim`, installer les dépendances avec `pip install --no-cache-dir`
|
|
126
|
+
- Étape 2 (runtime) : `python:3.12-slim`, utilisateur non-root, copier uniquement les wheels/deps depuis le builder + code applicatif
|
|
127
|
+
- `HEALTHCHECK` ciblant l'endpoint `/healthz`
|
|
128
|
+
- `CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]`
|
|
129
|
+
- `.dockerignore` couvrant `__pycache__`, `.env`, `.git`, `*.pyc`
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
> **Travaillez avec nous :** Claudient est soutenu par [Uitbreiden](https://uitbreiden.com/) — nous construisons des produits IA et des solutions B2B avec des communautés de développeurs. Vous containerisez des workloads IA ou construisez des systèmes cloud-native ? [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
> 🇫🇷 This is the French translation. [English version](../github-actions.md).
|
|
2
|
+
|
|
3
|
+
# Compétence GitHub Actions
|
|
4
|
+
|
|
5
|
+
## Quand activer
|
|
6
|
+
- Rédiger des pipelines CI/CD pour les tests, le lint, le build et le déploiement
|
|
7
|
+
- Configurer des builds matrix sur plusieurs OS ou versions de langage
|
|
8
|
+
- Configurer des règles de protection d'environnement et des gates de déploiement
|
|
9
|
+
- Rédiger des workflows réutilisables ou des actions composites
|
|
10
|
+
- Configurer le build Docker et le push vers un registre de conteneurs
|
|
11
|
+
- Configurer l'authentification OIDC vers les fournisseurs cloud (pas de secrets longue durée)
|
|
12
|
+
- Déboguer des workflows en échec ou comprendre des erreurs de syntaxe de workflow
|
|
13
|
+
- Configurer le cache des dépendances (npm, pip, modules Go)
|
|
14
|
+
|
|
15
|
+
## Quand NE PAS utiliser
|
|
16
|
+
- GitLab CI, CircleCI, Jenkins — systèmes de pipeline différents
|
|
17
|
+
- Automatisation du développement local (utiliser Makefile ou des scripts)
|
|
18
|
+
- Tâches cron non liées à un dépôt (utiliser le planificateur cloud)
|
|
19
|
+
|
|
20
|
+
## Instructions
|
|
21
|
+
|
|
22
|
+
### Structure du fichier workflow
|
|
23
|
+
```yaml
|
|
24
|
+
name: CI
|
|
25
|
+
|
|
26
|
+
on:
|
|
27
|
+
push:
|
|
28
|
+
branches: [main]
|
|
29
|
+
pull_request:
|
|
30
|
+
branches: [main]
|
|
31
|
+
|
|
32
|
+
# Permissions explicites — ne jamais utiliser write-all par défaut
|
|
33
|
+
permissions:
|
|
34
|
+
contents: read
|
|
35
|
+
pull-requests: write # Uniquement si nécessaire (ex: poster des commentaires)
|
|
36
|
+
|
|
37
|
+
jobs:
|
|
38
|
+
test:
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
- name: Set up Node.js
|
|
43
|
+
uses: actions/setup-node@v4
|
|
44
|
+
with:
|
|
45
|
+
node-version: '20'
|
|
46
|
+
cache: 'npm'
|
|
47
|
+
- run: npm ci
|
|
48
|
+
- run: npm test
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Permissions — toujours explicites
|
|
52
|
+
Ne jamais utiliser `permissions: write-all` par défaut. Toujours déclarer les permissions minimales requises :
|
|
53
|
+
```yaml
|
|
54
|
+
permissions:
|
|
55
|
+
contents: read # Lire le dépôt
|
|
56
|
+
packages: write # Pousser vers GitHub Container Registry
|
|
57
|
+
id-token: write # OIDC pour l'auth cloud
|
|
58
|
+
pull-requests: write # Commenter les PRs
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Secrets — OIDC plutôt que des credentials longue durée
|
|
62
|
+
Utiliser OIDC (OpenID Connect) pour l'authentification cloud — pas de secrets stockés :
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
# AWS OIDC — pas besoin de AWS_ACCESS_KEY_ID
|
|
66
|
+
- name: Configure AWS credentials
|
|
67
|
+
uses: aws-actions/configure-aws-credentials@v4
|
|
68
|
+
with:
|
|
69
|
+
role-to-assume: arn:aws:iam::123456789:role/github-actions-role
|
|
70
|
+
aws-region: eu-west-1
|
|
71
|
+
|
|
72
|
+
# GCP OIDC
|
|
73
|
+
- name: Authenticate to GCP
|
|
74
|
+
uses: google-github-actions/auth@v2
|
|
75
|
+
with:
|
|
76
|
+
workload_identity_provider: projects/123/locations/global/workloadIdentityPools/pool/providers/github
|
|
77
|
+
service_account: deploy@project.iam.gserviceaccount.com
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Cache des dépendances
|
|
81
|
+
Toujours mettre en cache les dépendances pour réduire le temps de build :
|
|
82
|
+
```yaml
|
|
83
|
+
# Node.js
|
|
84
|
+
- uses: actions/setup-node@v4
|
|
85
|
+
with:
|
|
86
|
+
node-version: '20'
|
|
87
|
+
cache: 'npm' # Cache intégré — pas d'étape de cache manuelle nécessaire
|
|
88
|
+
|
|
89
|
+
# Python
|
|
90
|
+
- uses: actions/setup-python@v5
|
|
91
|
+
with:
|
|
92
|
+
python-version: '3.12'
|
|
93
|
+
cache: 'pip'
|
|
94
|
+
|
|
95
|
+
# Go
|
|
96
|
+
- uses: actions/setup-go@v5
|
|
97
|
+
with:
|
|
98
|
+
go-version: '1.22'
|
|
99
|
+
cache: true
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Gates d'environnement pour les déploiements en production
|
|
103
|
+
```yaml
|
|
104
|
+
jobs:
|
|
105
|
+
deploy-production:
|
|
106
|
+
environment: production # Référence l'environnement GitHub avec des règles de protection
|
|
107
|
+
needs: [test, build]
|
|
108
|
+
runs-on: ubuntu-latest
|
|
109
|
+
steps:
|
|
110
|
+
- name: Deploy
|
|
111
|
+
run: ./scripts/deploy.sh
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Configurer des règles de protection d'environnement dans les paramètres GitHub :
|
|
115
|
+
- Réviseurs requis pour les déploiements en production
|
|
116
|
+
- Timer d'attente entre staging et production
|
|
117
|
+
- Restreindre aux branches spécifiques (uniquement `main`)
|
|
118
|
+
|
|
119
|
+
### Builds matrix
|
|
120
|
+
```yaml
|
|
121
|
+
jobs:
|
|
122
|
+
test:
|
|
123
|
+
strategy:
|
|
124
|
+
matrix:
|
|
125
|
+
node-version: [18, 20, 22]
|
|
126
|
+
os: [ubuntu-latest, windows-latest]
|
|
127
|
+
fail-fast: false # Ne pas annuler tout au premier échec
|
|
128
|
+
runs-on: ${{ matrix.os }}
|
|
129
|
+
steps:
|
|
130
|
+
- uses: actions/checkout@v4
|
|
131
|
+
- uses: actions/setup-node@v4
|
|
132
|
+
with:
|
|
133
|
+
node-version: ${{ matrix.node-version }}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Workflows réutilisables
|
|
137
|
+
```yaml
|
|
138
|
+
# .github/workflows/deploy.yml — réutilisable
|
|
139
|
+
on:
|
|
140
|
+
workflow_call:
|
|
141
|
+
inputs:
|
|
142
|
+
environment:
|
|
143
|
+
required: true
|
|
144
|
+
type: string
|
|
145
|
+
secrets:
|
|
146
|
+
deploy-token:
|
|
147
|
+
required: true
|
|
148
|
+
|
|
149
|
+
# Appelant
|
|
150
|
+
jobs:
|
|
151
|
+
deploy:
|
|
152
|
+
uses: ./.github/workflows/deploy.yml
|
|
153
|
+
with:
|
|
154
|
+
environment: production
|
|
155
|
+
secrets:
|
|
156
|
+
deploy-token: ${{ secrets.DEPLOY_TOKEN }}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Échecs courants
|
|
160
|
+
- `actions/checkout@v4` manquant — toujours la première étape
|
|
161
|
+
- Secrets non accessibles dans les forks — utiliser `pull_request_target` avec précaution (risque de sécurité)
|
|
162
|
+
- Cache non trouvé — la clé doit correspondre exactement ; utiliser `restore-keys` comme solution de repli
|
|
163
|
+
- OIDC échoue — vérifier que la politique de confiance côté fournisseur cloud autorise le dépôt et la branche
|
|
164
|
+
|
|
165
|
+
## Exemple
|
|
166
|
+
|
|
167
|
+
**Utilisateur :** Rédiger un pipeline CI/CD pour une application Node.js : exécuter les tests sur les PRs, build et push de l'image Docker lors de la fusion sur main, déployer en production avec une gate d'approbation manuelle.
|
|
168
|
+
|
|
169
|
+
**Sortie attendue :**
|
|
170
|
+
- Déclencheurs `on: push/pull_request`
|
|
171
|
+
- Job `test` : checkout, setup-node avec cache, `npm ci`, `npm test`
|
|
172
|
+
- Job `build` (sur push vers main, dépend de test) : Docker build + push vers GHCR avec OIDC
|
|
173
|
+
- Job `deploy` : `environment: production` (nécessite une approbation), appelle le script de déploiement
|
|
174
|
+
- Bloc `permissions:` explicite — minimum requis
|
|
175
|
+
- Pas de secrets codés en dur — OIDC pour l'auth au registre
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
> **Travaillez avec nous :** Claudient est soutenu par [Uitbreiden](https://uitbreiden.com/) — nous construisons des produits IA et des solutions B2B avec des communautés de développeurs. Vous construisez de la CI/CD pour des produits IA ou des déploiements cloud ? [uitbreiden.com](https://uitbreiden.com/)
|