This commit is contained in:
Gérard Collin 2023-02-13 11:00:00 +01:00 committed by GitHub
commit 96fb08b28e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 286 additions and 13 deletions

View file

@ -4,9 +4,14 @@ function launch_new_lxc()
{
lxc info $LXC_BASE >/dev/null && lxc delete $LXC_BASE --force
profile_option=""
if [ "$profile" != "" ]; then
profile_option="--profile $profile"
fi
if [ $(get_arch) = $ARCH ];
then
lxc launch images:debian/$DIST/$ARCH $LXC_BASE -c security.privileged=true -c security.nesting=true
lxc launch images:debian/$DIST/$ARCH $LXC_BASE $profile_option -c security.privileged=true -c security.nesting=true
else
lxc image info $LXC_BASE >/dev/null && lxc image delete $LXC_BASE
@ -23,7 +28,7 @@ function launch_new_lxc()
popd
rm -rf "$tmp_dir"
lxc launch $LXC_BASE $LXC_BASE -c security.privileged=true -c security.nesting=true
lxc launch $LXC_BASE $LXC_BASE $profile_option -c security.privileged=true -c security.nesting=true
fi
}

View file

@ -21,6 +21,8 @@ LXC_NAME="ynh-appci-$DIST-$ARCH-$YNH_BRANCH-test-${WORKER_ID}"
readonly lock_file="./pcheck-${WORKER_ID}.lock"
LXC_PROFILE_LIST=(yunohost_ramfs yunohost_btrfs yunohost_dir)
#=================================================
# LXC helpers
#=================================================
@ -53,6 +55,12 @@ function check_lxd_setup()
ip a | grep -q lxdbr0 \
|| log_critical "There is no 'lxdbr0' interface... Did you ran 'lxd init' ?"
# Check the asked profile exists
if [[ "$profile" != "" ]] && [[ $(lxc profile list) != *"$profile"* ]]
then
log_critical "The lxd profile asked, $profile, is not configured. Did you run setup_lxd.sh ?"
fi
}
#=================================================

View file

@ -6,12 +6,17 @@
LXC_CREATE () {
log_info "Launching new LXC $LXC_NAME ..."
profile_option=""
if [ "$profile" != "" ]; then
profile_option="--profile $profile"
fi
# Check if we can launch container from YunoHost remote image
if lxc remote list | grep -q "yunohost" && lxc image list yunohost:$LXC_BASE | grep -q -w $LXC_BASE; then
# Force the usage of the fingerprint because otherwise for some reason lxd won't use the newer version
# available even though it's aware it exists -_-
LXC_BASE_HASH="$(lxc image list yunohost:ynh-appci-bullseye-amd64-stable-base --format json | jq -r '.[].fingerprint')"
lxc launch yunohost:$LXC_BASE_HASH $LXC_NAME \
lxc launch yunohost:$LXC_BASE_HASH $LXC_NAME $profile_option \
-c security.nesting=true \
-c security.privileged=true \
-c limits.memory=80% \
@ -19,7 +24,7 @@ LXC_CREATE () {
>>/proc/self/fd/3
# Check if we can launch container from a local image
elif lxc image list $LXC_BASE | grep -q -w $LXC_BASE; then
lxc launch $LXC_BASE $LXC_NAME \
lxc launch $LXC_BASE $LXC_NAME $profile_option \
-c security.nesting=true \
-c security.privileged=true \
-c limits.memory=80% \

View file

@ -16,6 +16,7 @@ print_help() {
-i, --interactive Wait for the user to continue before each remove
-e, --interactive-on-errors Wait for the user to continue on errors
-s, --force-stop Force the stop of running package_check
-p, --profile=PROFILE LXD profile to use when creating the instance
-r, --rebuild (Re)Build the base container
(N.B.: you're not supposed to use this option,
images are supposed to be fetch from
@ -39,6 +40,7 @@ interactive=0
interactive_on_errors=0
rebuild=0
force_stop=0
profile=""
function parse_args() {
@ -52,6 +54,11 @@ function parse_args() {
getopts_built_arg+=(-b)
arguments[$i]=${arguments[$i]//--branch=/}
fi
if [[ "${arguments[$i]}" =~ "--profile=" ]]
then
getopts_built_arg+=(-p)
arguments[$i]=${arguments[$i]//--profile=/}
fi
# For each argument in the array, reduce to short argument for getopts
arguments[$i]=${arguments[$i]//--interactive/-i}
arguments[$i]=${arguments[$i]//--rebuild/-r}
@ -71,7 +78,7 @@ function parse_args() {
# Initialize the index of getopts
OPTIND=1
# Parse with getopts only if the argument begin by -
getopts ":b:iresh" parameter || true
getopts ":b:iresp:h" parameter || true
case $parameter in
b)
# --branch=branch-name
@ -98,6 +105,11 @@ function parse_args() {
force_stop=1
shift_value=1
;;
p)
# --profile=profile
profile="$OPTARG"
shift_value=2
;;
h)
# --help
print_help
@ -128,6 +140,28 @@ function parse_args() {
arguments=("$@")
parse_args
#=================================================
# Guess the best lxd profile to apply
#=================================================
select_the_best_profile () {
if [[ "$profile" == "" ]]
then
# No profile preselected try to find one automatically
for name in "${LXC_PROFILE_LIST[@]}"
do
if [[ "$profile" == "" ]] && [[ $(lxc profile list --format=compact) == *"$name"* ]]
then
profile=$name
fi
done
fi
if [[ "$profile" != "" ]]
then
echo "Using LXD profile $profile"
fi
}
#=================================================
# Cleanup / force-stop
#=================================================
@ -193,6 +227,8 @@ trap 'exit 2' TERM
assert_we_are_connected_to_the_internets
assert_we_have_all_dependencies
select_the_best_profile
if [[ $rebuild == 1 ]]
then
rebuild_base_lxc 2>&1 | tee -a "./build_base_lxc.log"
@ -202,7 +238,13 @@ fi
self_upgrade
fetch_or_upgrade_package_linter
readonly TEST_CONTEXT=$(mktemp -d /tmp/package_check.XXXXXX)
root_tmp_dir=/tmp
if [[ $profile == "yunohost_ramfs" ]]
then
# Download the application into the ramdisk if it exist
root_tmp_dir=/tmp/yunohost_ramfs
fi
readonly TEST_CONTEXT=$(mktemp -d $root_tmp_dir/package_check.XXXXXX)
fetch_package_to_test "$path_to_package_to_test"
run_all_tests

213
setup_lxd.sh Executable file
View file

@ -0,0 +1,213 @@
#!/bin/bash
cd $(dirname $(realpath $0))
source "./lib/common.sh"
print_help() {
cat << EOF
Usage: setup_lxd.sh [OPTION]...
-t, --type=TYPE Specify which type of storage to use: ramfs, dir or btrfs
-s, --size=SIZE The storage size allocated to ramfs (5G, 10G...)
-r, --reset Removes all the storage and disks created with this script. Be careful as instances will be deleted as well
-h, --help Display this help
EOF
exit 0
}
#=================================================
# Pase CLI arguments
#=================================================
# If no arguments provided
# Print the help and exit
[ "$#" -eq 0 ] && print_help
type="dir"
size="10G"
reset=0
function parse_args() {
local getopts_built_arg=()
# Read the array value per value
for i in $(seq 0 $(( ${#arguments[@]} -1 )))
do
if [[ "${arguments[$i]}" =~ "--type=" ]]
then
getopts_built_arg+=(-t)
arguments[$i]=${arguments[$i]//--type=/}
fi
if [[ "${arguments[$i]}" =~ "--size=" ]]
then
getopts_built_arg+=(-s)
arguments[$i]=${arguments[$i]//--size=/}
fi
# For each argument in the array, reduce to short argument for getopts
arguments[$i]=${arguments[$i]//--reset/-r}
arguments[$i]=${arguments[$i]//--help/-h}
getopts_built_arg+=("${arguments[$i]}")
done
# Read and parse all the arguments
# Use a function here, to use standart arguments $@ and be able to use shift.
parse_arg () {
while [ $# -ne 0 ]
do
# If the paramater begins by -, treat it with getopts
if [ "${1:0:1}" == "-" ]
then
# Initialize the index of getopts
OPTIND=1
# Parse with getopts only if the argument begin by -
getopts "t:s:r" parameter || true
case $parameter in
t)
# --type
type=$OPTARG
shift_value=2
;;
s)
# --size
size=$OPTARG
shift_value=2
;;
r)
# --reset
reset=1
;;
h)
# --help
print_help
;;
\?)
echo "Invalid argument: -${OPTARG:-}"
print_help
;;
:)
echo "-$OPTARG parameter requires an argument."
print_help
;;
esac
# Otherwise, it's not an option, it's an operand
# else
# path_to_package_to_test="$1"
# shift_value=1
fi
# Shift the parameter and its argument
shift $shift_value
done
}
# Call parse_arg and pass the modified list of args as a array of arguments.
parse_arg "${getopts_built_arg[@]}"
}
function create_lxd_profile () {
if [[ $(lxc profile list --format=compact) == *"$profile_name"* ]]
then
lxc profile delete $profile_name
fi
lxc profile create $profile_name
lxc profile device add $profile_name root disk path=/ pool=$profile_name
lxc profile device add $profile_name eth0 nic name=eth0 network=lxdbr0
echo "You can use the profile $profile_name (--profile $profile_name) when running package_check.sh"
}
# Create the asked storage
function create_storage() {
case $type in
dir)
echo "Creating dir storage for package_check"
if [[ $(lxc storage list --format=compact) != *"yunohost_dir"* ]]
then
lxc storage create yunohost_dir dir
fi
profile_name=yunohost_dir
create_lxd_profile
;;
ramfs)
echo "Creating RamFS storage"
if [[ $(lxc profile list --format=compact) == *"yunohost_ramfs"* ]]
then
lxc profile delete yunohost_ramfs
fi
if [[ $(lxc storage list --format=compact) == *"yunohost_ramfs"* ]]
then
lxc storage delete yunohost_ramfs
fi
if [[ -e /tmp/yunohost_ramfs ]]
then
sudo umount /tmp/yunohost_ramfs
sudo rm -rf /tmp/yunohost_ramfs
fi
sudo mkdir --parents /tmp/yunohost_ramfs
sudo mount -t tmpfs -o size=$size tmpfs /tmp/yunohost_ramfs
lxc storage create yunohost_ramfs dir source=/tmp/yunohost_ramfs
profile_name=yunohost_ramfs
create_lxd_profile
;;
btrfs)
echo "Creating btrfs storage for package_check"
if [[ $(lxc storage list --format=compact) != *"yunohost_btrfs"* ]]
then
lxc storage create yunohost_btrfs btrfs
fi
profile_name=yunohost_btrfs
create_lxd_profile
;;
esac
}
# Removes all the storage that has been created by this script
function remove_all_storage() {
for name in "${LXC_PROFILE_LIST[@]}"
do
if [[ $(lxc profile list --format=compact) == *"$name"* ]]
then
lxc profile delete $name
fi
if [[ $(lxc storage list --format=compact) == *"$name"* ]]
then
lxc storage delete $name
fi
done
if [[ -e /tmp/yunohost_ramfs ]]
then
sudo umount /tmp/yunohost_ramfs
sudo rm -rf /tmp/yunohost_ramfs
fi
}
arguments=("$@")
parse_args
#==========================
# Main code
#==========================
assert_we_are_connected_to_the_internets
assert_we_have_all_dependencies
if [[ $reset == 1 ]]
then
remove_all_storage
exit 0
fi
create_storage
exit 0
}