Este sitio utiliza cookies para garantizar que obtenga la mejor experiencia en nuestro sitio web.

Deploy con GitHub Actions y ArgoCD: simplificando el proceso

¡Hola, DevOps! En este post dejamos todo listo para que montes un pipeline de build y deploy de tu aplicación usando GitHub Actions y ArgoCD. Si ya manejas GitHub y ArgoCD, mejor aún — irás más rápido.

CloudScript Technology
5 de noviembre de 20243 min de lectura
Deploy con GitHub Actions y ArgoCD: simplificando el proceso

¡Hola, DevOps! ¿Todo bien?

En este post, vamos a dejar todo listo para que armes una pipeline de build y deploy de tu aplicación usando GitHub Actions y ArgoCD. Si ya manejas GitHub y ArgoCD, mejor aún, porque la idea acá es ir directo al punto.

¿Vamos?

Paso 1: Organiza la casa con una carpeta para los objetos de Kubernetes

Vamos a crear una carpeta llamada deploy con dos archivos:

$ cd /path/to/your/repository
$ mkdir deploy

La estructura final quedará así:

deploy/
├── deployment.yaml
└── service.yaml

Crea el archivo deployment.yaml dentro de la carpeta deploy y agrega el contenido de abajo:

$ cd deploy
$ touch deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minha-api
  labels:
    app: minha-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minha-api
  template:
    metadata:
      labels:
        app: minha-api
    spec:
      containers:
        - name: minha-api-container
          image: usuario/minha-api:latest # aquí va la dirección de la imagen en tu registry
          ports:
            - containerPort: 8080
          env:
            - name: NODE_ENV
              value: "production"
            - name: PORT
              value: "8080"
          resources:
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "128Mi"
              cpu: "500m"

deploy/deployment.yaml

Archivo deploy/service.yaml

$ cd deploy
$ touch service.yaml
apiVersion: v1
kind: Service
metadata:
  name: minha-api-service
  labels:
    app: minha-api
spec:
  selector:
    app: minha-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

deploy/service.yaml

Paso 2: Prepara el Dockerfile para ejecutar todo en contenedor

Crea otro archivo en tu repositorio con el nombre "Dockerfile". Cada aplicación puede necesitar un Dockerfile específico, pero acá va un ejemplo que funciona bien para una aplicación Golang:

$ cd /path/to/your/repository
$ touch Dockerfile
FROM golang:1.23.1-alpine AS builder
WORKDIR /api
COPY . .
RUN go mod tidy
RUN go build -o main cmd/main.go


FROM alpine:3.19.1 AS release
RUN apk --no-cache add ca-certificates
WORKDIR /api
COPY --from=builder /api/main .
RUN chmod +x main
EXPOSE 8080
CMD ["./main"]

Dockerfile

Paso 3: Configura la Action para build y deploy

Ahora viene el toque final: configurar la GitHub Action. Con ella, cada vez que hagas un push, la pipeline se encargará de construir y desplegar la aplicación. En este ejemplo vamos a usar Kaniko para hacer build y push de la imagen a tu repositorio de imágenes. Crea un archivo .github/workflows/deploy.yml con el contenido siguiente:

$ cd /path/to/your/repository
$ mkdir .github/workflows
$ cd .github/workflows/
$ touch deploy.yml
name: build and deploy

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Build and push Docker image with Kaniko
        uses: gcr.io/kaniko-project/executor:latest
        env:
          DOCKER_CONFIG: /kaniko/.docker/
          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
        with:
          args: |
            --context .
            --dockerfile ./Dockerfile
            --destination usuario/minha-api:v1.0.0

  deploy:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up ArgoCD CLI
        run: |
          curl -sSL -o argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
          chmod +x argocd
          sudo mv argocd /usr/local/bin/

      - name: Deploy to Kubernetes using ArgoCD
        run: |
          argocd app create my-app \
              --server my-argocd.my-domain.com.br \
              --auth-token ${{ secrets.ARGOCD_TOKEN }} \
              --repo https://github.com/usuario/repo \
              --path deploy/ \
              --dest-server https://kubernetes.default.svc \
              --grpc-web \
              --http-retry-max 3 \
              --revision main \
              --upsert \
              --dest-namespace default

          argocd app sync my-app \
              --grpc-web \
              --server my-argocd.my-domain.com.br \
              --force \
              --retry-limit 3 \
              --timeout "300" \
              --auth-token ${{ secrets.ARGOCD_TOKEN }}

.github/workflows/deploy.yml

Conclusión

¡Y listo! Solo tienes que commitear este código en tu Github y la pipeline debería iniciar. Este workflow hace el checkout del código, instala las dependencias, ejecuta los tests, construye la aplicación y la imagen Docker, y finaliza con el deploy usando ArgoCD. Ahora solo hay que relajarse y dejar que la pipeline haga el trabajo pesado.

¿Necesitas implementar flujos de pipelines más complejos? Nosotros en Cloudscript estamos acá para ayudarte. Siéntete libre de ponerte en contacto con nosotros.

Saludos,

Jonathan Schmitt.

Mantente al día

Recibe nuestros artículos sobre DevOps, Kubernetes, Platform Engineering y Cloud Native directamente en tu correo.

Sin spam. Cancela cuando quieras.