From 208cb771cd86e59f26f2f0ba90934e2293b4852e Mon Sep 17 00:00:00 2001 From: Adrien Beudin Date: Sun, 11 Aug 2024 21:57:42 +0200 Subject: [PATCH] feat: add renovate --- .gitlab-ci.yml | 64 +++++++++++++++++++++++++++ ci/generated-config.tpl | 35 +++++++++++++++ config.js | 9 ++++ renovate.json | 95 +++++++++++++++++++++++++++++++++++++++++ updater.py | 67 +++++++++++++++++++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 ci/generated-config.tpl create mode 100644 config.js create mode 100644 renovate.json create mode 100755 updater.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 08b062d0c6..aee8113a8d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,6 +15,9 @@ stages: - lint - build - release + - renovate + - check + - test variables: GIT_SUBMODULE_STRATEGY: none @@ -113,6 +116,7 @@ tests buildroot patches: refs: - merge_requests changes: + - package/*/*.mk - package/*/*.patch - board/recalbox/patches/*/*.patch before_script: @@ -179,6 +183,66 @@ appimage-amd64: - 'projects/frontend/*.AppImage*' expire_in: 1 week +check_package: + stage: check + only: + refs: + - merge_requests + changes: + - package/*/*.mk + script: + - export files=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA) + - export package_name=$(basename $files | cut -d"." -f1) + - export package_bl=$(echo $package_name | tr '[:lower:]' '[:upper:]' | tr '-' '_') + - cp ci/generated-config.tpl generated-config.yml + - |- + for ARCH in x86_64 rpi4_64 odroidgo2 odroidxu4 rpi3 rpizero2legacy rpizero2 rg353x rpi5_64 + do + if grep -q "$package_bl" configs/recalbox-${ARCH}_defconfig;then + echo " - '$ARCH'" >> generated-config.yml + fi + done + artifacts: + paths: + - generated-config.yml + +trigger_build: + stage: test + trigger: + include: + - artifact: generated-config.yml + job: check_package + strategy: depend + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + changes: + - package/*/*.mk + +include: + - project: 'renovate-bot/renovate-runner' + file: '/templates/renovate.gitlab-ci.yml' + +renovate: + stage: renovate + resource_group: + image: + name: ghcr.io/renovatebot/renovate:full + docker: + user: root + before_script: + - apt update && apt install python3-requests -y + rules: + - if: $CI_PIPELINE_SOURCE =~ "/^(schedule)$/" && $WHICH_SCHEDULE == "renovate" + when: always + - when: never + variables: + RENOVATE_EXTRA_FLAGS: 'recalbox/recalbox --allow-post-upgrade-command-templating' + artifacts: + when: always + expire_in: 1d + paths: + - '$LOG_FILE' + .build_template: &build_definition stage: build diff --git a/ci/generated-config.tpl b/ci/generated-config.tpl new file mode 100644 index 0000000000..ed0743595e --- /dev/null +++ b/ci/generated-config.tpl @@ -0,0 +1,35 @@ +build_package: + image: docker:latest + variables: + RUNNER_SCRIPT_TIMEOUT: 3h + before_script: + - apk update && apk add git bash + - source scripts/release/functions.sh + script: + - set -euo pipefail + - export files=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA) + - export package_name=$(basename $files | cut -d"." -f1) + - export RECALBOX_VERSION="${CI_COMMIT_TAG:-$(date '+%Y/%m/%d') ${CI_COMMIT_REF_SLUG} (${CI_PIPELINE_ID})}" + - WORKDIR="$(pwd)" CCACHE="true" OUTPUTDIR="$(pwd)/output" + - mkdir -p ${OUTPUTDIR} + - docker build -t "recalbox-${ARCH}" . + - |- + docker run --rm --tmpfs /tmp:exec \ + --security-opt seccomp=unconfined \ + -v "${WORKDIR}:/work" \ + -v "${OUTPUTDIR}:/work/output" \ + -v "/recalbox-builds/dl:/share/dl" \ + -v "/recalbox-builds/ccaches/ccache-${ARCH}:/share/ccache" \ + -e "ARCH=${ARCH}" \ + -e "RECALBOX_VERSION=${RECALBOX_VERSION}" \ + -e "RECALBOX_CCACHE_ENABLED=${CCACHE}" \ + -e "PACKAGE=${package_name}" \ + "recalbox-${ARCH}" 2>&1 | tee build.log | grep '>>>' || tac build.log | grep '>>>' -m 1 -B 9999 | tac + - echo $? + tags: + - build + rules: + - if: $CI_PIPELINE_SOURCE == "parent_pipeline" + parallel: + matrix: + - ARCH: diff --git a/config.js b/config.js new file mode 100644 index 0000000000..cf674e10e2 --- /dev/null +++ b/config.js @@ -0,0 +1,9 @@ +module.exports = { + endpoint: 'https://gitlab.com/api/v4', + hostRules: [], + platform: 'gitlab', + username: 'renovate-bot', + gitAuthor: 'Renovate Bot ', + autodiscover: false, + allowedPostUpgradeCommands: ['./updater.py'] +}; diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000000..75547d1e6e --- /dev/null +++ b/renovate.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + ":dependencyDashboard", + ":disableRateLimiting", + ":rebaseStalePrs" + ], + "labels": [ + "renovate" + ], + "lockFileMaintenance": { + "enabled": false + }, + "separateMajorMinor": false, + "recreateWhen": "always", + "enabledManagers": [ + "custom.regex" + ], + "ignorePaths": [ + "**custom/**", + "**/buildroot/**", + "**/beebem/**", + "**/libretro-retrodream/**" + ], + "stopUpdatingLabel": "Testing::Beta", + "prBodyNotes": [ + "{{#if newDigest}}> 🗒**Changelog**
[Compare revision {{{currentDigest}}} to {{{newDigest}}}]({{{packageName}}}/compare/{{{currentDigest}}}...{{{newDigest}}}){{/if}}" + ], + "prCreation": "approval", + "packageRules": [ + { + "enabled": false, + "matchPackageNames": [ + "*" + ] + }, + { + "enabled": true, + "labels": [ + "renovate", + "Components::Emulators" + ], + "commitMessagePrefix": "chore:", + "commitMessageAction": "bump", + "commitMessageLowerCase": "auto", + "matchPackageNames": [ + "//libretro//" + ], + "postUpgradeTasks": { + "commands": [ + "./updater.py {{{packageFile}}}" + ], + "fileFilters": ["**/*.mk", "RELEASE-NOTES.md"] + } + }, + { + "enabled": true, + "labels": [ + "renovate", + "Components::System" + ], + "commitMessagePrefix": "chore:", + "commitMessageAction": "bump", + "commitMessageLowerCase": "auto", + "matchPackageNames": [ + "//recalbox//" + ], + "postUpgradeTasks": { + "commands": [ + "./updater.py {{{packageFile}}}" + ], + "fileFilters": ["**/*.mk", "RELEASE-NOTES.md"] + } + } + ], + "customManagers": [ + { + "customType": "regex", + "fileMatch": [ + "\\.mk$" + ], + "matchStringsStrategy": "combination", + "matchStrings": [ + ".*_VERSION = (?(?:v)?[\\w+\\.\\-]*)\\n", + ".*_VERSION = (?[a-f0-9]{40}) #(?.*)\\n", + ".*_VERSION = (?[a-f0-9]{40})\\n", + ".*_SITE = (?:https?:\\/\\/)?(?:.*call )?(?[\\w-]*)(?:\\.com)?.(?[\\w_-]*).(?[\\w_\\/-]*)" + ], + "currentValueTemplate": "{{#if currentDigest }}{{#if nameBranch }}{{{nameBranch}}}{{else}}master{{/if}}{{else}}{{{currentValue}}}{{/if}}", + "depNameTemplate": "{{{lowercase depName}}}", + "packageNameTemplate": "https://{{{siteName}}}.com/{{{orgName}}}/{{{depName}}}", + "datasourceTemplate": "{{#if currentDigest }}git-refs{{else}}git-tags{{/if}}" + } + ] +} diff --git a/updater.py b/updater.py new file mode 100755 index 0000000000..acf4c8cedd --- /dev/null +++ b/updater.py @@ -0,0 +1,67 @@ +#!/usr/bin/python3 +import os +import sys +import re +import requests +import json +from datetime import datetime + + +def get_date(site, org, project): + if site == "github": + try: + x = requests.get("https://api.github.com/repos/%s/%s/git/commits/%s" % (org, project, version)) + req = json.loads(x.text) + date = datetime.strptime(req["committer"]["date"], "%Y-%m-%dT%H:%M:%SZ").strftime("%Y/%m/%d") + except: + date = "NEED FIX!!" + print("An exception occurred") + elif site == "gitlab": + try: + x = requests.get("https://gitlab.com/api/v4/projects/%s%2F%s/repository/commits/%s" % (org, project, version)) + req = json.loads(x.text) + date = datetime.strptime(req["committed_date"], "%Y-%m-%dT%H:%M:%S").strftime("%Y/%m/%d") + except: + date = "NEED FIX!!" + print("An exception occurred") + return date + + +mk = sys.argv[1] +package = mk.split('/')[1] +update_changelog = True + +with open(mk, "r+") as f: + data = f.read() + version = re.search(r".*_VERSION = (.*)", data).group(1) + if re.search(r".*_SITE = \$\(call .*", data): + result = re.search(r".*_SITE = \$\(call ([a-z]*),([a-zA-Z0-9_-]*),([a-zA-Z0-9_-]*).*", data) + site = result.group(1) + org = result.group(2) + project = result.group(3) + else: + result = re.search(r".*_SITE = https\:\/\/(\w+).com\/([a-zA-Z0-9_\-]*)\/([a-zA-Z0-9_\-]*)(?:\.git)?", data) + site = result.group(1) + org = result.group(2) + project = result.group(3) + date = get_date(site, org, project) + new_mk = re.sub(r"# .*ommit .* (\d+.\d+.\d+)(.*)", r"# Commit of %s\g<2>" % (date), data) + f.seek(0) + f.write(new_mk) + f.truncate() + +with open("RELEASE-NOTES.md", "r+") as f: + data = f.read() + bumps = re.search(r"### Bumps((?:\n-.*)*)", data).group(1) + bumps_list = bumps.splitlines() + for i in bumps_list: + pq = re.sub(r"- Bump (.*)", r"\g<1>", i) + if pq == package: + update_changelog = False + if update_changelog: + new_rn = re.sub(r"### Bumps((?:\n-.*)*)", r"### Bumps\g<1>\n- Bump %s" % (package), data, 1) + f.seek(0) + f.write(new_rn) + f.truncate() + else: + f.close -- GitLab