# Bake con Docker GitHub Builder


El [flujo de trabajo reutilizable `bake.yml`](https://github.com/docker/github-builder?tab=readme-ov-file#bake-reusable-workflow)
compila a partir de una [definición de Bake](/build/bake/) en lugar de un
conjunto de entradas de Dockerfile. Esta página muestra cómo llamar al flujo de trabajo para un target, cómo pasar
anulaciones y variables de Bake, y cómo exportar la salida local cuando un archivo de Bake
ya es la fuente de verdad para tu compilación.

## Compilar y enviar un target de Bake

El siguiente flujo de trabajo compila el target `image` desde `docker-bake.hcl` y
publica el resultado con etiquetas generadas a partir de [entradas de metadatos](/build/ci/github-actions/manage-tags-labels/):

```yaml
name: ci

on:
  push:
    branches:
      - "main"
    tags:
      - "v*"
  pull_request:

permissions:
  contents: read

jobs:
  bake:
    uses: docker/github-builder/.github/workflows/bake.yml@v1
    permissions:
      contents: read # para obtener el contenido del repositorio
      id-token: write # para firmar atestaciones con el token OIDC de GitHub
    with:
      output: image
      push: ${{ github.event_name != 'pull_request' }}
      target: image
      meta-images: name/app
      meta-tags: |
        type=ref,event=branch
        type=ref,event=pr
        type=semver,pattern={{version}}
    secrets:
      registry-auths: |
        - registry: docker.io
          username: ${{ vars.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
```

Los flujos de trabajo de Bake compilan un target por llamada de flujo de trabajo. No se admiten grupos ni
compilaciones de múltiples targets porque la [procedencia SLSA](/build/ci/github-actions/attestations/), el manejo de
resúmenes (digests) y la creación de manifiestos están limitados a un único target.

El flujo de trabajo valida la definición antes de que comience la compilación y resuelve
el target a partir de los archivos que pases en `files`. La selección del runner utiliza la misma
entrada `runner` que el flujo de trabajo de compilación. Establece una única etiqueta de runner de Linux
alojado en GitHub o una asignación de plataformas cuando la asignación predeterminada no sea suficiente. Para obtener detalles,
consulta la [selección de runners (runner selection)](/build/ci/github-actions/github-builder/bake/architecture/#runner-selection).

## Anular valores de target y variables

Dado que el flujo de trabajo delega la compilación a Bake, puedes seguir utilizando `set` y
`vars` para anulaciones específicas del target:

```yaml
name: ci

on:
  push:
    branches:
      - "main"

permissions:
  contents: read

jobs:
  bake:
    uses: docker/github-builder/.github/workflows/bake.yml@v1
    permissions:
      contents: read # para obtener el contenido del repositorio
      id-token: write # para firmar atestaciones con el token OIDC de GitHub
    with:
      output: image
      push: true
      target: image
      vars: |
        IMAGE_TAG=${{ github.sha }}
      set: |
        *.args.BUILD_RUN_ID=${{ github.run_id }}
        *.platform=linux/amd64,linux/arm64
      cache: true
      cache-scope: image
      meta-images: name/app
      meta-tags: |
        type=sha
      set-meta-annotations: true
    secrets:
      registry-auths: |
        - registry: docker.io
          username: ${{ vars.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
```

Esta forma se adapta a los repositorios que ya utilizan grupos de Bake, herencia de targets y
expansión de variables. El flujo de trabajo reutilizable se encarga de la configuración de Buildx,
la [exportación de caché a GitHub Actions](/build/cache/backends/gha/), los
[valores predeterminados de procedencia](/build/metadata/attestations/slsa-provenance/),
el comportamiento de firma y el manifiesto multiplataforma final. Las etiquetas y anotaciones de
metadatos se pueden fusionar en la definición de Bake sin añadir un paso de metadatos independiente
a tu flujo de trabajo.

## Exportar salida local desde Bake

Si el target debe exportar archivos en lugar de publicar una imagen, cambia la salida del
flujo de trabajo a `local` y sube el artefacto:

```yaml
name: ci

on:
  pull_request:

permissions:
  contents: read

jobs:
  bake:
    uses: docker/github-builder/.github/workflows/bake.yml@v1
    permissions:
      contents: read # para obtener el contenido del repositorio
      id-token: write # para firmar atestaciones con el token OIDC de GitHub
    with:
      output: local
      target: binaries
      artifact-upload: true
      artifact-name: bake-output
```

Con `output: local`, el flujo de trabajo inyecta la anulación de salida local correspondiente
en la ejecución de Bake y fusiona los artefactos subidos una vez que finalizan las compilaciones de cada
plataforma. Si necesitas un patrón de Bake manual que permanezca en un trabajo normal,
consulta [Imagen multiplataforma](/build/ci/github-actions/multi-platform/). Si tu compilación no necesita una
definición de Bake, utiliza [build.yml](/build/ci/github-actions/github-builder/bake/build/) en su lugar.

