Skip to content
GitLabGitHub

Renovate - Automatyczne wykrywanie aktualizacji

Utrzymanie aktualnych zależności w repozytoriach to jedno z kluczowych wyzwań w nowoczesnych projektach IT. Ręczne sprawdzanie nowych wersji bibliotek, obrazów kontenerowych czy narzędzi infrastrukturalnych jest czasochłonne i podatne na błędy, a jednocześnie ma bezpośredni wpływ na bezpieczeństwo i stabilność systemów.

W tym wpisie pokażę, jak wykorzystuję Renovate do automatycznego wykrywania aktualizacji oraz integracji tego procesu z GitLab CI. Celem jest pełna automatyzacja — od detekcji nowych wersji zależności, przez tworzenie merge requestów, aż po kontrolę nad tym, kiedy i w jaki sposób aktualizacje trafiają do projektu.


  1. Utworzenie kontenera za pomocą image buildera

    Section titled “Utworzenie kontenera za pomocą image buildera”

    Wydanie wersji renovate v1.0.0

  2. tech_pipelines/renovate/.gitlab-ci.yml

    ---
    💥 Run renovate:
      stage: dependency
      image: $IMAGE_RENOVATE
      before_script:
        - !reference [.helper_gitlab-ci.sh]
        - git clone git@gitlab.com:pl.rachuna-net/platform-policies.git
        - |
          export GITHUB_TOKEN=$(curl -s -k -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/kv-gitlab/data/pl.rachuna-net/auth/github | jq -r .data.data.GITHUB_TOKEN)
      script:
        - renovate "${CI_PROJECT_PATH}/platform-policies"

    Wydanie wersji v1.6.0

  3. renovate
    ├── config.js
    └── preset
        ├── default.json
        ├── gitlab-ci.json
        ├── image-builder.json
        ├── opentofu-iac.json
        └── opentofu-module.json

    Wydanie wersji v1.0.0

    W pierwszej kolejności należy przygotować konfiguracje config.js

    const splitList = (value) =>
      value
        ? value
          .split(",")
          .map((item) => item.trim())
          .filter(Boolean)
        : undefined;
    
    module.exports = {
      $schema: "https://docs.renovatebot.com/renovate-schema.json",
    
      extends: [
        "config:recommended",
        ":semanticCommits",
        ":timezone(Europe/Warsaw)"
      ],
    
      dependencyDashboard: false,
    
      assignees: splitList(process.env.RENOVATE_ASSIGNEES),
      reviewers: splitList(process.env.RENOVATE_REVIEWERS),
      gitAuthor: process.env.RENOVATE_GIT_AUTHOR,
    
      timezone: "Europe/Warsaw",
      schedule: ["before 6am"],
    
      prConcurrentLimit: 0, // 0 = brak limitu równoczesnych PR
      prHourlyLimit: 0,     // 0 = brak limitu PR na godzinę
    
      rebaseWhen: "always",
      automerge: false,
    
      hostRules: [
        {
          matchHost: "gitlab.com",
          hostType: "git-tags",
          token: process.env.GITLAB_TOKEN
        },
        {
          matchHost: "github.com",
          token: process.env.GITHUB_TOKEN
        }
      ]
    };
    

    W kolejnej fazie plik do śledzenia zmian dla opentofu

    {
      "$schema": "https://docs.renovatebot.com/renovate-schema.json",
      "labels": [
        "dependencies"
      ],
      "dependencyDashboardLabels": [
        "dependencies"
      ],
      "assignees": [],
      "reviewers": [],
      "packageRules": [
        {
          "matchManagers": [
            "terraform"
          ],
          "matchDatasources": [
            "terraform-provider",
            "terraform-module"
          ],
          "registryUrls": [
            "https://registry.opentofu.org"
          ]
        },
        {
          "matchManagers": [
            "terraform"
          ],
          "matchDepTypes": [
            "required_version"
          ],
          "matchDepNames": [
            "hashicorp/terraform"
          ],
          "datasource": "github-releases",
          "replacementName": "opentofu/opentofu",
          "versioning": "semver",
          "semanticCommitType": "chore",
          "semanticCommitScope": "debs"
        },
        {
          "matchUpdateTypes": [
            "major"
          ],
          "semanticCommitType": "feat",
          "semanticCommitScope": "debs"
        },
        {
          "matchUpdateTypes": [
            "minor",
            "patch"
          ],
          "semanticCommitType": "fix",
          "semanticCommitScope": "debs"
        }
      ],
      "customManagers": [
        {
          "customType": "regex",
          "managerFilePatterns": [
            "/.*\\.tf$/"
          ],
          "matchStrings": [
            "renovate repository:\\s*(?<depName>[^\\s]+)[\\s\\S]*?value\\s*=\\s*\"(?<currentValue>v[0-9][0-9A-Za-z.+-]+)\""
          ],
          "datasourceTemplate": "gitlab-tags",
          "depNameTemplate": "{{depName}}"
        },
        {
          "customType": "regex",
          "fileMatch": [
            ".*\\.json$"
          ],
          "matchStrings": [
            "\"gitlab_ci_path\"\\s*:\\s*\"[^\"]+@(?<depName>pl\\.rachuna-net/cicd/gitlab-ci):(?<currentValue>v[0-9][0-9A-Za-z.+-]*)\""
          ],
          "datasourceTemplate": "gitlab-tags",
          "depNameTemplate": "{{depName}}"
        }
      ]
    }
    
  4. renovate.json

    {
      "$schema": "https://docs.renovatebot.com/renovate-schema.json",
      "extends": [
        "gitlab>pl.rachuna-net/platform-policies//renovate/preset/opentofu-iac.json"
      ]
    }