# Despliega desde Forgejo y Gitea Actions

Forgejo y Gitea Actions leen archivos de flujo al estilo de GitHub. Lo que cambia aquí: el flujo vive en `.forgejo/workflows/` (Gitea: `.gitea/workflows/`), el runner necesita Docker y la imagen va al **registro de paquetes de tu instancia**, no a GHCR.

Requisitos: un runner con la etiqueta usada en `runs-on` y acceso a un demonio de Docker, un Workload en marcha, el id de su instancia de servicio, el [token de despliegue](/es/guides/ci/overview#crea-un-token-que-solo-pueda-desplegar) y [`zaroz-deploy.sh`](/es/guides/ci/shell) como `deploy/zaroz-deploy.sh`.

## Secretos y variables

En **Settings > Actions** del repositorio (o de la organización):

| Nombre | Tipo | Valor |
|---|---|---|
| `ZAROZ_TOKEN` | secreto | el token de despliegue `zaroz_...` |
| `ZAROZ_SERVICE` | variable | el UUID de la instancia de servicio |
| `REGISTRY_HOST` | variable | el host de tu instancia, por ejemplo `git.example.com` |
| `REGISTRY_USERNAME` | variable | la cuenta propietaria de los paquetes |
| `REGISTRY_PASSWORD` | secreto | un token de acceso con `write:package` (para subir) |
| `REGISTRY_PULL_TOKEN` | secreto | para un paquete privado: un token con solo `read:package`. Zaroz usa este para descargar |

## El flujo

```yaml
# .forgejo/workflows/deploy.yml   (Gitea Actions reads .gitea/workflows/ instead; same file)
name: deploy

on:
  push:
    branches: [main]

concurrency:
  group: deploy-production
  cancel-in-progress: false

jobs:
  deploy:
    runs-on: docker
    steps:
      - uses: actions/checkout@v4
      - name: Install tools
        run: apt-get update -qq && apt-get install -y -qq curl jq
      - name: Build and push
        id: build
        env:
          REGISTRY: ${{ vars.REGISTRY_HOST }}                # git.example.com
          REGISTRY_USERNAME: ${{ vars.REGISTRY_USERNAME }}
          REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} # package write token
        run: |
          IMAGE="$REGISTRY/${GITHUB_REPOSITORY,,}:$(echo "$GITHUB_SHA" | cut -c1-12)"
          echo "$REGISTRY_PASSWORD" | docker login "$REGISTRY" -u "$REGISTRY_USERNAME" --password-stdin
          docker build -t "$IMAGE" .
          docker push "$IMAGE"
          echo "image=$IMAGE" >> "$GITHUB_OUTPUT"
      - name: Deploy to Zaroz
        run: sh deploy/zaroz-deploy.sh
        env:
          IMAGE: ${{ steps.build.outputs.image }}
          ZAROZ_TOKEN: ${{ secrets.ZAROZ_TOKEN }}
          ZAROZ_SERVICE: ${{ vars.ZAROZ_SERVICE }}
          # A private package needs a pull-only token, separate from the push one:
          REGISTRY_USERNAME: ${{ vars.REGISTRY_USERNAME }}
          REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PULL_TOKEN }}
```


Cómo se comporta:

- La imagen es `<host>/<propietario>/<repo>:<sha de 12 caracteres>`. Un paquete es privado por defecto; hazlo público para desplegar sin token de descarga.
- `concurrency` encola los pushes, como en las otras guías.
- Zaroz descarga desde dentro de su clúster, así que la instancia debe ser accesible desde internet por HTTPS con un certificado válido.
- Si tu runner no tiene el binario `docker`, construye con Kaniko o Buildah en un contenedor del trabajo; solo cambia el paso `Build and push`.

## Revertir

Vuelve a ejecutar el flujo de un commit anterior desde la pestaña **Actions**, o ejecuta el script tú mismo con `IMAGE=<host>/<propietario>/<repo>:<sha antiguo>`.
