Repositorio central de GitHub Actions reutilizables para los proyectos de OGTIC.
Aquí se mantienen las composite actions que cualquier repositorio de la organización puede utilizar en sus pipelines de CI/CD. La idea es tener un solo lugar donde vivan las operaciones comunes de despliegue, en vez de duplicar configuraciones entre proyectos.
Actualmente el foco está en despliegues a GCP Cloud Run, pero el repositorio se irá expandiendo con actions para otros proveedores y servicios según las necesidades lo requieran.
actions/
├── docker/
│ └── build/ Build y push de imágenes Docker (GAR, GHCR, Docker Hub)
└── gcp/
├── auth/ Autenticación a GCP (JSON key o Workload Identity)
└── cloudrun/
├── deploy/ Despliegue a Cloud Run
├── iam/ Control de acceso público/privado
└── cleanup/ Eliminación de servicios
# .github/workflows/deploy.yml en tu repositorio
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- name: Build y push de imagen
id: build
uses: ogticrd/actions/actions/docker/build@main
with:
image-name: ${{ vars.GOOGLE_ARTIFACT_REGISTRY }}/${{ vars.APP_NAME }}
registry-username: _json_key
registry-password: ${{ secrets.GAR_JSON_KEY }}
- name: Autenticación a GCP
uses: ogticrd/actions/actions/gcp/auth@main
with:
project-id: ${{ vars.GOOGLE_PROJECT_ID }}
credentials-json: ${{ secrets.GAR_JSON_KEY }}
- name: Deploy a Cloud Run
uses: ogticrd/actions/actions/gcp/cloudrun/deploy@main
with:
image: ${{ steps.build.outputs.primary-image }}
service: ${{ vars.APP_NAME }}
region: ${{ vars.GOOGLE_CLOUD_REGION }}
- name: Permitir acceso público
uses: ogticrd/actions/actions/gcp/cloudrun/iam@main
with:
service: ${{ vars.APP_NAME }}
region: ${{ vars.GOOGLE_CLOUD_REGION }}Construye y sube imágenes Docker a cualquier registry compatible con OCI.
- uses: ogticrd/actions/actions/docker/build@main
with:
registry: us-docker.pkg.dev # default
registry-username: _json_key
registry-password: ${{ secrets.GAR_JSON_KEY }}
image-name: project-id/repo/app
target: runner # opcional, para multi-stage
build-args: | # opcional
NEXT_PUBLIC_API_URL=${{ vars.API_URL }}
environment: production # opcional, agrega tag
cache-strategy: registry # registry (default), gha, none| Output | Descripción |
|---|---|
image |
Todos los tags generados |
primary-image |
Tag con SHA corto (para usar en deploy) |
digest |
Digest de la imagen |
image-tag |
SHA corto (7 caracteres) |
Autenticación a Google Cloud. Soporta JSON key y Workload Identity Federation.
# JSON key (método actual)
- uses: ogticrd/actions/actions/gcp/auth@main
with:
project-id: ${{ vars.GOOGLE_PROJECT_ID }}
credentials-json: ${{ secrets.GAR_JSON_KEY }}# Workload Identity Federation
- uses: ogticrd/actions/actions/gcp/auth@main
with:
project-id: ${{ vars.GOOGLE_PROJECT_ID }}
workload-identity-provider: projects/123/locations/global/workloadIdentityPools/pool/providers/provider
service-account: sa@project.iam.gserviceaccount.comDespliega una imagen a Cloud Run con escalabilidad y variables de entorno configurables.
- uses: ogticrd/actions/actions/gcp/cloudrun/deploy@main
with:
image: us-docker.pkg.dev/project/repo/app:abc1234
service: my-service
region: us-east1
project-id: my-project
env-vars: |
NODE_ENV=production
DATABASE_URL=${{ secrets.DATABASE_URL }}
min-instances: "1"
max-instances: "100"
cpu: "2"
memory: 1Gi
vpc-connector: projects/my-project/locations/us-east1/connectors/us-east1| Output | Descripción |
|---|---|
url |
URL del servicio desplegado |
revision |
Nombre de la revisión |
Controla si el servicio es público o privado.
# Público (default)
- uses: ogticrd/actions/actions/gcp/cloudrun/iam@main
with:
service: my-service
region: us-east1
# Privado
- uses: ogticrd/actions/actions/gcp/cloudrun/iam@main
with:
service: my-service
region: us-east1
allow-unauthenticated: "false"Elimina un servicio de Cloud Run. Verifica que el servicio exista antes de intentar borrarlo.
- uses: ogticrd/actions/actions/gcp/cloudrun/cleanup@main
with:
service: my-app-pr-42
region: us-east1Las variables de entorno para Cloud Run se pasan en formato KEY=VALUE, una por línea. Se pueden incluir comentarios y líneas vacías:
env-vars: |
# Configuración general
NODE_ENV=production
# Secrets del repositorio
DATABASE_URL=${{ secrets.DATABASE_URL }}
API_KEY=${{ secrets.API_KEY }}
# Variables del repositorio
SENTRY_DSN=${{ vars.SENTRY_DSN }}La action se encarga de convertir esto al formato que Cloud Run necesita. En los logs se imprimen los nombres de las variables (no los valores) para facilitar el debugging.
- uses: ogticrd/actions/actions/docker/build@main
with:
registry-username: _json_key
registry-password: ${{ secrets.GAR_JSON_KEY }}
image-name: project-id/repo/app- uses: ogticrd/actions/actions/docker/build@main
with:
registry: ghcr.io
registry-username: ${{ github.actor }}
registry-password: ${{ secrets.GITHUB_TOKEN }}
image-name: ${{ github.repository }}/app
cache-strategy: gha| Variable | Descripción | Ejemplo |
|---|---|---|
APP_NAME |
Nombre de la aplicación | my-app |
GOOGLE_PROJECT_ID |
ID del proyecto en GCP | ogtic-project-123 |
GOOGLE_CLOUD_REGION |
Región de Cloud Run | us-east1 |
GOOGLE_ARTIFACT_REGISTRY |
Path del registry en GAR | us-docker.pkg.dev/project-id/repo |
| Secreto | Descripción |
|---|---|
GAR_JSON_KEY |
JSON key del service account de GCP |
En la carpeta examples/ hay workflows completos listos para copiar:
simple-deploy.yml— Despliegue mínimo en un solo jobfull-pipeline.yml— Build y deploy con variables de entorno, scaling y VPCmulti-environment.yml— Pipeline con dev, staging y producción, incluyendo cleanup de PRs
MIT