diff --git a/.github/workflows/script-test.yml b/.github/workflows/script-test.yml
index a9e62f60..1c895f9a 100644
--- a/.github/workflows/script-test.yml
+++ b/.github/workflows/script-test.yml
@@ -1,21 +1,25 @@
-name: Run Scripts on PVE Node
+name: Run Scripts on PVE Node for testing
+permissions:
+ pull-requests: write
on:
- pull_request:
+ pull_request_target:
branches:
- main
paths:
- - 'install/*.sh'
- - 'ct/*.sh'
+ - 'install/**.sh'
+ - 'ct/**.sh'
jobs:
run-install-script:
runs-on: pvenode
steps:
- - name: Checkout PR branch
+ - name: Checkout PR branch (supports forks)
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
- fetch-depth: 0
+ repository: ${{ github.event.pull_request.head.repo.full_name }}
+ fetch-depth: 0
+
- name: Add Git safe directory
run: |
git config --global --add safe.directory /__w/ProxmoxVE/ProxmoxVE
@@ -26,13 +30,14 @@ jobs:
run: |
echo "GH_TOKEN=${GH_TOKEN}" >> $GITHUB_ENV
- - name: Get changed files in PR
- id: changed-files
- run: |
- CHANGED_FILES=$(gh pr diff --name-only ${{ github.event.pull_request.number }})
- CHANGED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')
- echo "Changed files: $CHANGED_FILES"
+ - name: Get Changed Files
+ run: |
+ CHANGED_FILES=$(gh pr diff ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --name-only)
+ CHANGED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')
+ echo "Changed files: $CHANGED_FILES"
echo "SCRIPT=$CHANGED_FILES" >> $GITHUB_ENV
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Get scripts
id: check-install-script
@@ -51,7 +56,7 @@ jobs:
ALL_FILES=$(echo "${ALL_FILES[@]}" | xargs)
echo "$ALL_FILES"
echo "ALL_FILES=$ALL_FILES" >> $GITHUB_ENV
-
+
- name: Run scripts
id: run-install
continue-on-error: true
@@ -59,13 +64,15 @@ jobs:
set +e
#run for each files in /ct
for FILE in ${{ env.ALL_FILES }}; do
- echo "Running: $FILE"
STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
+ echo "Running Test for: $STRIPPED_NAME"
if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
CT_SCRIPT="ct/$STRIPPED_NAME.sh"
if [[ ! -f $CT_SCRIPT ]]; then
echo "No CT script found for $STRIPPED_NAME"
- exit 1
+ ERROR_MSG="No CT script found for $FILE"
+ echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
+ continue
fi
echo "Found CT script for $STRIPPED_NAME"
chmod +x "$CT_SCRIPT"
@@ -74,8 +81,10 @@ jobs:
INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
if [[ ! -f $INSTALL_SCRIPT ]]; then
echo "No install script found for $STRIPPED_NAME"
- exit 1
- fi
+ ERROR_MSG="No install script found for $FILE"
+ echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
+ continue
+ fi
echo "Found install script for $STRIPPED_NAME"
chmod +x "$INSTALL_SCRIPT"
RUNNING_FILE=$FILE
@@ -84,13 +93,13 @@ jobs:
git checkout origin/main .github/workflows/scripts/app-test/pr-install.func
git checkout origin/main .github/workflows/scripts/app-test/pr-alpine-install.func
git checkout origin/main .github/workflows/scripts/app-test/pr-create-lxc.sh
- sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
chmod +x $RUNNING_FILE
chmod +x .github/workflows/scripts/app-test/pr-create-lxc.sh
chmod +x .github/workflows/scripts/app-test/pr-install.func
chmod +x .github/workflows/scripts/app-test/pr-alpine-install.func
chmod +x .github/workflows/scripts/app-test/pr-build.func
-
+ sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
+ echo "Executing $RUNNING_FILE"
ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
echo "Finished running $FILE"
if [ -n "$ERROR_MSG" ]; then
@@ -110,8 +119,8 @@ jobs:
pct stop $container_id
pct destroy $container_id
fi
- done
-
+ done
+
- name: Post error comments
run: |
ERROR="false"
@@ -128,12 +137,17 @@ jobs:
echo "Posting error message for $FILE"
echo ${CLEANED_ERROR_MSG}
gh pr comment ${{ github.event.pull_request.number }} \
+ --repo ${{ github.repository }} \
--body ":warning: The script _**$FILE**_ failed with the following message:
${CLEANED_ERROR_MSG}
"
+
ERROR="true"
fi
done
echo "ERROR=$ERROR" >> $GITHUB_ENV
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
- name: Fail if error
- if: ${{ env.ERROR }} == 'true'
+ if: ${{ env.ERROR == 'true' }}
run: exit 1
diff --git a/.github/workflows/scripts/app-test/pr-build.func b/.github/workflows/scripts/app-test/pr-build.func
index 5706dbbb..1a2dde75 100644
--- a/.github/workflows/scripts/app-test/pr-build.func
+++ b/.github/workflows/scripts/app-test/pr-build.func
@@ -1,12 +1,11 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
-# Author: michelroegl-brunner
+# Author: Michel Roegl-Brunner (michelroegl-brunner)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
variables() {
- NSAPP=$(echo ${APP,,} | tr -d ' ')
- var_install="${NSAPP}-install"
-
+ NSAPP=$(echo ${APP,,} | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
+ var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
}
NEXTID=$(pvesh get /cluster/nextid)
@@ -16,7 +15,7 @@ header_info(){
}
base_settings() {
-
+ # Default Settings
CT_TYPE="1"
DISK_SIZE="4"
CORE_COUNT="1"
@@ -40,7 +39,7 @@ base_settings() {
SSH_AUTHORIZED_KEY=""
TAGS="community-script;"
-
+ # Override default settings with variables from ct script
CT_TYPE=${var_unprivileged:-$CT_TYPE}
DISK_SIZE=${var_disk:-$DISK_SIZE}
CORE_COUNT=${var_cpu:-$CORE_COUNT}
@@ -48,6 +47,7 @@ base_settings() {
VERB=${var_verbose:-$VERBOSE}
TAGS="${TAGS}${var_tags:-}"
+ # Since these 2 are only defined outside of default_settings function, we add a temporary fallback. TODO: To align everything, we should add these as constant variables (e.g. OSTYPE and OSVERSION), but that would currently require updating the default_settings function for all existing scripts
if [ -z "$var_os" ]; then
var_os="debian"
fi
@@ -112,10 +112,9 @@ error_handler() {
SCRIPT_NAME=$(basename "$0")
local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
echo -e "\n$error_message"
- exit "$error_message"
+ exit 100
}
-
msg_info() {
local msg="$1"
echo -ne "${msg}\n"
@@ -136,7 +135,8 @@ start(){
}
build_container() {
-
+ # if [ "$VERB" == "yes" ]; then set -x; fi
+
if [ "$CT_TYPE" == "1" ]; then
FEATURES="keyctl=1,nesting=1"
else
diff --git a/.github/workflows/scripts/app-test/pr-create-lxc.sh b/.github/workflows/scripts/app-test/pr-create-lxc.sh
index 3dd792b1..6ca899cf 100644
--- a/.github/workflows/scripts/app-test/pr-create-lxc.sh
+++ b/.github/workflows/scripts/app-test/pr-create-lxc.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
-# Author: michelroegl-brunner
+# Author: Michel Roegl-Brunner (michelroegl-brunner)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
color() {
@@ -11,7 +11,6 @@ catch_errors() {
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
}
-
error_handler() {
local exit_code="$?"
local line_number="$1"
@@ -68,6 +67,7 @@ function select_storage() {
*) false || { msg_error "Invalid storage class."; exit 201; };;
esac
+ # This Queries all storage locations
local -a MENU
while read -r line; do
local TAG=$(echo $line | awk '{print $1}')
@@ -81,6 +81,7 @@ function select_storage() {
MENU+=("$TAG" "$ITEM" "OFF")
done < <(pvesm status -content $CONTENT | awk 'NR>1')
+ # Select storage location
if [ $((${#MENU[@]}/3)) -eq 1 ]; then
printf ${MENU[0]}
else
@@ -103,17 +104,12 @@ if pct status $CTID &>/dev/null; then
exit 206
fi
-
TEMPLATE_STORAGE=$(select_storage template) || exit
-msg_ok "Using $TEMPLATE_STORAGE for Template Storage."
-
CONTAINER_STORAGE=$(select_storage container) || exit
-msg_ok "Using $CONTAINER_STORAGE for Container Storage."
-msg_info "Updating LXC Template List"
pveam update >/dev/null
-msg_ok "Updated LXC Template List"
+
TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-}
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
@@ -124,35 +120,29 @@ TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
[[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
- msg_info "Downloading LXC Template"
pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
{ msg_error "A problem occurred while downloading the LXC template."; exit 208; }
- msg_ok "Downloaded LXC Template"
fi
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >> /etc/subuid
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >> /etc/subgid
-
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
-echo "${PCT_OPTIONS[@]}"
-
-msg_info "Creating LXC Container"
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
[[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
- msg_ok "Template integrity check completed"
+
pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
{ msg_error "A problem occurred while re-downloading the LXC template."; exit 208; }
- msg_ok "Re-downloaded LXC Template"
+
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
msg_error "A problem occurred while trying to create container after re-downloading template."
exit 200
fi
fi
-msg_ok "LXC Container $CTID was successfully created."
+
diff --git a/.github/workflows/scripts/app-test/pr-install.func b/.github/workflows/scripts/app-test/pr-install.func
index 60e202d5..03e82335 100644
--- a/.github/workflows/scripts/app-test/pr-install.func
+++ b/.github/workflows/scripts/app-test/pr-install.func
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
-# Author: michelroegl-brunner
+# Author: Michel Roegl-Brunner (michelroegl-brunner)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
color() {
@@ -11,13 +11,14 @@ catch_errors() {
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
}
+
error_handler() {
local line_number="$1"
local command="$2"
SCRIPT_NAME=$(basename "$0")
local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
echo -e "\n$error_message"
- exit "$error_message"
+ exit 200
}
verb_ip6() {
STD=""
@@ -39,9 +40,11 @@ msg_error() {
local msg="$1"
echo -e "${msg}\n"
}
- RETRY_NUM=10
- RETRY_EVERY=3
+
+RETRY_NUM=10
+RETRY_EVERY=3
setting_up_container() {
+
sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
locale_line=$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print $1}' | head -n 1)
echo "LANG=${locale_line}" >/etc/default/locale
@@ -54,7 +57,6 @@ setting_up_container() {
if [ "$(hostname -I)" != "" ]; then
break
fi
- echo 1>&2 -en "No Network! "
sleep $RETRY_EVERY
done
if [ "$(hostname -I)" = "" ]; then
@@ -64,8 +66,6 @@ setting_up_container() {
fi
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
systemctl disable -q --now systemd-networkd-wait-online.service
- msg_ok "Set up Container OS"
- msg_ok "Network Connected: $(hostname -I)"
}
network_check() {
@@ -75,11 +75,10 @@ network_check() {
}
update_os() {
- msg_info "Updating Container OS"
- apt-get update
- apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
- rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
- msg_ok "Updated Container OS"
+ export DEBIAN_FRONTEND=noninteractive
+ apt-get update >/dev/null 2>&1
+ apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade >/dev/null 2>&1
+ rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
}
motd_ssh() {