Skip to content

Commit 272ecc1

Browse files
committed
ci(check-rebuild): add a (WIP) mechanism for detecting library rebuilds based on LIB_VERSIONS file
This shall be a starting point for automated pkgrel bumps. Supports both AUR managed packages and those pushed back to AUR (bumping the whole +1 in this case)
1 parent 88afcc2 commit 272ecc1

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

.ci/check-rebuild.sh

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#!/usr/bin/env bash
2+
3+
_AFFECTED=()
4+
KNOWN_REBUILD_PACKAGES=(
5+
"protobuf"
6+
"icu"
7+
)
8+
9+
pacman -Syu --noconfirm --needed "${KNOWN_REBUILD_PACKAGES[@]}"
10+
11+
determine-diffs() {
12+
LIB_VERSIONS=$(cat LIB_VERSIONS) || true
13+
rm LIB_VERSIONS || true
14+
15+
for package in "${KNOWN_REBUILD_PACKAGES[@]}"; do
16+
_OLDVER=$(echo "$LIB_VERSIONS" | grep "$package")
17+
_NEWVER=$(pacman -Q "$package")
18+
if [[ "$_OLDVER" != "$_NEWVER" ]]; then
19+
echo "Library version mismatch detected for $package..."
20+
_BUMP_LIBS+=("$package")
21+
fi
22+
23+
echo "$_NEWVER" >>LIB_VERSIONS
24+
done
25+
}
26+
27+
determine-affected() {
28+
# Parse our commit message for which packages to build based on folder names
29+
mapfile -t _PACKAGES < <(find . -mindepth 1 -type d -prune | sed -e '/.\./d' -e 's/.\///g')
30+
31+
for package in "${_PACKAGES[@]}"; do
32+
cd "$package" || echo "Failed to change into $package!"
33+
# shellcheck source=/dev/null
34+
source PKGBUILD
35+
# Once we know a package is affected, we can exit the function with return 0
36+
for dep in "${depends[@]}"; do
37+
if [[ "${KNOWN_REBUILD_PACKAGES[*]}" =~ [[:space:]]"$dep"[[:space:]] ]]; then
38+
_AFFECTED+=("$package")
39+
echo "Package $package is affected by library version bumps..."
40+
fi
41+
done
42+
for dep in "${makedepends[@]}"; do
43+
if [[ "${KNOWN_REBUILD_PACKAGES[*]}" =~ [[:space:]]"$dep"[[:space:]] ]]; then
44+
_AFFECTED+=("$package")
45+
echo "Package $package is affected by library version bumps..."
46+
fi
47+
done
48+
cd ..
49+
done
50+
}
51+
52+
bump-affected() {
53+
for package in "${_AFFECTED[@]}"; do
54+
# We only want to bump each package once, even if multiple libraries got bumped
55+
if [[ "${_ALREADY_BUMPED[*]}" =~ [[:space:]]"$package"[[:space:]] ]]; then
56+
echo "Package $package already bumped, skipping..."
57+
continue
58+
fi
59+
60+
cd "$package" || echo "Failed to change into $package!"
61+
62+
# shellcheck source=/dev/null
63+
source .CI_CONFIG
64+
65+
if [[ "$CI_MANAGE_AUR" == 1 ]]; then
66+
# If we manage the AUR, bump regular pkgrel - changes will automatically be
67+
# pushed back to AUR by the CI pipeline
68+
echo "Package $package is managed by us, bumping pkgrel..."
69+
70+
# shellcheck source=/dev/null
71+
source PKGBUILD
72+
73+
_NEW_PKGREL=$((pkgrel + 1))
74+
75+
sed -i "s/pkgrel=.*/pkgrel=$_NEW_PKGREL/" .CI_CONFIG
76+
_ALREADY_BUMPED+=("$package")
77+
else
78+
# If we don't manage the AUR, bump CI_PKGREL
79+
echo "Package $package is not managed by us, bumping CI_PKGREL..."
80+
81+
if ! (grep -q "CI_PKGREL=" .CI_CONFIG &>/dev/null); then
82+
echo "CI_PKGREL is missing for $package, creating empty value..."
83+
echo "# Bumps the pkgrel of $package by 0.1 for each +1" >>.CI_CONFIG
84+
echo "CI_PKGREL=1" >>.CI_CONFIG
85+
continue
86+
else
87+
_NEW_PKGREL=$((CI_PKGREL + 1))
88+
89+
# Bump pkgrel
90+
sed -i "s/CI_PKGREL=.*/CI_PKGREL=$_NEW_PKGREL/" .CI_CONFIG
91+
_ALREADY_BUMPED+=("$package")
92+
fi
93+
fi
94+
cd ..
95+
done
96+
97+
# Commit and push the changes to our new branch
98+
git add .
99+
git commit -m "chore(package-rebuild): fix library version mismatches by rebuilding package" \
100+
-m "Affected packages: ${_AFFECTED[*]}" \
101+
-m "Bumped libraries: ${_BUMP_LIBS[*]}"
102+
103+
git push "$REPO_URL" HEAD:main || git pull --rebase && git push "$REPO_URL" HEAD:main # Env provided via GitLab CI
104+
105+
}
106+
107+
determine-diffs
108+
determine-affected
109+
bump-affected

.gitlab-ci.yml

+18
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,23 @@ fetch-pkgbuilds:
113113
rules:
114114
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $BUMPVER == "1"
115115

116+
check-rebuilds:
117+
# This basically updates the version in the PKGBUILD and commits it
118+
# in case no major updates were detected
119+
stage: update-pkgbuilds
120+
image: alpine:latest
121+
script:
122+
- apk add --no-cache --upgrade bash bc
123+
- git clone https://gitlab.com/garuda-linux/pkgsbuilds-aur.git
124+
- cd pkgsbuilds-aur
125+
- git config --global user.name "$GIT_AUTHOR_NAME"
126+
- git config --global user.email "$GIT_AUTHOR_EMAIL"
127+
- bash .ci/check-rebuild.sh
128+
variables:
129+
GIT_STRATEGY: none
130+
rules:
131+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $BUMPVER == "1"
132+
116133
schedule-package:
117134
# This script determines whether a relevant change occurred and if so, schedules a package build
118135
# via the chaotic-manager container. The relevant jobs will occur as "external" jobs in the pipeline
@@ -134,6 +151,7 @@ schedule-package:
134151
rules:
135152
- changes:
136153
- "*/PKGBUILD"
154+
- "*/.CI_CONFIG"
137155
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
138156

139157
push-pkgbuild:

LIB_VERSIONS

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
protobuf 25.1-1
2+
icu 74.2-1

0 commit comments

Comments
 (0)