Compare commits

..

18 Commits

Author SHA1 Message Date
Ben Roberts 411c142f00 Fixup perlisms 2016-10-24 10:48:36 +01:00
Ben Roberts 9446715e1a Attempt to only add/remove enman repos that need action
Since enman was changed to provide exit status 1 [1] if the requested
operation failed, builder attempting to re-add an already existing repo
caused the entire build to fail. Rather than run the command and hope
for the best, this commit changes builder to obtain a list of already
installed repositories, and only add/remove the requested repos that
aren't already in the correct state.

[1] Sabayon/enman@7f3a6c88
2016-10-24 09:16:35 +01:00
Ettore Di Giacinto 890206ba80 sabayondevkit-functions.sh: add -u as default emerge option to build_category_installed and build_obsolete 2016-10-11 14:48:01 +02:00
mudler 79567a647b sabayon-maint-helper: acquire lock before execution 2016-10-10 16:44:47 +02:00
Ettore Di Giacinto 0769169cc6 sabayondevkit-functions.sh: fix typo 2016-10-10 14:14:07 +02:00
mudler 03b7b4fd18 sabayon-maint-helper: fixes 2016-10-10 12:06:56 +02:00
mudler 39f437f0aa adding sabayon-maint-helper 2016-10-10 12:01:33 +02:00
Ben Roberts 4747e43752 Enable RSS feeds and changelogs on repos 2016-10-02 18:36:46 +01:00
Ettore Di Giacinto 2d1c16e76e builder: EQUO_SPLIT_INSTALL default is now 0 2016-09-22 00:05:52 +02:00
Ben Roberts 4dbbc6b34a Strip out package itself from package_deps
Package_deps returned the target package in the output which is not
strictly true (the package is not a dependency of itself really).
In calcuate_missing also means we install the package once using entropy
(if available), and then immediately replace it with portage,
which just wastes effort.

It breaks installation in the cases where the older equo version blocks the
new portage version (e.g. change of slot).

This should remove the target package from the list of packages to be
installed with entropy.
2016-09-13 22:08:43 +01:00
Ettore Di Giacinto 36999309c2 builder: adding checks to fix a broken layman configuration 2016-09-13 10:06:05 +02:00
Ettore Di Giacinto 1ef3938a96 builder: enhance debug of profile setting 2016-09-12 13:17:29 +02:00
Ben Roberts 9119c8c973 Merge branch 'prune_virtual_fixes' 2016-09-11 17:41:08 +01:00
Ben Roberts 632053fc2f Print the builder docker commandline to aid in debugging 2016-09-11 17:19:11 +01:00
Ben Roberts 6fc14f7605 Expose /vagrant from the buildbox into the docker container to aid in debugging 2016-09-11 17:18:49 +01:00
Ben Roberts 4268b06305 Fix virtual pruning by switching from state to global variable for package_deps cache 2016-09-11 17:18:20 +01:00
mudler a66dc7bb23 builder: added check for missing DEPEND/RDEPEND in QA phase 2016-09-10 15:00:09 +02:00
mudler 1c4389a8aa Makefile: cleanup 2016-09-10 14:49:24 +02:00
6 changed files with 219 additions and 60 deletions
+2 -2
View File
@@ -23,10 +23,10 @@ install:
install -d $(DESTDIR)/$(USBINDIR) install -d $(DESTDIR)/$(USBINDIR)
install -m 0755 builder $(DESTDIR)/$(USBINDIR)/ install -m 0755 builder $(DESTDIR)/$(USBINDIR)/
install -d $(DESTDIR)/$(UBINDIR)
install -m 0755 depcheck $(DESTDIR)/$(UBINDIR)/ install -m 0755 depcheck $(DESTDIR)/$(UBINDIR)/
install -m 0755 dynlink-scanner $(DESTDIR)/$(UBINDIR)/ install -m 0755 dynlink-scanner $(DESTDIR)/$(UBINDIR)/
gcc try_dlopen.c -o try_dlopen -ldl gcc try_dlopen.c -o try_dlopen -ldl
install -m 0755 try_dlopen $(DESTDIR)/$(UBINDIR)/ install -m 0755 try_dlopen $(DESTDIR)/$(UBINDIR)/
install -d $(DESTDIR)/$(UBINDIR)
install -m 0755 sabayon-* $(DESTDIR)/$(UBINDIR)/ install -m 0755 sabayon-* $(DESTDIR)/$(UBINDIR)/
+55 -16
View File
@@ -15,7 +15,7 @@ $ENV{FEATURES} = $ENV{FEATURES}
my $equo_install_atoms = $ENV{EQUO_INSTALL_ATOMS} // 1; my $equo_install_atoms = $ENV{EQUO_INSTALL_ATOMS} // 1;
my $equo_install_version = $ENV{EQUO_INSTALL_VERSION} // 0; my $equo_install_version = $ENV{EQUO_INSTALL_VERSION} // 0;
my $equo_split_install = $ENV{EQUO_SPLIT_INSTALL} // 1; my $equo_split_install = $ENV{EQUO_SPLIT_INSTALL} // 0;
my $equo_mirrorsort = $ENV{EQUO_MIRRORSORT} // 1; my $equo_mirrorsort = $ENV{EQUO_MIRRORSORT} // 1;
my $entropy_repository = $ENV{ENTROPY_REPOSITORY} my $entropy_repository = $ENV{ENTROPY_REPOSITORY}
// "main"; # Can be weekly, main, testing // "main"; # Can be weekly, main, testing
@@ -37,7 +37,7 @@ my $equo_masks = $ENV{EQUO_MASKS};
my $equo_unmasks = $ENV{EQUO_UNMASKS}; my $equo_unmasks = $ENV{EQUO_UNMASKS};
my $equo_install_args = $ENV{EQUO_INSTALL_ARGS} // "--multifetch=10"; my $equo_install_args = $ENV{EQUO_INSTALL_ARGS} // "--multifetch=10";
my $remote_overlay = $ENV{REMOTE_OVERLAY}; my $remote_overlay = $ENV{REMOTE_OVERLAY};
my $repoman_check = $ENV{QA_CHECKS} // 0; my $qualityassurance_checks = $ENV{QA_CHECKS} // 0;
my $remote_conf_portdir = $ENV{REMOTE_CONF_PORTDIR}; my $remote_conf_portdir = $ENV{REMOTE_CONF_PORTDIR};
my $remote_portdir = $ENV{REMOTE_PORTDIR}; my $remote_portdir = $ENV{REMOTE_PORTDIR};
@@ -123,17 +123,17 @@ auto-sync = yes' > /etc/portage/repos.conf/$reponame.conf
} }
# Input: package, depth, and atom. Package: sys-fs/foobarfs, Depth: 1 (depth of the package tree) , Atom: 1/0 (enable disable atom output) # Input: package, depth, and atom. Package: sys-fs/foobarfs, Depth: 1 (depth of the package tree) , Atom: 1/0 (enable disable atom output)
my %package_dep_cache;
sub package_deps { sub package_deps {
my $package = shift; my $package = shift;
my $depth = shift // 1; # defaults to 1 level of depthness of the tree my $depth = shift // 1; # defaults to 1 level of depthness of the tree
my $atom = shift // 0; my $atom = shift // 0;
# Since we expect this sub to be called multiple times with the same arguments, cache the results # Since we expect this sub to be called multiple times with the same arguments, cache the results
state %cache;
$cache_key = "${package}:${depth}:${atom}"; $cache_key = "${package}:${depth}:${atom}";
if ( !exists $cache{$cache_key} ) { if ( !exists $package_dep_cache{$cache_key} ) {
@dependencies = my @dependencies =
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
chomp @dependencies; chomp @dependencies;
@@ -148,10 +148,10 @@ sub package_deps {
@dependencies @dependencies
); );
$cache{$cache_key} = \@dependencies; $package_dep_cache{$cache_key} = \@dependencies;
} }
return @{ $cache{$cache_key} }; return @{ $package_dep_cache{$cache_key} };
} }
#Input: nothing #Input: nothing
@@ -178,18 +178,26 @@ sub calculate_missing {
my @dependencies = package_deps( $package, $depth, 1 ); my @dependencies = package_deps( $package, $depth, 1 );
if ($prune_virtuals) { if ($prune_virtuals) {
say "[$package] Pruning dependencies of virtual packages";
my %install_dependencies = map { $_ => 1 } @dependencies; my %install_dependencies = map { $_ => 1 } @dependencies;
# Look for any virtuals and remove its immediate dependencies to avoid # Look for any virtuals and remove its immediate dependencies to avoid
# installing multiple conflicting packages one by one # installing multiple conflicting packages one by one
my @virtual_deps; my @virtual_deps = ();
for my $dep (@dependencies) { for my $dep (@dependencies) {
push( @virtual_deps, package_deps( $dep, 1, 1 ) ) if ( $dep =~ /^virtual\// ) {
if ( $dep =~ /^virtual\// ); my @child_deps = package_deps($dep, 1, 1);
push( @virtual_deps, @child_deps );
}
} }
# Deduplicate the list
@virtual_deps = uniq(@virtual_deps);
# Prune the dependencies of the virtual packages from the dependencies list
for my $dep (@virtual_deps) { for my $dep (@virtual_deps) {
$install_dependencies{$dep} = 0 if ( $dep !~ /^virtual\// ); if ( $dep !~ /^virtual\// ) {
$install_dependencies{$dep} = 0;
}
} }
@dependencies = grep { $install_dependencies{$_} } @dependencies; @dependencies = grep { $install_dependencies{$_} } @dependencies;
} }
@@ -203,6 +211,10 @@ sub calculate_missing {
my @to_install = grep( defined $available_packs{$_}, my @to_install = grep( defined $available_packs{$_},
uniq( grep( !defined $installed_packs{$_}, @dependencies ) ) ); uniq( grep( !defined $installed_packs{$_}, @dependencies ) ) );
@to_install = grep { length } @to_install; @to_install = grep { length } @to_install;
# Strip out the target package from the dependency list
@to_install = grep { to_atom($_) ne to_atom($package) } @to_install;
say "[$package] packages that will be installed with equo: @to_install" say "[$package] packages that will be installed with equo: @to_install"
if @to_install > 0; if @to_install > 0;
@@ -212,6 +224,8 @@ sub calculate_missing {
# Input : complete gentoo package (sys-fs/foobarfs-1.9.2) # Input : complete gentoo package (sys-fs/foobarfs-1.9.2)
# Output: atom form (sys-fs/foobarfs) # Output: atom form (sys-fs/foobarfs)
sub atom { s/-[0-9]{1,}.*$//; } sub atom { s/-[0-9]{1,}.*$//; }
# Same again as a function
sub to_atom { my $p=shift; $p =~ s/-[0-9]{1,}.*$//; return $p; }
# Input: Array # Input: Array
# Output: array with unique elements # Output: array with unique elements
@@ -314,6 +328,8 @@ if ( $remote_portdir ne "" ) {
system("chown -R portage:portage /usr/portage"); system("chown -R portage:portage /usr/portage");
system("chmod -R ug+w,a+rX /usr/portage"); system("chmod -R ug+w,a+rX /usr/portage");
} }
system("mkdir /var/lib/layman") if ( ! -d "/var/lib/layman" );
system("touch /var/lib/layman/make.conf && layman-updater -R") if ( ! -e "/var/lib/layman/make.conf" );
system("echo 'y' | layman -f -a $_") for @overlays; system("echo 'y' | layman -f -a $_") for @overlays;
@@ -377,7 +393,9 @@ unless ( $skip_portage_sync == 1 ) {
} }
# preparing for MOAR automation # preparing for MOAR automation
qx|eselect profile set $profile|; say "Setting new profile to $profile" if defined $profile;
qx|eselect profile set $profile| if defined $profile;
system("eselect profile list") if defined $profile;
if ( $use_equo && $entropy_repository eq "weekly" ) { if ( $use_equo && $entropy_repository eq "weekly" ) {
qx|equo repo disable sabayonlinux.org|; qx|equo repo disable sabayonlinux.org|;
@@ -394,14 +412,26 @@ if ($use_equo) {
say "Devkit version:"; say "Devkit version:";
system("equo s -vq app-misc/sabayon-devkit"); system("equo s -vq app-misc/sabayon-devkit");
my $enman_list_output = qx|enman list --installed -q|;
chomp($enman_list_output);
my @installed_enman_repos = split(/\n/, $enman_list_output);
if ( $enman_repositories and $enman_repositories ne "" ) { if ( $enman_repositories and $enman_repositories ne "" ) {
my @enman_toadd = split( / /, $enman_repositories ); my @enman_toadd = split( / /, $enman_repositories );
safe_call("enman add $_") for @enman_toadd; for my $enman_add (@enman_toadd) {
if ! grep ($enman_add, @installed_enman_repos) {
safe_call("enman add $_");
}
}
} }
if ( $remove_enman_repositories and $remove_enman_repositories ne "" ) { if ( $remove_enman_repositories and $remove_enman_repositories ne "" ) {
my @enman_toremove = split( / /, $remove_enman_repositories ); my @enman_toremove = split( / /, $remove_enman_repositories );
system("enman remove $_") for @enman_toremove; for my $enman_remove (@enman_toremove) {
if grep ($enman_remove, @installed_enman_repos) {
safe_call("enman remove $_");
}
}
} }
system("enman add $repository_name") system("enman add $repository_name")
@@ -494,7 +524,7 @@ if ($use_equo) {
} }
} }
if ( $repoman_check == 1 ) { if ( $qualityassurance_checks == 1 ) {
say "*** Repoman checks ***"; say "*** Repoman checks ***";
for ( @packages, @injected_packages ) { for ( @packages, @injected_packages ) {
say "*** QA checks for $_"; say "*** QA checks for $_";
@@ -534,6 +564,15 @@ if ($preserved_rebuild) {
} }
if ( $qualityassurance_checks == 1 ) {
say "*** Missing dependencies checks ***";
for ( @packages ) {
say "*** DEPEND for $_";
system("dynlink-scanner $_");
system("depcheck $_");
}
}
# Copy files to artifacts folder # Copy files to artifacts folder
system( system(
"mkdir -p $artifacts_folder;cp -rfv /usr/portage/packages $artifacts_folder" "mkdir -p $artifacts_folder;cp -rfv /usr/portage/packages $artifacts_folder"
+2 -1
View File
@@ -76,11 +76,12 @@ if [ -d "$SAB_WORKSPACE"/specs ]; then
[ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env") [ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env")
[ -e "$SAB_WORKSPACE"/specs/custom.keywords ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.keywords:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.keywords/99-custom.keywords") [ -e "$SAB_WORKSPACE"/specs/custom.keywords ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.keywords:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.keywords/99-custom.keywords")
[ -d "$SAB_WORKSPACE"/specs/env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/env/:/opt/sabayon-build/conf/$SAB_ARCH/portage/env/") [ -d "$SAB_WORKSPACE"/specs/env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/env/:/opt/sabayon-build/conf/$SAB_ARCH/portage/env/")
[ -d "/vagrant" ] && docker_volumes+=(-v "/vagrant:/vagrant")
fi fi
echo "Spawning the package builder container for '$@'." echo "Spawning the package builder container for '$@'."
echo "" echo ""
#echo "docker run $DOCKER_OPTS ${docker_env[@]} ${docker_volumes[@]} $DOCKER_IMAGE $@" echo "docker run $DOCKER_OPTS \"${docker_env[@]}\" \"${docker_volumes[@]}\" $DOCKER_IMAGE $@"
docker run $DOCKER_OPTS "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE $@ docker run $DOCKER_OPTS "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE $@
+2 -2
View File
@@ -88,8 +88,8 @@ database-format = bz2
# disabled-eapis = 1,2 # disabled-eapis = 1,2
# expiration-based-scope = disable # expiration-based-scope = disable
# nonfree-packages-directory-support = disable # nonfree-packages-directory-support = disable
rss-feed = disable rss-feed = enable
changelog = disable changelog = enable
rss-name = packages.rss rss-name = packages.rss
rss-base-url = http://packages.sabayon.org/?quicksearch= rss-base-url = http://packages.sabayon.org/?quicksearch=
rss-website-url = http://www.sabayon.org/ rss-website-url = http://www.sabayon.org/
+94
View File
@@ -0,0 +1,94 @@
#!/bin/bash
set -e
. /sbin/sabayondevkit-functions.sh
help_msg() {
echo "
sabayon-maint-helper:
Script for builder boxes maintenance.
-h|--help This message.
--installed Upgrades all the packages installed in the box.
--obsolete Upgrades ONLY the packages that are listed obsolete in eix-test-obsolete.
--all Tries to upgrade all package without any euristics
--category Tries to upgrade/install all the packages in the specified category
e.g. sabayon-maint-helper 'app-office'
Some options could be set also as environment variables:
EMERGE_DEFAULT_ARGS Default emerge options
NOTE: This script MUST be execute as root.
"
}
parse_args() {
local short_opts="h"
local long_opts="help arch: host-arch: unprivileged stagingdir: image-descr: image:"
$(set -- $(getopt -u -q -a -o "$short_opts" -l "$long_opts" -- "$@"))
while [ $# -gt 0 ] ; do
case "$1" in
-h|--help)
help_msg
exit 1
;;
--installed)
echo "Trying to upgrade all the installed packages"
rebuild_all
;;
--obsolete)
echo "Upgrading the packages that are marked as obsolete"
build_obsolete
;;
--all)
echo "Upgrading/Installing everything available to install"
build_all_availables
;;
--category)
echo "Upgrading/Installing everything inside the '$2' category"
build_category_installed "$2"
shift
;;
--)
help_msg
exit 1
;;
*)
echo "Invalid parameter $1."
exit 1
;;
esac
shift
done
return 0
}
main() {
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
[ -z "$@" ] && help_msg && exit 1
(
echo "Acquiring lock"
flock -x -w 10 200 || ( echo "Failed acquiring lock in 10 seconds" && exit 1 )
parse_args "$@"
) 200>/var/lock/.repomaint
}
main "$@"
+64 -39
View File
@@ -9,51 +9,76 @@ check_docker_requirements(){
die() { echo "$@" 1>&2 ; exit 1; } die() { echo "$@" 1>&2 ; exit 1; }
build() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --verbose --oneshot --nospinner --noreplace --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
echo "Building $i"
emerge $EMERGE_DEFAULT_ARGS -o $i && \
emerge $EMERGE_DEFAULT_ARGS $i
done
}
build_installed() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --newuse --noreplace --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
for i in $(EIX_LIMIT=0 eix -I --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
echo "Building $i"
emerge $EMERGE_DEFAULT_ARGS $i
done
}
build_all_availables() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build "$i/"
done
}
rebuild_all() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build_installed "$i/"
done
}
build_sync() { build_sync() {
emerge-webrsync || exit 1
emerge --sync
layman -S layman -S
emerge --sync
eix-update || exit 1 eix-update || exit 1
pushd /opt/sabayon-build/ pushd /opt/sabayon-build/
git stash git stash
git fetch --all git fetch --all
git checkout master git checkout master
git reset --heard origin/master git reset --hard origin/master
popd popd
} }
build_category() {
local SEARCH=$1
build_sync
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
echo "Building $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive --verbose --oneshot --nospinner --noreplace --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg} $i
done
}
build_obsolete() {
build_sync
for i in $(EIX_LIMIT=0 eix-test-obsolete | grep '\[U\]' | awk '{ print $2 }' | xargs echo | uniq);
do
echo "Build $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive -u --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg --noreplace} $i
done
}
build_category_installed() {
local SEARCH=$1
build_sync
for i in $(EIX_LIMIT=0 eix -I --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
echo "Building $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive -u --newuse --noreplace --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg} $i
done
}
build_all_availables() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build_category "$i/"
done
}
rebuild_all() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build_category_installed "$i/"
done
}
get_category() {
local CATEGORY=$1
local PACKS
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$CATEGORY/" | xargs echo | uniq);
do
PACKS+="$i "
done
echo $PACKS
}
get_all_availables() {
local RES
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
RES+="$(get_category $i) "
done
echo $RES
}