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() {