Compare commits

..

2 Commits

Author SHA1 Message Date
Christian Heusel
2609e386d4 WIP: run0 support
Signed-off-by: Christian Heusel <christian@heusel.eu>
2025-10-04 20:58:39 +02:00
Rafael Fontenelle
447f7b4117 Fix typo 2025-09-29 20:00:02 -03:00
8 changed files with 44 additions and 121 deletions

View File

@@ -24,7 +24,7 @@ test:
stage: test stage: test
needs: [] needs: []
script: script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats bats-assert bats-support - pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats
- make test BATS_EXTRA_ARGS='--formatter junit' - make test BATS_EXTRA_ARGS='--formatter junit'
artifacts: artifacts:
reports: reports:
@@ -34,7 +34,7 @@ coverage:
stage: test stage: test
needs: [] needs: []
script: script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats bats-assert bats-support kcov jq - pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats kcov jq
- make coverage - make coverage
coverage: '/Percent covered\s+\d+\.\d+/' coverage: '/Percent covered\s+\d+\.\d+/'
artifacts: artifacts:

View File

@@ -14,7 +14,7 @@ Description
Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user
that can run archbuild in a non-interactive manner, e.g. must be able to that can run archbuild in a non-interactive manner, e.g. must be able to
elevate permissions using passwordless sudo. elevate permissions using passwordless run0.
Options Options
------- -------

View File

@@ -3,7 +3,7 @@ pkgctl-auth(1)
Name Name
---- ----
pkgctl-auth - Authenticate with serivces like GitLab. pkgctl-auth - Authenticate with services like GitLab.
Synopsis Synopsis
-------- --------

View File

@@ -15,7 +15,11 @@ check_root() {
local orig_argv=("$@") local orig_argv=("$@")
(( EUID == 0 )) && return (( EUID == 0 )) && return
if type -P sudo >/dev/null; then if type -P run0 >/dev/null; then
keepenv=",$keepenv"
command="run0 ${keepenv//,/ --setenv=}"
exec ${command} -- "${orig_argv[@]}"
elif type -P sudo >/dev/null; then
exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}" exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}"
else else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")" exec su root -c "$(printf ' %q' "${orig_argv[@]}")"

View File

@@ -110,11 +110,6 @@ pkgctl_repo_configure() {
local path realpath pkgbase remote_url project_path hook local path realpath pkgbase remote_url project_path hook
local PACKAGER GPGKEY packager_name packager_email local PACKAGER GPGKEY packager_name packager_email
# Check if we're in a git repo
if ! git rev-parse --git-dir &>/dev/null; then
die "Not in a git repository"
fi
while (( $# )); do while (( $# )); do
case $1 in case $1 in
-h|--help) -h|--help)
@@ -155,8 +150,7 @@ pkgctl_repo_configure() {
# check if invoked without any path from within a packaging repo # check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then if (( ${#paths[@]} == 0 )); then
if [[ -d .git ]] || git rev-parse --git-dir &>/dev/null; then if [[ -f PKGBUILD ]]; then
# We're in a git repository, so use current directory
paths=(".") paths=(".")
else else
pkgctl_repo_configure_usage pkgctl_repo_configure_usage
@@ -232,20 +226,11 @@ pkgctl_repo_configure() {
pushd "${path}" >/dev/null pushd "${path}" >/dev/null
# Check if this is a packaging repository
local is_packaging_repo=0
if [[ -f PKGBUILD ]]; then
is_packaging_repo=1
fi
# Configure remote only for packaging repositories
if (( is_packaging_repo )); then
project_path=$(gitlab_project_name_to_path "${pkgbase}") project_path=$(gitlab_project_name_to_path "${pkgbase}")
remote_url="${GIT_REPO_BASE_URL}/${project_path}.git" remote_url="${GIT_REPO_BASE_URL}/${project_path}.git"
if ! git remote add origin "${remote_url}" &>/dev/null; then if ! git remote add origin "${remote_url}" &>/dev/null; then
git remote set-url origin "${remote_url}" git remote set-url origin "${remote_url}"
fi fi
fi
# move the master branch to main # move the master branch to main
if [[ $(git symbolic-ref --quiet --short HEAD) == master ]]; then if [[ $(git symbolic-ref --quiet --short HEAD) == master ]]; then
@@ -254,7 +239,7 @@ pkgctl_repo_configure() {
fi fi
# configure spec version and variant to avoid using development hooks in production # configure spec version and variant to avoid using development hooks in production
git config devtools.version "${GIT_REPO_SPEC_VERSION:-1.0.0}" git config devtools.version "${GIT_REPO_SPEC_VERSION}"
if [[ ${_DEVTOOLS_LIBRARY_DIR} == /usr/share/devtools ]]; then if [[ ${_DEVTOOLS_LIBRARY_DIR} == /usr/share/devtools ]]; then
git config devtools.variant canonical git config devtools.variant canonical
else else
@@ -264,12 +249,8 @@ pkgctl_repo_configure() {
git config pull.rebase true git config pull.rebase true
git config branch.autoSetupRebase always git config branch.autoSetupRebase always
# Configure branch remote settings only for packaging repositories with remotes
if (( is_packaging_repo )) && git remote | grep -q "^origin$"; then
git config branch.main.remote origin git config branch.main.remote origin
git config branch.main.rebase true git config branch.main.rebase true
fi
git config transfer.fsckobjects true git config transfer.fsckobjects true
git config fetch.fsckobjects true git config fetch.fsckobjects true

View File

@@ -185,10 +185,18 @@ prepare_chroot() {
echo "$x" >>"$copydir/etc/makepkg.conf" echo "$x" >>"$copydir/etc/makepkg.conf"
done done
cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF # TODO(gromit): check if this rule is sane
builduser ALL = NOPASSWD: /usr/bin/pacman # TODO(gromit): this will require a full container
cat > "$copydir/etc/polkit-1/rules.d/10-systemd-nopasswd.rules" <<EOF
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units") {
if (subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
}
});
EOF EOF
chmod 440 "$copydir/etc/sudoers.d/builduser-pacman" chmod 440 "$copydir/etc/polkit-1/rules.d/10-systemd-nopasswd.rules"
cat > "$copydir/etc/gitconfig" <<EOF cat > "$copydir/etc/gitconfig" <<EOF
[safe] [safe]
@@ -222,17 +230,14 @@ _chrootbuild() {
# shellcheck source=/dev/null # shellcheck source=/dev/null
. /etc/profile . /etc/profile
# Beware, there are some stupid arbitrary rules on how you can run0 --setenv=SOURCE_DATE_EPOCH \
# use "$" in arguments to commands with "sudo -i". ${foo} or --setenv=BUILDTOOL \
# ${1} is OK, but $foo or $1 isn't. --setenv=BUILDTOOLVER \
# https://bugzilla.sudo.ws/show_bug.cgi?id=765 --via-shell --chdir='~' \
sudo --preserve-env=SOURCE_DATE_EPOCH \ --user=builduser -- bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
--preserve-env=BUILDTOOL \
--preserve-env=BUILDTOOLVER \
-iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
ret=$? ret=$?
case $ret in case $ret in
0|14) 0)
return 0;; return 0;;
*) *)
return $ret;; return $ret;;
@@ -243,7 +248,7 @@ _chrootnamcap() {
pacman -S --needed --noconfirm namcap pacman -S --needed --noconfirm namcap
for pkgfile in /startdir/PKGBUILD /pkgdest/*; do for pkgfile in /startdir/PKGBUILD /pkgdest/*; do
echo "Checking ${pkgfile##*/}" echo "Checking ${pkgfile##*/}"
sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log" run0 --user=builduser -- namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log"
done done
} }
@@ -252,8 +257,12 @@ download_sources() {
chown "$makepkg_user:" "$WORKDIR" chown "$makepkg_user:" "$WORKDIR"
# Ensure sources are downloaded # Ensure sources are downloaded
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME,SSH_AUTH_SOCK \ run0 --user="$makepkg_user" \
env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ --setenv=GNUPGHOME \
--setenv=SSH_AUTH_SOCK \
--setenv=SRCDEST="$SRCDEST" \
--setenv=BUILDDIR="$WORKDIR" \
--chdir=. -- \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" || makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" ||
die "Could not download sources." die "Could not download sources."
} }
@@ -400,7 +409,7 @@ if arch-nspawn "$copydir" \
"${nspawn_build_args[@]}" \ "${nspawn_build_args[@]}" \
/chrootbuild "${makepkg_args[@]}" /chrootbuild "${makepkg_args[@]}"
then then
mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') mapfile -t pkgnames < <(run0 --user="$makepkg_user" -- bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"')
move_products move_products
else else
(( ret += 1 )) (( ret += 1 ))
@@ -453,7 +462,7 @@ else
done done
msg2 "Checking packages" msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}" run0 --user="$makepkg_user" -- checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}"
fi fi
true true
fi fi

View File

@@ -192,7 +192,7 @@ for p in "$@"; do
pkgfile=${pkgfile_remote#file://} pkgfile=${pkgfile_remote#file://}
if [[ ! -f ${pkgfile} ]]; then if [[ ! -f ${pkgfile} ]]; then
msg "Downloading package '%s' into pacman's cache" "${pkgfile}" msg "Downloading package '%s' into pacman's cache" "${pkgfile}"
sudo pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1 run0 -- pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1
pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null) pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null)
pkgfile="${pkgfile_remote#file://}" pkgfile="${pkgfile_remote#file://}"
fi fi

View File

@@ -1,71 +0,0 @@
#!/usr/bin/env bats
bats_require_minimum_version 1.5.0
# Load bats libraries
load "/usr/lib/bats/bats-support/load.bash"
load "/usr/lib/bats/bats-assert/load.bash"
export _DEVTOOLS_LIBRARY_DIR="${PWD}/src"
_pkgctl_repo_configure() {
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
pkgctl_repo_configure "$@"
}
@test "repo-configure-valid-packaging" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
git remote add origin "https://gitlab.archlinux.org/archlinux/packaging/packages/devtools.git"
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-non-packaging" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
git remote add origin "https://gitlab.com/kicad/libraries/kicad-packages3D.git"
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-non-arch" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
git remote add origin "https://github.com/torvalds/linux.git"
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-no-git" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
run ! _pkgctl_repo_configure
assert_failure
assert_output --partial "Not in a git repository"
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-local-git" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}