¡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 deployLa estructura final quedará así:
deploy/
├── deployment.yaml
└── service.yamlCrea el archivo deployment.yaml dentro de la carpeta deploy y agrega el contenido de abajo:
$ cd deploy
$ touch deployment.yamlapiVersion: 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.yamlapiVersion: 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 DockerfileFROM 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.ymlname: 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,