Una vez el ciclo de CI ha sido completo (nuestra versión reducida será test y build) seguirá el deploy, donde usaremos el servicio bajo el que hemos subido la imagen en la etapa de build y usaremos los Actions del distribuidor para desplegar el aplicativo.

CD: Deploy

Al igual que en la etapa de build, elegiremos qué proveedor usaremos, para esto crearemos un input donde el valor por defecto será AWS y las otras opciones serán GCP y Azure.

name: "Flujo CD"
run-name: "Flujo CD"
on:
  workflow_dispatch:
    inputs:
      cloud:
        description: "Proveedor Cloud"
        required: true
        default: "AWS"
        options: ["AWS", "GCP", "Azure"]

Jobs: AWS

La primer opción será la de AWS, para esta configuraremos los credenciales de AWS con un Action oficial de este proveedor donde debemos entregar la access-key, la secret-access-key y la región donde deseamos desplegar (esta debe coincidir con la del paso anterior).

El siguiente step será el de crear un archivo de configuración para el AppRunner (este será el que nos ayudará a hacer el deploy), para esto configuramos un JSON con diferentes llaves declarando el identificador de la imagen y el tipo de repositorio (se usa público para tener una capa gratuita de buena capacidad).

El step final será el de actualizar la app con el AppRunner de AWS, para esto correremos el comando update-service indicando el archivo de configuración que debe leer.

jobs:
  aws:
    runs-on: ubuntu-latest
    if: github.event.inputs.cloud == 'AWS'
    steps:
      - name: "Configurar credenciales de AWS"
        uses: aws-actions/configure-aws-credentials@e1e17a757e536f70e52b5a12b2e8d1d1c60e04ef #v2 #v2.0.0
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ vars.AWS_REGION }}
      - name: Crear archivo de configuración para AppRunner
        run:  |
          echo '{
            "ServiceArn": "${{ vars.AWS_APPRUNNER_ARN}}",
            "SourceConfiguration": {
                "ImageRepository": {
                    "ImageIdentifier": "${{ vars.AWS_REGISTRY }}/${{ vars.AWS_REGISTRY_ALIAS }}/${{ vars.AWS_REPOSITORY }}:latest",
                    "ImageRepositoryType": "ECR_PUBLIC"
                }
            }
          }' > apprunner.json
      - name: Actualizar app en AWS App Runner
        run: |
          aws apprunner update-service \\
            --cli-input-json file://apprunner.json

Jobs: GCP