Mantén tus dependencias siempre actualizadas con Dependabot

Tanto en proyectos personales, como en los profesionales, siempre deberías de estar vigilando que las dependencias estén lo más actualizadas posibles, y no esperar a que un fallo de seguridad asome por la puerta 🚪👀 Es por ello que en la plataforma de GitHub tenemos Dependabot, una característica que nos permite asegurarnos de que tenemos todo al día tanto en dependencias desactualizadas como aquellas que pueden suponer un problema desde el punto de vista de seguridad, que no es lo mismo. En este artículo quería compartir contigo no sólo cómo configurarlo en tus repositorios sino a asegurarte de que todos los existentes, y los futuros, lo tengan también configurado.

Dependabot desde el punto de vista de seguridad

En mi vídeo de introducción a GitHub Advanced Security te contaba todas las caraterísticas que este trae bajo el brazo, incluido Dependabot desde el punto de vista de vulnerabilidades en tus dependencias.

Sin embargo, no hay que esperar a estar actualizados solo porque exista un fallo de seguridad sino que también necesitamos no quedarnos atrás en otros fixes de mal funcionamiento, optimización del rendimiento de las librerías, entre otros motivos que pueden hacer que nuestras librerías necesiten estar al día.

Dependabot desde el punto de vista de actualizaciones

Es por ello que Dependabot también puede preocuparse de que tus proyectos estén al día con una configuración tan simple como esta:

version: 2
updates:
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "daily"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "daily"
  - package-ecosystem: "nuget"
    directory: "/"
    schedule:
      interval: "weekly"

En esta, como ves, puedo especificar diferentes tipos de paquetes y no solo de lenguajes de programación, sino también de tus GitHub Actions y de las imágenes de Docker. Aquí tienes los tipos de dependencias que puedes vigilar.

Para que esta configuración tenga efecto debes guardarla dentro de tu repositorio en la ruta .github/dependabot.yml y en el momento que esto ocurre hará una primera revisión de cómo tienes el chiringuito 😙 Si lo tienes todo en orden será como si nada hubiera pasado pero en el caso de no tener tus dependencias, github actions o imágenes de Docker (según mi ejemplo) a la última comenzarás a recibir correos avisándote de lo que es susceptible de actualizar y se creará una Pull Request con cada una de las actualizaciones que necesites.

Como máximo puede crear un máximo de 10 Pull Request y conforme las vayas solucionando irán apareciendo el resto hasta que estés al día.

Cómo asegurarme de que todos mis repos tienen esta configuración

Como te puedes imaginar esto sería más que obligatorio en todos los repositorios de tu organización, pero hacer esta configuración de forma manual por cada uno de ellos puede llevarte un ratito. Es por ello que recientemente GitHub ha publicado una acción llamada Evengreen que te permite lanzar un workflow que revise cómo tienes tus repositorios y en el caso de no tener la configuración hecha te proponga cuál es la que encajaría para el mismo y que la aplique directamente por ti (también puedes lanzarlo en modo dry-run de primeras a ver qué resultado te da 🧐). Lo ideal es que tuvieras este flujo en un repo centralizado, donde tengas el resto de automatismos de tu organización con una pinta como la siguiente:

name: Weekly dependabot checks
on:
  workflow_dispatch:
  schedule:
    - cron: '3 2 1 * *'
env:
  ORGANIZATION: returngis
jobs:
  evergreen:
    name: evergreen
    runs-on: ubuntu-latest
    steps:
      - name: Generate GitHub application token
        id: generate-token
        uses: peter-murray/workflow-application-token-action@v3
        with:
          application_id: ${{ secrets.GH_APPLICATION_ID }}
          application_private_key: ${{ secrets.GH_APPLICATION_PRIVATE_KEY }}
          organization: ${{ env.ORGANIZATION }}
          permissions: 'contents:write, pull_requests:write'
      - name: Run evergreen action
        uses: github/evergreen@v1.6.0
        env:
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
          ORGANIZATION: ${{ env.ORGANIZATION }}
          #DRY_RUN: true

Para que este pueda funcionar correctamente, necesitas crear una GitHub App que tenga permiso de escritura en los repos de tu organización, así como la capacidad de abrir Pull Requests.

¡Saludos!