Vamos a pasar el pipeline que hicimos en Azure Devops a Github Actions.
## ¿Qué es Github Actions?
Es una plataforma de integración continua (CI) y Continuous Delivery (CD) para el desarrollo de código.
Este servicio que proporciona GitHub tiene costo, pero cuenta con una versión [gratis](https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions).
A la escritura de este post el plan gratis te da lo siguiente:
- Storage: 500 MB
- 2,000 Minutos (per month)
Tip, al igual que Azure DevOps (agent pools), en GitHub Actions puedes configurar **self-hosted runners** para que se ejecuten en tu propio servidor/equipo y esto es libre de los minutos que te dan gratis. Hay ciertos requisitos por ejemplo: si vas a usar docker, debe ser en un equipo con Linux, te dejo toda la información [aquí](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).
**Nota** Si quieres saber cómo hacer un self-hosted runner, deja tu comentario y te enseñaré a hacerlo.
Mientras que en Azure DevOps se llaman pipelines, en Github Actions se llaman **workflows**.
**Nota:** El ejemplo que estoy mostrándo consta de dos repositorios:
a. El repositorio con el código de la aplicación. Este repositorio es en el que realizamos las configuraciones del workflow
[Link aquí](https://github.com/ahioros/workflow-react-example)
b. El repositorio con el código de los manifests para kubernetes.
[Link aquí](https://github.com/ahioros/deploy-workflow-react-example)
## Configuración de Github Actions Workflows
### Prerequisitos
En el ejemplo que vamos a desarrollar tenemos que hacer unas configuraciones:
1. Configurar permisos de GitHub Actions workflow:
Ve a repo settings -> Actions -> General -> Workflow Permissions:
2. Crear PAT (Personal Access Token):
Ve a tu GitHub perfil -> Settings -> Developer settings -> Personal access tokens -> Tokens(classic):
3. Crear secrets para el repositorio:
Ve a tu repo settings -> Secrets and variables -> Actions -> Repository Secrets:
**Nota:** Donde puedes ver que tengo el usuario y el password con el que me voy a conectar hacia mi docker registry, en este caso es dockerhub.com. El API_TOKEN_GITHUB es el Personal Access Token que creamos en el paso 2.
4. Tener un repositorio donde están los manifest de kubernetes, ejemplo:
```bash
https://github.com/ahioros/deploy-workflow-react-example
```
Para crear un workflow se deben crear unas carpetas en nuestro proyecto de Github.
```bash
.github/workflows/workflow-react-example.yml
```
El contenido de nuestro archivo yaml es el siguiente:
---
name: workflow-react-example
on:
push:
branches:
- master
jobs:
CI:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4.1.0
- name: Install Node.js
uses: actions/setup-node@v4.0.0
with:
node-version: 15.x
- name: npm install
run: npm install
- name: npm lint
run: npm run lint
- name: npm prettier
run: npm install prettier && npx prettier . --write && npm run prettier
- name: npm test
run: CI=true npm run test
- name: npm build
run: npm run build
Build_Docker_Image_ReactApp:
needs:
- CI
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4.1.0
- name: BuildAndPush
uses: docker/login-action@v3.3.0
with:
username: "${{ secrets.DOCKERHUBCONNECTION_DOCKER_USERNAME }}"
password: "${{ secrets.DOCKERHUBCONNECTION_DOCKER_PASSWORD }}"
- name: Build the Docker image
run: docker build . --file "Dockerfile" -t ahioros/rdicidr:${{ github.run_id }}
- name: Create latest image as well
run: docker tag ahioros/rdicidr:${{ github.run_id }} ahioros/rdicidr:latest
- name: Push Docker image with the version number
run: docker push ahioros/rdicidr:${{ github.run_id }}
- name: Push the latest tag
run: docker push ahioros/rdicidr:latest
- name: Logout
run: docker logout
Deployment:
needs:
- Build_Docker_Image_ReactApp
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4.1.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ahioros/deploy-workflow-react-example
fetch-depth: 0
persist-credentials: false
- name: Deploy
run: |-
TAG=${{ github.run_id }}
EXP="image: ahioros/rdicidr:[0-9]+"
REP="image: ahioros/rdicidr:$TAG"
sed -E -i "s|$EXP|$REP|g" k8s/02-deployment.yaml
git config user.name "Argo CD"
git config user.email "ArgoCD@example.com"
git checkout master --
git add --all
git commit -m "Deployment ID: ${{ github.run_id }}"
shell: bash
- name: Push changes
uses: ad-m/github-push-action@master
with:
repository: ahioros/deploy-workflow-react-example
GITHUB_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
---
El workflow es el mismo que el pipeline que se hizo en Azure Devops
Azure:
**CodeValidation -> Containerized -> Deploy**
Github Actions:
**CI -> Build_Docker_Image_ReactApp -> Deployment**
Aquí te dejo el repositorio de Azure para que lo compares:
https://dev.azure.com/guillermogarcialedezma/DockerHub%20Test/
Cada vez que hagas un cambio en el código y lo subas/empujes (push) al branch de master, el workflow se ejecutará.
Recuerda que esto es solo un ejemplo y no es recomendable subir/empujar directamente a tu rama/branch principal main/master.
En nuestro siguiente post haremos la configuración de Argo CD, para automatizar el despliegue en kubernetes con **Github Actions**.
**NOTA:** Mira el Dockerfile ya que ahora lo hice multi-stage para que tenga un menor peso:
Antes la imagen pesaba **1.09GB**
Ahora la imagen pesa: **188MB**