Monitor vulnerabilities in dependencies and keep them up-to-date

Dependabot ist ein Tool, um die in einem Repo verwendeten Dependencies automatisch auf dem aktuellen Stand zu halten. So können Sicherheitsprobleme mit älteren Versionen vermieden werden.

Integration über GitHub Actions

Im Repository unter /.github eine Datei dependabot.yml erstellen:

version: 2
updates:

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

  - package-ecosystem: "gradle"
    directory: "/"
    schedule:
      interval: "weekly"

  - package-ecosystem: "npm"
    directory: "/app/"
    schedule:
      interval: "daily"
      time : "05:00"
      timezone : "Europe/Berlin"

  - package-ecosystem: "bundler"
    directory: "/"
    allow:
      - dependency-type: "all"
    schedule:
      interval: "daily"
      time: "05:00"
      timezone: "Europe/Berlin"

Im angegebenen Beispiel werden alle GitHub Actions (in den Workflow Dateien) und die Dependencies in der build.gradle einmal wöchentlich aktualisiert.

Es gibt vielfältige Möglichkeiten der Konfiguration. Über das package-ecosystem wird angegeben, in welchen Dateien nach Versionen geschaut werden soll:

  • github-actions -> .workflow/*.yml
  • gradle -> build.gradle
  • npm -> package.json und Lock files
  • bundler -> Gemfile und Lock files Mit directory wird angegeben, in welchem Verzeichnis sich die Configdateien befinden. Befindet sich die package.json z.B. in einem Unterverzeichnis app, dann hier /app/ angeben.

Dependabot schaut nach aktualisierten Versionen erstellt einen Pull Request mit den Änderungen. Die Pull Requests können entweder manuell oder automatisch gemerged werden. Wenn dies automatisch geschehen soll, dann unter /.github/workflows eine Datei dependabot-automerge.yml erstellen mit folgendem Inhalt:

name: Dependabot auto merge

concurrency:
  group: dependabot
  cancel-in-progress: false

permissions:
  id-token: write
  pull-requests: write
  contents: write

on: pull_request_target

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1.3.1

      - name: Checkout PR Branch
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Build and test
        uses: eskatos/gradle-command-action@v2.1.5
        with:
          arguments: clean build
          
      - name: Enable auto merge for Dependabot PRs
        if: ${{steps.metadata.outputs.update-type != 'version-update:semver-major'}}
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Damit werden Minor Updates in den Versionen automatisch in den Code übernommen, wenn der Build erfolgreich durchlaufen wird. Major Updates müssen weiterhin manuell gemerged werden. So wird sichergestellt, dass Major Updates keine Breaking Changes mitbringen. Das GitHub Token muss an dieser Stelle angegeben werden, um von einem GitHub Action Workflow die GitHub CLI nutzen zu können