@@ -503,6 +503,24 @@ jobs:
503503 bash ./test-packages.sh \
504504 -p ${{needs.setup-variables.outputs.PACKAGE_NAME}}
505505
506+ - name : Test package negative (5.x install blocked when 4.x present)
507+ run : |
508+ cd ${{ needs.setup-variables.outputs.CURRENT_DIR }}/dev-tools/test-packages
509+ bash ./test-packages.sh --block-4x-install \
510+ -p ${{needs.setup-variables.outputs.PACKAGE_NAME}}
511+
512+ - name : Test package negative (5.x install blocked when remnants exist but version unknown)
513+ run : |
514+ cd ${{ needs.setup-variables.outputs.CURRENT_DIR }}/dev-tools/test-packages
515+ bash ./test-packages.sh --block-unknown-install \
516+ -p ${{needs.setup-variables.outputs.PACKAGE_NAME}}
517+
518+ - name : Test package reinstall (5.x install over 5.x succeeds)
519+ run : |
520+ cd ${{ needs.setup-variables.outputs.CURRENT_DIR }}/dev-tools/test-packages
521+ bash ./test-packages.sh --allow-same-major-reinstall \
522+ -p ${{needs.setup-variables.outputs.PACKAGE_NAME}}
523+
506524 - name : DEB - Test package install/uninstall
507525 if : ${{ inputs.system == 'deb' }}
508526 run : |
@@ -533,6 +551,13 @@ jobs:
533551 - name : DEB - Test package upgrade
534552 if : ${{ needs.setup-variables.outputs.PREVIOUS != '' && inputs.system == 'deb' }}
535553 run : |
554+ # Skip when previous and current major differ (pre-install guard blocks cross-major upgrades)
555+ VERSION_MAJOR=$(echo "${{needs.setup-variables.outputs.VERSION}}" | cut -d. -f1)
556+ PREVIOUS_MAJOR=$(echo "${{needs.setup-variables.outputs.PREVIOUS}}" | cut -d. -f1)
557+ if [ "$VERSION_MAJOR" != "$PREVIOUS_MAJOR" ]; then
558+ echo "Skipping upgrade test — different major ($PREVIOUS_MAJOR -> $VERSION_MAJOR)"
559+ exit 0
560+ fi
536561 sudo apt-get install debhelper tar curl libcap2-bin gnupg apt-transport-https #debhelper version 9 or later
537562 sudo curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && sudo chmod 644 /usr/share/keyrings/wazuh.gpg
538563 sudo echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | sudo tee -a /etc/apt/sources.list.d/wazuh.list
@@ -558,6 +583,37 @@ jobs:
558583 exit 1
559584 fi
560585
586+ - name : DEB - Verify cross-major upgrade is blocked
587+ if : ${{ needs.setup-variables.outputs.PREVIOUS != '' && inputs.system == 'deb' }}
588+ run : |
589+ sudo apt-get install debhelper tar curl libcap2-bin gnupg apt-transport-https
590+ sudo curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && sudo chmod 644 /usr/share/keyrings/wazuh.gpg
591+ sudo echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | sudo tee -a /etc/apt/sources.list.d/wazuh.list
592+ sudo apt-get update || sudo apt-get update
593+ sudo apt-get -y install wazuh-dashboard=${{needs.setup-variables.outputs.PREVIOUS}}
594+ sudo systemctl daemon-reload
595+ sudo systemctl enable wazuh-dashboard
596+ sudo systemctl start wazuh-dashboard
597+
598+ # Attempt 5.x upgrade — MUST fail
599+ set +e
600+ OUTPUT=$(sudo dpkg -i ${{ needs.setup-variables.outputs.CURRENT_DIR }}/dev-tools/test-packages/${{needs.setup-variables.outputs.PACKAGE_NAME}} 2>&1)
601+ EXIT_CODE=$?
602+ set -e
603+
604+ if [ "$EXIT_CODE" -eq 0 ]; then
605+ echo "ERROR: Installation should have been blocked but succeeded"
606+ exit 1
607+ fi
608+
609+ if echo "$OUTPUT" | grep -F -q "ERROR: Direct upgrade from Wazuh dashboard"; then
610+ echo "Cross-major upgrade correctly blocked"
611+ else
612+ echo "ERROR: Expected block message not found"
613+ echo "$OUTPUT"
614+ exit 1
615+ fi
616+
561617 - name : RPM - Clone automation repo
562618 if : ${{ inputs.system == 'rpm' }}
563619 env :
@@ -638,6 +694,13 @@ jobs:
638694 - name : RPM - Test package upgrade
639695 if : ${{ needs.setup-variables.outputs.PREVIOUS != '' && inputs.system == 'rpm' }}
640696 run : |
697+ # Skip when previous and current major differ (pre-install guard blocks cross-major upgrades)
698+ VERSION_MAJOR=$(echo "${{needs.setup-variables.outputs.VERSION}}" | cut -d. -f1)
699+ PREVIOUS_MAJOR=$(echo "${{needs.setup-variables.outputs.PREVIOUS}}" | cut -d. -f1)
700+ if [ "$VERSION_MAJOR" != "$PREVIOUS_MAJOR" ]; then
701+ echo "Skipping upgrade test — different major ($PREVIOUS_MAJOR -> $VERSION_MAJOR)"
702+ exit 0
703+ fi
641704 ${{ steps.setup_rpm_env.outputs.ssh_command }} "sudo yum install libcap; \
642705 sudo rpm --import https://packages.wazuh.com/key/GPG-KEY-WAZUH; \
643706 sudo echo -e '[wazuh]\ngpgcheck=1\ngpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH\nenabled=1\nname=EL-$releasever - Wazuh\nbaseurl=https://packages.wazuh.com/4.x/yum/\nprotect=1' | sudo tee /etc/yum.repos.d/wazuh.repo; \
@@ -660,6 +723,41 @@ jobs:
660723 exit 1; \
661724 fi
662725 "
726+ - name : RPM - Verify cross-major upgrade is blocked
727+ if : ${{ needs.setup-variables.outputs.PREVIOUS != '' && inputs.system == 'rpm' }}
728+ run : |
729+ ${{ steps.setup_rpm_env.outputs.ssh_command }} "sudo yum install libcap; \
730+ sudo rpm --import https://packages.wazuh.com/key/GPG-KEY-WAZUH; \
731+ sudo echo -e '[wazuh]\ngpgcheck=1\ngpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH\nenabled=1\nname=EL-$releasever - Wazuh\nbaseurl=https://packages.wazuh.com/4.x/yum/\nprotect=1' | sudo tee /etc/yum.repos.d/wazuh.repo; \
732+ sudo yum install -y wazuh-dashboard-${{needs.setup-variables.outputs.PREVIOUS}}; \
733+ sudo systemctl daemon-reload; \
734+ sudo systemctl enable wazuh-dashboard; \
735+ sudo systemctl start wazuh-dashboard; \
736+ if sudo systemctl status wazuh-dashboard | grep -q 'active (running)'; then \
737+ echo 'Service running'; \
738+ else \
739+ echo 'ERROR: Service not running'; \
740+ exit 1; \
741+ fi"
742+
743+ set +e
744+ OUTPUT=$(${{ steps.setup_rpm_env.outputs.ssh_command }} "sudo yum install -y ${{needs.setup-variables.outputs.PACKAGE_NAME}} 2>&1")
745+ EXIT_CODE=$?
746+ set -e
747+
748+ if [ "$EXIT_CODE" -eq 0 ]; then
749+ echo "ERROR: Installation should have been blocked but succeeded"
750+ exit 1
751+ fi
752+
753+ if echo "$OUTPUT" | grep -F -q "ERROR: Direct upgrade from Wazuh dashboard"; then
754+ echo "Cross-major upgrade correctly blocked"
755+ else
756+ echo "ERROR: Expected block message not found"
757+ echo "$OUTPUT"
758+ exit 1
759+ fi
760+
663761 - name : Destroy Allocator Machine
664762 # DO NOT DELETE. This ensures that the generated instance is destroyed even if the job fails.
665763 if : ${{ always() }}
0 commit comments