mirror of
https://github.com/nextcloud/nextcloudpi.git
synced 2026-01-10 15:12:01 -03:30
/etc/ncp-dist-upgrade*: Implement dist-upgrade for bullseye->bookworm and add integration tests for it
Signed-off-by: Tobias Knöppler <6317548+theCalcaholic@users.noreply.github.com> Signed-off-by: Tobias K <6317548+theCalcaholic@users.noreply.github.com>
This commit is contained in:
parent
474c0007a1
commit
a0c6b213e6
35
.github/actions/create-test-instance-bullseye/action.yml
vendored
Normal file
35
.github/actions/create-test-instance-bullseye/action.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
name: Create Test VM
|
||||||
|
description: Create NCP instance for testing in the Hetzner cloud
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: version (git rev / tag / branch) to install
|
||||||
|
required: true
|
||||||
|
uid:
|
||||||
|
description: A unique ID for labeling/naming generated resources
|
||||||
|
required: true
|
||||||
|
hcloud_token:
|
||||||
|
description: A auth token for Hetzner cloud
|
||||||
|
required: true
|
||||||
|
server_type:
|
||||||
|
description: Server type to use for hetzner servers
|
||||||
|
required: true
|
||||||
|
default: "cx11"
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
server_address:
|
||||||
|
description: Adress of the test instance
|
||||||
|
snapshot_id:
|
||||||
|
description: ID of the generated postinstall snapshot
|
||||||
|
test_server_id:
|
||||||
|
description: ID of the created test server
|
||||||
|
runs:
|
||||||
|
using: docker
|
||||||
|
image: docker://thecalcaholic/ncp-test-automation:bullseye
|
||||||
|
|
||||||
|
env:
|
||||||
|
HCLOUD_TOKEN: ${{ inputs.hcloud_token }}
|
||||||
|
UID: ${{ inputs.uid }}
|
||||||
|
SERVER_TYPE: ${{ inputs.server_type }}
|
||||||
|
args:
|
||||||
|
- /ncp-test-automation/bin/actions/create-test-instance.sh
|
||||||
|
- ${{ inputs.version }}
|
||||||
@ -24,7 +24,7 @@ outputs:
|
|||||||
description: ID of the created test server
|
description: ID of the created test server
|
||||||
runs:
|
runs:
|
||||||
using: docker
|
using: docker
|
||||||
image: docker://thecalcaholic/ncp-test-automation
|
image: docker://thecalcaholic/ncp-test-automation:bookworm
|
||||||
|
|
||||||
env:
|
env:
|
||||||
HCLOUD_TOKEN: ${{ inputs.hcloud_token }}
|
HCLOUD_TOKEN: ${{ inputs.hcloud_token }}
|
||||||
|
|||||||
169
.github/workflows/build-lxd.yml
vendored
169
.github/workflows/build-lxd.yml
vendored
@ -321,6 +321,175 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test-dist-upgrade:
|
||||||
|
needs:
|
||||||
|
- determine-runner
|
||||||
|
runs-on: [ubuntu-20.04]
|
||||||
|
env:
|
||||||
|
VERSION: "${{ inputs.git_ref || github.ref }}"
|
||||||
|
ARTIFACT_NAME: "${{ needs.build-previous.outputs.artifact_name }}"
|
||||||
|
LXC: "${{ needs.determine-runner.outputs.lxc_cmd }}"
|
||||||
|
PREVIOUS_IMAGE_URL: "https://github.com/nextcloud/nextcloudpi/releases/download/v1.53.2/NextcloudPi_LXD_x86_v1.53.2.tar.gz"
|
||||||
|
steps:
|
||||||
|
- uses: whywaita/setup-lxd@v1
|
||||||
|
if: ${{ needs.determine-runner.outputs.lxc_cmd == 'lxc' }}
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
lxd_version: latest/stable
|
||||||
|
- name: Fix LXD
|
||||||
|
run: |
|
||||||
|
sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT
|
||||||
|
sudo iptables -I DOCKER-USER -o lxdbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: "${{ env.VERSION }}"
|
||||||
|
- name: Setup Firefox
|
||||||
|
continue-on-error: true
|
||||||
|
id: setup-firefox-browser-action
|
||||||
|
uses: browser-actions/setup-firefox@latest
|
||||||
|
- name: Setup Firefox from packages
|
||||||
|
if: ${{ steps.setup-firefox-browser-action.outcome == 'failure' }}
|
||||||
|
run: |
|
||||||
|
sudo apt-get install -y --no-install-recommends firefox
|
||||||
|
- name: Setup GeckoDriver
|
||||||
|
uses: ChlodAlejandro/setup-geckodriver@latest
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Setup Selenium
|
||||||
|
run: pip install selenium
|
||||||
|
- name: download LXD image
|
||||||
|
run: |
|
||||||
|
wget -qO ./ncp.tar.gz "${PREVIOUS_IMAGE_URL?}"
|
||||||
|
- name: Launch ncp container
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
"$LXC" delete -q -f ncp || true
|
||||||
|
"$LXC" image import -q "./ncp.tar.gz" --alias "ncp/update"
|
||||||
|
systemd-run --user --scope -p "Delegate=yes" "$LXC" launch -q "ncp/update" ncp
|
||||||
|
"$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done'
|
||||||
|
"$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log
|
||||||
|
sleep 30
|
||||||
|
ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)"
|
||||||
|
ip="${ip/% *}"
|
||||||
|
echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts
|
||||||
|
- name: Activate and Test LXD Image
|
||||||
|
working-directory: ./tests
|
||||||
|
run: |
|
||||||
|
"$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' &
|
||||||
|
python activation_tests.py --no-gui "nextcloudpi.local" 443 4443 || {
|
||||||
|
echo "Activation test failed!"
|
||||||
|
echo "Geckodriver logs:"
|
||||||
|
tail -n 20 geckodriver.log >&2 || true
|
||||||
|
echo "================"
|
||||||
|
echo "ncp.log: "
|
||||||
|
"$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
python system_tests.py --non-interactive --skip-update-test || {
|
||||||
|
echo "System test failed!"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
python nextcloud_tests.py --no-gui --skip-release-check "nextcloudpi.local" 443 4443 || {
|
||||||
|
echo "Nextcloud test failed!"
|
||||||
|
echo "Geckodriver logs:"
|
||||||
|
tail -n 20 geckodriver.log >&2 || true
|
||||||
|
echo "================"
|
||||||
|
echo "ncp.log: "
|
||||||
|
"$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true
|
||||||
|
echo "================"
|
||||||
|
echo "nextcloud log: "
|
||||||
|
datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)"
|
||||||
|
"$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Update ncp
|
||||||
|
run: |
|
||||||
|
set -ex
|
||||||
|
BRANCH="${VERSION/refs\/heads\//}"
|
||||||
|
BRANCH="${BRANCH/refs\/tags\//}"
|
||||||
|
if [[ "$BRANCH" =~ "refs/pull/"* ]]
|
||||||
|
then
|
||||||
|
UPDATE_ARGS=("${{ github.head_ref }}" "$VERSION")
|
||||||
|
else
|
||||||
|
UPDATE_ARGS=("$BRANCH")
|
||||||
|
fi
|
||||||
|
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||||
|
echo "Running update to ${VERSION}"
|
||||||
|
|
||||||
|
current_nc_version="$("$LXC" exec ncp -- ncc status | grep "version:" | awk '{ print $3 }')"
|
||||||
|
latest_nc_version="$(cat etc/ncp.cfg | jq -r '.nextcloud_version')"
|
||||||
|
|
||||||
|
"$LXC" exec ncp -- bash -c "DBG=x ncp-update ${UPDATE_ARGS[*]}"
|
||||||
|
"$LXC" exec ncp -- /usr/local/bin/ncc status
|
||||||
|
|
||||||
|
if [[ "$current_nc_version" =~ "$latest_nc_version".* ]]
|
||||||
|
then
|
||||||
|
echo "Nextcloud is up to date - skipping NC update test."
|
||||||
|
else
|
||||||
|
"$LXC" exec ncp -- bash -c "DBG=x ncp-update-nc ${latest_nc_version?}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
"$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log
|
||||||
|
|
||||||
|
"$LXC" stop ncp
|
||||||
|
- name: Relaunch container
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
systemd-run --user --scope -p "Delegate=yes" "$LXC" start ncp
|
||||||
|
"$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done'
|
||||||
|
sleep 30
|
||||||
|
ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)"
|
||||||
|
ip="${ip/% *}"
|
||||||
|
echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts
|
||||||
|
- name: Test LXD Image
|
||||||
|
working-directory: ./tests
|
||||||
|
run: |
|
||||||
|
"$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' &
|
||||||
|
python system_tests.py --non-interactive --skip-update-test || {
|
||||||
|
echo "System test failed!"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
python nextcloud_tests.py --no-gui --skip-release-check "nextcloudpi.local" 443 4443 || {
|
||||||
|
echo "Nextcloud test failed!"
|
||||||
|
echo "Geckodriver logs:"
|
||||||
|
tail -n 20 geckodriver.log >&2 || true
|
||||||
|
echo "================"
|
||||||
|
echo "ncp.log: "
|
||||||
|
"$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true
|
||||||
|
echo "================"
|
||||||
|
echo "nextcloud log: "
|
||||||
|
datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)"
|
||||||
|
"$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
- name: NCP distupgrade
|
||||||
|
id: distupgrade
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
"$LXC" exec ncp -- cat /etc/os-release | grep 'VERSION_ID="11"' || {
|
||||||
|
echo "can't upgrade from Debian $("$LXC" exec ncp -- cat /etc/os-release | grep VERSION_ID=)"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
"$LXC" exec ncp -- bash -c "DEBIAN_FRONTEND=noninteractive ncp-dist-upgrade"
|
||||||
|
|
||||||
|
"$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log
|
||||||
|
|
||||||
|
"$LXC" stop ncp
|
||||||
|
- name: Relaunch container
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
systemd-run --user --scope -p "Delegate=yes" "$LXC" start ncp
|
||||||
|
"$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done'
|
||||||
|
sleep 30
|
||||||
|
ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)"
|
||||||
|
ip="${ip/% *}"
|
||||||
|
echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts
|
||||||
|
- name: Test LXD Image
|
||||||
|
working-directory: ./tests
|
||||||
|
run: |
|
||||||
|
"$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' &
|
||||||
python system_tests.py --non-interactive || {
|
python system_tests.py --non-interactive || {
|
||||||
echo "System test failed!"
|
echo "System test failed!"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
525
.github/workflows/build-sd-images.yml
vendored
525
.github/workflows/build-sd-images.yml
vendored
@ -186,6 +186,14 @@ jobs:
|
|||||||
sudo wget -nv https://github.com/multiarch/qemu-user-static/releases/latest/download/qemu-arm-static -O raspbian_root/usr/bin/qemu-arm-static
|
sudo wget -nv https://github.com/multiarch/qemu-user-static/releases/latest/download/qemu-arm-static -O raspbian_root/usr/bin/qemu-arm-static
|
||||||
sudo chmod +x raspbian_root/usr/bin/qemu-{arm,aarch64}-static
|
sudo chmod +x raspbian_root/usr/bin/qemu-{arm,aarch64}-static
|
||||||
echo 'Mutex posixsem' | sudo tee -a raspbian_root/etc/apache2/mods-available/ssl.conf
|
echo 'Mutex posixsem' | sudo tee -a raspbian_root/etc/apache2/mods-available/ssl.conf
|
||||||
|
echo 'ignore-warnings ARM64-COW-BUG' | sudo tee -a raspbian_root/etc/redis/redis.conf
|
||||||
|
sudo mkdir -p raspbian_root/etc/systemd/system/redis-server.service.d
|
||||||
|
echo '[Service]' | sudo tee raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf
|
||||||
|
echo 'PrivateUsers=false' | sudo tee -a raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf
|
||||||
|
|
||||||
|
sudo mkdir -p raspbian_root/etc/systemd/system/php8.1-fpm.service.d
|
||||||
|
echo '[Service]' | sudo tee raspbian_root/etc/systemd/system/php8.1-fpm.service.d/ncp.conf
|
||||||
|
echo 'ExecStartPre=mkdir -p /var/run/php' | sudo tee -a raspbian_root/etc/systemd/system/php8.1-fpm.service.d/ncp.conf
|
||||||
- name: Test image
|
- name: Test image
|
||||||
id: test
|
id: test
|
||||||
run: |
|
run: |
|
||||||
@ -308,8 +316,9 @@ jobs:
|
|||||||
echo -e "${LOG_DIAG} ncp.log: "
|
echo -e "${LOG_DIAG} ncp.log: "
|
||||||
"${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
"${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
echo "================"
|
echo "================"
|
||||||
echo "Nextcloud log: "
|
echo "${LOG_DIAG} Nextcloud log: "
|
||||||
"${CONTAINER_CMD[@]}" -q ncp cat /opt/ncdata/data/nextcloud.log
|
"${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
"${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
sleep 12
|
sleep 12
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -323,3 +332,515 @@ jobs:
|
|||||||
echo -e "${LOG_CICD} Nextcloud test failed in all attempts!"
|
echo -e "${LOG_CICD} Nextcloud test failed in all attempts!"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# test-distupgrade:
|
||||||
|
# runs-on: ubuntu-20.04
|
||||||
|
# env:
|
||||||
|
# VERSION: "${{ inputs.git_ref || github.ref }}"
|
||||||
|
# LOG_GUEST: "\\033[1;34mGUEST::\\033[0m"
|
||||||
|
# LOG_NCP: "\\033[1;36m~NCP::\\033[0m"
|
||||||
|
# LOG_CICD: "\\033[1;35mCICD::\\033[0m"
|
||||||
|
# LOG_TEST: "\\033[1;33mTEST::\\033[0m"
|
||||||
|
# LOG_DIAG: "\\033[1;31mDIAG::\\033[0m"
|
||||||
|
# PREVIOUS_VERSION: "v1.53.2"
|
||||||
|
# defaults:
|
||||||
|
# run:
|
||||||
|
# shell: bash
|
||||||
|
# steps:
|
||||||
|
# - name: Set up QEMU
|
||||||
|
# uses: docker/setup-qemu-action@v3
|
||||||
|
# - name: Checkout code
|
||||||
|
# uses: actions/checkout@v3
|
||||||
|
# with:
|
||||||
|
# ref: "${{ env.VERSION }}"
|
||||||
|
# - name: Download previous image
|
||||||
|
# id: download-previous-image
|
||||||
|
# run: |
|
||||||
|
# set -x
|
||||||
|
# mkdir -p output
|
||||||
|
# cd output
|
||||||
|
# wgetrc=0
|
||||||
|
# wgeterr="$(wget -O ./ncp.zip "https://github.com/nextcloud/nextcloudpi/releases/download/${PREVIOUS_VERSION?}/NextcloudPi_${{ inputs.board_name }}_${PREVIOUS_VERSION}.zip" 2>&1)" || wgetrc=$?
|
||||||
|
# if [[ $wgetrc -ne 0 ]]
|
||||||
|
# then
|
||||||
|
# if echo "$wgeterr" | grep '404 Not Found'
|
||||||
|
# then
|
||||||
|
# echo "Board not found in previous release - skipping."
|
||||||
|
# echo "skipped=true" >> "$GITHUB_OUTPUT"
|
||||||
|
# exit 0
|
||||||
|
# else
|
||||||
|
# echo "$wgeterr"
|
||||||
|
# exit $wgetrc
|
||||||
|
# fi
|
||||||
|
# fi
|
||||||
|
# echo "skipped=false" >> "$GITHUB_OUTPUT"
|
||||||
|
# unzip ncp.zip
|
||||||
|
# rm ncp.zip
|
||||||
|
# mv NextcloudPi_${{ inputs.board_name }}_${PREVIOUS_VERSION}.img ./ncp.img
|
||||||
|
# echo "ARTIFACT_FILE=ncp.img" >> "$GITHUB_ENV"
|
||||||
|
# - name: Prepare test
|
||||||
|
# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }}
|
||||||
|
# run: |
|
||||||
|
# set -x
|
||||||
|
# mv output/${ARTIFACT_FILE?} ncp.img
|
||||||
|
# sudo apt-get install -y systemd-container
|
||||||
|
# sudo pip install selenium
|
||||||
|
# sudo rm -rf raspbian_root
|
||||||
|
# . ./build/buildlib.sh
|
||||||
|
# mount_raspbian "ncp.img"
|
||||||
|
# sudo cat raspbian_root/etc/machine-id
|
||||||
|
# sudo systemd-id128 new | sudo tee ./raspbian_root/etc/machine-id
|
||||||
|
# sudo wget -nv https://github.com/multiarch/qemu-user-static/releases/latest/download/qemu-aarch64-static -O raspbian_root/usr/bin/qemu-aarch64-static
|
||||||
|
# sudo wget -nv https://github.com/multiarch/qemu-user-static/releases/latest/download/qemu-arm-static -O raspbian_root/usr/bin/qemu-arm-static
|
||||||
|
# sudo chmod +x raspbian_root/usr/bin/qemu-{arm,aarch64}-static
|
||||||
|
# echo 'Mutex posixsem' | sudo tee -a raspbian_root/etc/apache2/mods-available/ssl.conf
|
||||||
|
# echo 'ignore-warnings ARM64-COW-BUG' | sudo tee -a raspbian_root/etc/redis/redis.conf
|
||||||
|
# sudo mkdir -p raspbian_root/etc/systemd/system/redis-server.service.d
|
||||||
|
# echo '[Service]' | sudo tee raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf
|
||||||
|
# echo 'PrivateUsers=false' | sudo tee -a raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf
|
||||||
|
# - name: Test and activate image
|
||||||
|
# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }}
|
||||||
|
# id: test
|
||||||
|
# run: |
|
||||||
|
#
|
||||||
|
# log_err() {
|
||||||
|
# rc="${1?}"
|
||||||
|
# msg="${2?}"
|
||||||
|
# echo -e "${LOG_DIAG} $msg" >&2
|
||||||
|
# return $rc
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# sudo systemd-nspawn --boot -D ./raspbian_root/ -M ncp --hostname=nextcloudpi |& awk "{ print \"${LOG_GUEST} \" \$0 }" &
|
||||||
|
# sleep 60
|
||||||
|
#
|
||||||
|
# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait)
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..30}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Wait until container network is available (attempt $attempt/30) =="
|
||||||
|
# ip="$("${CONTAINER_CMD[@]}" bash -c '. /usr/local/etc/library.sh > /dev/null; get_ip')"
|
||||||
|
# [[ -n "$ip" ]] && curl -k "https://$ip/activate/" > /dev/null || { sleep 6; continue; }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# sudo cat ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }"
|
||||||
|
# sudo tail -n 0 -f ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" &
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Could not reach container. Aborting..."
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# attempt=0
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..150}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} Waiting for container startup (attempt $attempt/150)..."
|
||||||
|
# "${CONTAINER_CMD[@]}" journalctl -eu redis.service || true
|
||||||
|
# "${CONTAINER_CMD[@]}" systemctl status php8.1-fpm.service || true
|
||||||
|
# redis_pw="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"password'")" \
|
||||||
|
# && redis_socket="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"host'")" \
|
||||||
|
# || log_err $? "Error retrieving redis credentials" || true
|
||||||
|
# if { "${CONTAINER_CMD[@]}" -q ncc status |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "ncc status check failed"; } \
|
||||||
|
# && { [[ "$("${CONTAINER_CMD[@]}" ncc maintenance:mode)" =~ .*disabled.* ]] || log_err $? "Maintenance mode is enabled or could not be retrieved"; } \
|
||||||
|
# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" set redisready yes |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to set redis variable"; } \
|
||||||
|
# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" get redisready |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to read redis variable"; }
|
||||||
|
# then
|
||||||
|
# echo -e "${LOG_CICD} Startup successful"
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# fi
|
||||||
|
# attempt=$((attempt + 1))
|
||||||
|
# sleep 5
|
||||||
|
# done
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Timeout reached."
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status redis |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status 'php*-fpm' |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status apache2 |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# set -x
|
||||||
|
# set +e
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Activation Tests (attempt $attempt/5) =="
|
||||||
|
# python tests/activation_tests.py -t 300 --no-gui "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Activation test failed!"
|
||||||
|
# echo -e "${LOG_DIAG} Geckodriver logs:"
|
||||||
|
# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo "================"
|
||||||
|
# echo -e "${LOG_DIAG} mysql: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Activation test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == System Tests (attempt $attempt/5) =="
|
||||||
|
# sudo python tests/system_tests.py --non-interactive --skip-update-test |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} System test failed!"
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} System test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Nextcloud Tests (attempt $attempt/5) =="
|
||||||
|
# python tests/nextcloud_tests.py --no-gui --skip-release-check "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Nextcloud test failed!"
|
||||||
|
# echo -e "{$LOG_DIAG} Geckodriver logs:"
|
||||||
|
# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo -e "${LOG_CICD} ================"
|
||||||
|
# echo -e "${LOG_DIAG} ncp.log: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo "================"
|
||||||
|
# echo "${LOG_DIAG} Nextcloud log: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Nextcloud test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
# - name: Update NCP
|
||||||
|
# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }}
|
||||||
|
# run: |
|
||||||
|
# set -ex
|
||||||
|
#
|
||||||
|
# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait)
|
||||||
|
#
|
||||||
|
# BRANCH="${VERSION/refs\/heads\//}"
|
||||||
|
# BRANCH="${BRANCH/refs\/tags\//}"
|
||||||
|
# if [[ "$BRANCH" =~ "refs/pull/"* ]]
|
||||||
|
# then
|
||||||
|
# UPDATE_ARGS=("${{ github.head_ref }}" "$VERSION")
|
||||||
|
# else
|
||||||
|
# UPDATE_ARGS=("$BRANCH")
|
||||||
|
# fi
|
||||||
|
# current_nc_version="$("${CONTAINER_CMD[@]}" ncc status | grep "version:" | awk '{ print $3 }')"
|
||||||
|
# latest_nc_version="$(cat etc/ncp.cfg | jq -r '.nextcloud_version')"
|
||||||
|
#
|
||||||
|
# echo "Updating from $PREVIOUS_VERSION to $VERSION"
|
||||||
|
#
|
||||||
|
# "${CONTAINER_CMD[@]}" bash -c "DBG=x ncp-update ${UPDATE_ARGS[*]}"
|
||||||
|
# "${CONTAINER_CMD[@]}" /usr/local/bin/ncc status
|
||||||
|
# # "${CONTAINER_CMD[@]}" bash -c 'curl https://download.nextcloud.com/server/releases/nextcloud-28.0.4.tar.bz2 > /var/www/nextcloud-28.0.4.tar.bz2'
|
||||||
|
# k0nKat1Nation
|
||||||
|
#
|
||||||
|
# # if [[ "$current_nc_version" =~ "$latest_nc_version".* ]]
|
||||||
|
# # then
|
||||||
|
# # echo "Nextcloud is up to date - skipping NC update test."
|
||||||
|
# # else
|
||||||
|
# # "${CONTAINER_CMD[@]}" bash -c "DBG=x ncp-update-nc ${latest_nc_version?}"
|
||||||
|
# # fi
|
||||||
|
#
|
||||||
|
# sudo machinectl terminate ncp
|
||||||
|
# sudo rm -f ./raspbian_root/opt/ncdata/data/nextcloud.log
|
||||||
|
# - name: Test image after update
|
||||||
|
# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }}
|
||||||
|
# run: |
|
||||||
|
#
|
||||||
|
# log_err() {
|
||||||
|
# rc="${1?}"
|
||||||
|
# msg="${2?}"
|
||||||
|
# echo -e "${LOG_DIAG} $msg" >&2
|
||||||
|
# return $rc
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# sudo systemd-nspawn --boot -D ./raspbian_root/ -M ncp --hostname=nextcloudpi |& awk "{ print \"${LOG_GUEST} \" \$0 }" &
|
||||||
|
# sleep 60
|
||||||
|
#
|
||||||
|
# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait)
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..30}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Wait until container network is available (attempt $attempt/30) =="
|
||||||
|
# ip="$("${CONTAINER_CMD[@]}" bash -c '. /usr/local/etc/library.sh > /dev/null; get_ip')"
|
||||||
|
# [[ -n "$ip" ]] && curl -k "https://$ip/activate/" > /dev/null || { sleep 6; continue; }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# sudo cat ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }"
|
||||||
|
# sudo tail -n 0 -f ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" &
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Could not reach container. Aborting..."
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# attempt=0
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..150}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} Waiting for container startup (attempt $attempt/150)..."
|
||||||
|
# "${CONTAINER_CMD[@]}" journalctl -eu redis.service || true
|
||||||
|
# "${CONTAINER_CMD[@]}" systemctl status php8.1-fpm.service || true
|
||||||
|
# redis_pw="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"password'")" \
|
||||||
|
# && redis_socket="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"host'")" \
|
||||||
|
# || log_err $? "Error retrieving redis credentials" || true
|
||||||
|
# if { "${CONTAINER_CMD[@]}" -q ncc status |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "ncc status check failed"; } \
|
||||||
|
# && { [[ "$("${CONTAINER_CMD[@]}" ncc maintenance:mode)" =~ .*disabled.* ]] || log_err $? "Maintenance mode is enabled or could not be retrieved"; } \
|
||||||
|
# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" set redisready yes |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to set redis variable"; } \
|
||||||
|
# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" get redisready |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to read redis variable"; }
|
||||||
|
# then
|
||||||
|
# echo -e "${LOG_CICD} Startup successful"
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# fi
|
||||||
|
# attempt=$((attempt + 1))
|
||||||
|
# sleep 5
|
||||||
|
# done
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Timeout reached."
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status redis |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status 'php*-fpm' |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status apache2 |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# set -x
|
||||||
|
# set +e
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == System Tests (attempt $attempt/5) =="
|
||||||
|
# sudo python tests/system_tests.py --non-interactive --skip-update-test |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} System test failed!"
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} System test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Nextcloud Tests (attempt $attempt/5) =="
|
||||||
|
# python tests/nextcloud_tests.py --no-gui --skip-release-check "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Nextcloud test failed!"
|
||||||
|
# echo -e "{$LOG_DIAG} Geckodriver logs:"
|
||||||
|
# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo -e "${LOG_CICD} ================"
|
||||||
|
# echo -e "${LOG_DIAG} ncp.log: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo "================"
|
||||||
|
# echo "${LOG_DIAG} Nextcloud log: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Nextcloud test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# - name: Run dist-upgrade
|
||||||
|
# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }}
|
||||||
|
# run: |
|
||||||
|
# set -ex
|
||||||
|
#
|
||||||
|
# source ./library.sh
|
||||||
|
#
|
||||||
|
# echo "Updating from $PREVIOUS_VERSION to $VERSION
|
||||||
|
#
|
||||||
|
# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait)
|
||||||
|
#
|
||||||
|
# sudo grep 'VERSION="11"' ./raspbian_root/etc/os-release || {
|
||||||
|
# echo "Can't dist-upgrade from debian version $(sudo grep 'Version=' ./raspbian_root/etc/os-release)"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
# "${CONTAINER_CMD[@]}" DBG=x ncp-dist-upgrade "$VERSION"
|
||||||
|
#
|
||||||
|
# sudo machinectl terminate ncp
|
||||||
|
# sudo rm -f ./raspbian_root/opt/ncdata/data/nextcloud.log
|
||||||
|
#
|
||||||
|
# - name: Test image after dist-upgrade
|
||||||
|
# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }}
|
||||||
|
# run: |
|
||||||
|
#
|
||||||
|
# log_err() {
|
||||||
|
# rc="${1?}"
|
||||||
|
# msg="${2?}"
|
||||||
|
# echo -e "${LOG_DIAG} $msg" >&2
|
||||||
|
# return $rc
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# sudo systemd-nspawn --boot -D ./raspbian_root/ -M ncp --hostname=nextcloudpi |& awk "{ print \"${LOG_GUEST} \" \$0 }" &
|
||||||
|
# sleep 60
|
||||||
|
#
|
||||||
|
# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait)
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..30}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Wait until container network is available (attempt $attempt/30) =="
|
||||||
|
# ip="$("${CONTAINER_CMD[@]}" bash -c '. /usr/local/etc/library.sh > /dev/null; get_ip')"
|
||||||
|
# [[ -n "$ip" ]] && curl -k "https://$ip/activate/" > /dev/null || { sleep 6; continue; }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# sudo cat ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }"
|
||||||
|
# sudo tail -n 0 -f ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" &
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Could not reach container. Aborting..."
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# attempt=0
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..150}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} Waiting for container startup (attempt $attempt/150)..."
|
||||||
|
# "${CONTAINER_CMD[@]}" journalctl -eu redis.service || true
|
||||||
|
# "${CONTAINER_CMD[@]}" systemctl status php8.1-fpm.service || true
|
||||||
|
# redis_pw="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"password'")" \
|
||||||
|
# && redis_socket="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"host'")" \
|
||||||
|
# || log_err $? "Error retrieving redis credentials" || true
|
||||||
|
# if { "${CONTAINER_CMD[@]}" -q ncc status |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "ncc status check failed"; } \
|
||||||
|
# && { [[ "$("${CONTAINER_CMD[@]}" ncc maintenance:mode)" =~ .*disabled.* ]] || log_err $? "Maintenance mode is enabled or could not be retrieved"; } \
|
||||||
|
# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" set redisready yes |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to set redis variable"; } \
|
||||||
|
# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" get redisready |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to read redis variable"; }
|
||||||
|
# then
|
||||||
|
# echo -e "${LOG_CICD} Startup successful"
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# fi
|
||||||
|
# attempt=$((attempt + 1))
|
||||||
|
# sleep 5
|
||||||
|
# done
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Timeout reached."
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status redis |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status 'php*-fpm' |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status apache2 |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# set -x
|
||||||
|
# set +e
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Activation Tests (attempt $attempt/5) =="
|
||||||
|
# python tests/activation_tests.py -t 300 --no-gui "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Activation test failed!"
|
||||||
|
# echo -e "${LOG_DIAG} Geckodriver logs:"
|
||||||
|
# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo "================"
|
||||||
|
# echo -e "${LOG_DIAG} mysql: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Activation test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == System Tests (attempt $attempt/5) =="
|
||||||
|
# sudo python tests/system_tests.py --non-interactive |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} System test failed!"
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} System test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# success=false
|
||||||
|
# for attempt in {1..5}
|
||||||
|
# do
|
||||||
|
# echo -e "${LOG_CICD} == Nextcloud Tests (attempt $attempt/5) =="
|
||||||
|
# python tests/nextcloud_tests.py --no-gui "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }"
|
||||||
|
# [[ ${PIPESTATUS[0]} -eq 0 ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Nextcloud test failed!"
|
||||||
|
# echo -e "{$LOG_DIAG} Geckodriver logs:"
|
||||||
|
# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo -e "${LOG_CICD} ================"
|
||||||
|
# echo -e "${LOG_DIAG} ncp.log: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# echo "================"
|
||||||
|
# echo "${LOG_DIAG} Nextcloud log: "
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true
|
||||||
|
# sleep 12
|
||||||
|
# continue
|
||||||
|
# }
|
||||||
|
# success=true
|
||||||
|
# break
|
||||||
|
# done
|
||||||
|
#
|
||||||
|
# [[ "$success" == "true" ]] || {
|
||||||
|
# echo -e "${LOG_CICD} Nextcloud test failed in all attempts!"
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
|||||||
35
.github/workflows/release.yml
vendored
35
.github/workflows/release.yml
vendored
@ -89,13 +89,22 @@ jobs:
|
|||||||
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
raspberrypi:
|
raspberrypi-4:
|
||||||
if: ${{ inputs.sd-images || ( github.event_name != 'workflow_dispatch' && !startsWith(github.ref_name, 'docker-') ) }}
|
if: ${{ inputs.sd-images || ( github.event_name != 'workflow_dispatch' && !startsWith(github.ref_name, 'docker-') ) }}
|
||||||
uses: ./.github/workflows/build-sd-images.yml
|
uses: ./.github/workflows/build-sd-images.yml
|
||||||
with:
|
with:
|
||||||
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
board_id: raspberrypi
|
board_id: rpi4b
|
||||||
board_name: RaspberryPi
|
board_name: RaspberryPi4
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
raspberrypi-5:
|
||||||
|
if: ${{ inputs.sd-images || ( github.event_name != 'workflow_dispatch' && !startsWith(github.ref_name, 'docker-') ) }}
|
||||||
|
uses: ./.github/workflows/build-sd-images.yml
|
||||||
|
with:
|
||||||
|
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
|
board_id: rpi5b
|
||||||
|
board_name: RaspberryPi5
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
# TODO: Fix 32bit armbian images
|
# TODO: Fix 32bit armbian images
|
||||||
@ -207,19 +216,31 @@ jobs:
|
|||||||
artifact_file: "${{ needs.lxd-arm64.outputs.lxc_artifact_file }}"
|
artifact_file: "${{ needs.lxd-arm64.outputs.lxc_artifact_file }}"
|
||||||
dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }}
|
dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }}
|
||||||
|
|
||||||
raspberrypi-release:
|
raspberrypi-4-release:
|
||||||
needs:
|
needs:
|
||||||
- raspberrypi
|
- raspberrypi-4
|
||||||
- github-release
|
- github-release
|
||||||
if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
|
if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
|
||||||
uses: ./.github/workflows/publish-image.yml
|
uses: ./.github/workflows/publish-image.yml
|
||||||
with:
|
with:
|
||||||
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
artifact_id: "${{ needs.raspberrypi.outputs.artifact_name }}"
|
artifact_id: "${{ needs.raspberrypi-4.outputs.artifact_name }}"
|
||||||
artifact_file: "${{ needs.raspberrypi.outputs.artifact_file }}"
|
artifact_file: "${{ needs.raspberrypi-4.outputs.artifact_file }}"
|
||||||
dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }}
|
dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
raspberrypi-5-release:
|
||||||
|
needs:
|
||||||
|
- raspberrypi-5
|
||||||
|
- github-release
|
||||||
|
if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
|
||||||
|
uses: ./.github/workflows/publish-image.yml
|
||||||
|
with:
|
||||||
|
git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
|
artifact_id: "${{ needs.raspberrypi-5.outputs.artifact_name }}"
|
||||||
|
artifact_file: "${{ needs.raspberrypi-5.outputs.artifact_file }}"
|
||||||
|
dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }}
|
||||||
|
secrets: inherit
|
||||||
odroidxu4-release:
|
odroidxu4-release:
|
||||||
needs:
|
needs:
|
||||||
- odroidxu4
|
- odroidxu4
|
||||||
|
|||||||
517
.github/workflows/vm-tests.yml
vendored
517
.github/workflows/vm-tests.yml
vendored
@ -18,53 +18,124 @@ on:
|
|||||||
- master
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
setup-installation-test-instance:
|
installation-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: thecalcaholic/ncp-test-automation:bookworm
|
||||||
|
env:
|
||||||
|
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
||||||
|
UID: "${{ github.run_id }}-install"
|
||||||
outputs:
|
outputs:
|
||||||
server_address: ${{ steps.create-test-instance.outputs.server_address }}
|
server_address: ${{ steps.create-test-instance.outputs.server_address }}
|
||||||
snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }}
|
snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }}
|
||||||
test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }}
|
test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }}
|
||||||
version: ${{ env.VERSION }}
|
version: ${{ env.VERSION }}
|
||||||
|
test_result: ${{ steps.final_test.outputs.test_result }}
|
||||||
|
ssh_artifact_name: ${{ env.SSH_ARTIFACT_NAME }}
|
||||||
env:
|
env:
|
||||||
VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
|
HOME: /root
|
||||||
|
SSH_ARTIFACT_NAME: "${{ github.run_id }}-install-ssh"
|
||||||
|
UID: "${{ github.run_id }}-install"
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- run: |
|
with:
|
||||||
|
path: /home/runner/actions-runner/_work/nextcloudpi/nextcloudpi
|
||||||
|
- name: Generate ssh keypair
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi
|
||||||
|
run: |
|
||||||
set -e
|
set -e
|
||||||
mkdir -p ./.ssh
|
mkdir -p .ssh
|
||||||
ssh-keygen -t ed25519 -f ".ssh/automation_ssh_key"
|
ssh-keygen -t ed25519 -f ".ssh/automation_ssh_key"
|
||||||
|
. /ncp-test-automation/bin/entrypoint.sh
|
||||||
- name: upload ssh private key to artifact store
|
- name: upload ssh private key to artifact store
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: ${{ github.run_id }}-install-ssh-privkey
|
name: "${{ env.SSH_ARTIFACT_NAME }}"
|
||||||
path: .ssh
|
path: /__w/nextcloudpi/nextcloudpi/.ssh
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
- id: create-test-instance
|
- id: create-test-instance
|
||||||
uses: ./.github/actions/create-test-instance
|
uses: ./.github/actions/create-test-instance
|
||||||
with:
|
with:
|
||||||
version: ${{ env.VERSION }}
|
version: ${{ env.VERSION }}
|
||||||
uid: "${{ github.run_id }}-install"
|
uid: "${{ env.UID }}"
|
||||||
hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}
|
hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}
|
||||||
server_type: "cx11"
|
server_type: "cx11"
|
||||||
|
- name: set instance variables
|
||||||
|
run: |
|
||||||
|
echo "SERVER_ADDRESS=${{ steps.create-test-instance.outputs.server_address }}" >> "$GITHUB_ENV"
|
||||||
|
echo "SNAPSHOT_ID=${{ steps.create-test-instance.outputs.snapshot_id }}" >> "$GITHUB_ENV"
|
||||||
|
- name: Test postinstall VM
|
||||||
|
id: final_test
|
||||||
|
working-directory: /ncp-test-automation/bin
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
echo "Setup ssh"
|
||||||
|
chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
eval "$(ssh-agent)"
|
||||||
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
|
source ./library.sh
|
||||||
|
|
||||||
|
trap '[ $? -eq 0 ] || echo "test_result=failure" >> "$GITHUB_OUTPUT"; terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
||||||
|
|
||||||
|
setup-ssh-port-forwarding "$SERVER_ADDRESS"
|
||||||
|
|
||||||
|
echo "Run integration tests"
|
||||||
|
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg
|
||||||
|
set -x
|
||||||
|
test-ncp-instance -a -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
||||||
|
|
||||||
|
echo "Integration tests failed"
|
||||||
|
echo "Here are the last lines of ncp-install.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log;
|
||||||
|
echo "==========================================="
|
||||||
|
echo "and ncp.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log;
|
||||||
|
echo "==========================================="
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
echo "test_result=success" >> "$GITHUB_OUTPUT";
|
||||||
|
|
||||||
setup-update-test-instance:
|
update-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: thecalcaholic/ncp-test-automation:bullseye
|
||||||
|
env:
|
||||||
|
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
||||||
|
UID: "${{ github.run_id }}-update"
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
outputs:
|
outputs:
|
||||||
server_address: ${{ steps.create-test-instance.outputs.server_address }}
|
server_address: ${{ steps.create-test-instance.outputs.server_address }}
|
||||||
snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }}
|
snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }}
|
||||||
test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }}
|
test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }}
|
||||||
previous_version: ${{ steps.find-version.outputs.previous_version }}
|
previous_version: ${{ steps.find-version.outputs.previous_version }}
|
||||||
version: ${{ env.VERSION }}
|
version: ${{ env.VERSION }}
|
||||||
|
test_result: ${{ steps.final_test.outputs.test_result }}
|
||||||
|
ssh_artifact_name: ${{ env.SSH_ARTIFACT_NAME }}
|
||||||
env:
|
env:
|
||||||
VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
|
HOME: /root
|
||||||
|
SSH_ARTIFACT_NAME: "${{ github.run_id }}-update-ssh"
|
||||||
|
UID: "${{ github.run_id }}-update"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
path: /__w/nextcloudpi/nextcloudpi
|
||||||
- name: find reference version
|
- name: find reference version
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi
|
||||||
shell: bash
|
shell: bash
|
||||||
id: find-version
|
id: find-version
|
||||||
run: |
|
run: |
|
||||||
|
chown -R "$(id -u):$(id -g)" .
|
||||||
set -e
|
set -e
|
||||||
if [[ -n "${{ github.base_ref }}" ]]
|
if [[ -n "${{ github.base_ref }}" ]]
|
||||||
then
|
then
|
||||||
@ -82,121 +153,44 @@ jobs:
|
|||||||
version="${version%-*-*}"
|
version="${version%-*-*}"
|
||||||
fi
|
fi
|
||||||
echo "Previous version is '$version'"
|
echo "Previous version is '$version'"
|
||||||
echo "previous_version=${version}" >> $GITHUB_OUTPUT
|
echo "PREVIOUS_VERSION=${version}" >> "$GITHUB_ENV"
|
||||||
- name: Generate ssh key
|
- name: Generate ssh key
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
mkdir -p ./.ssh
|
mkdir -p /__w/nextcloudpi/nextcloudpi/.ssh
|
||||||
ssh-keygen -t ed25519 -f ".ssh/automation_ssh_key"
|
ssh-keygen -t ed25519 -f "/__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key"
|
||||||
|
. /ncp-test-automation/bin/entrypoint.sh
|
||||||
- name: upload ssh private key to artifact store
|
- name: upload ssh private key to artifact store
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: ${{ github.run_id }}-update-ssh-privkey
|
name: "${{ env.SSH_ARTIFACT_NAME }}"
|
||||||
path: .ssh
|
path: /__w/nextcloudpi/nextcloudpi/.ssh
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
- id: create-test-instance
|
- id: create-test-instance
|
||||||
uses: ./.github/actions/create-test-instance
|
uses: ./.github/actions/create-test-instance
|
||||||
with:
|
with:
|
||||||
version: "${{ steps.find-version.outputs.previous_version }}"
|
version: "${{ env.PREVIOUS_VERSION }}"
|
||||||
uid: "${{ github.run_id }}-update"
|
uid: "${{ env.UID }}"
|
||||||
hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}
|
hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}
|
||||||
server_type: "cx11"
|
server_type: "cx11"
|
||||||
|
- name: Set instance variables
|
||||||
run-installation-test:
|
|
||||||
needs:
|
|
||||||
- setup-installation-test-instance
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
container:
|
|
||||||
image: thecalcaholic/ncp-test-automation:latest
|
|
||||||
env:
|
|
||||||
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
|
||||||
UID: "${{ github.run_id }}-install"
|
|
||||||
env:
|
|
||||||
VERSION: ${{ needs.setup-installation-test-instance.outputs.version }}
|
|
||||||
SERVER_ADDRESS: "${{ needs.setup-installation-test-instance.outputs.server_address }}"
|
|
||||||
SNAPSHOT_ID: "${{ needs.setup-installation-test-instance.outputs.snapshot_id }}"
|
|
||||||
HOME: /root
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
repository: 'theCalcaholic/ncp-test-automation'
|
|
||||||
- name: download ssh private key from artifact store
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ github.run_id }}-install-ssh-privkey
|
|
||||||
path: .ssh
|
|
||||||
- name: Test postinstall VM
|
|
||||||
run: |
|
run: |
|
||||||
set -e
|
echo "SERVER_ADDRESS=${{ steps.create-test-instance.outputs.server_address }}" >> "$GITHUB_ENV"
|
||||||
echo "Setup ssh"
|
echo "SNAPSHOT_ID=${{ steps.create-test-instance.outputs.snapshot_id }}" >> "$GITHUB_ENV"
|
||||||
chmod 0600 ./.ssh/automation_ssh_key
|
|
||||||
eval "$(ssh-agent)"
|
|
||||||
ssh-add ./.ssh/automation_ssh_key
|
|
||||||
|
|
||||||
cd bin
|
|
||||||
source ./library.sh
|
|
||||||
|
|
||||||
trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
|
||||||
|
|
||||||
setup-ssh-port-forwarding "$SERVER_ADDRESS"
|
|
||||||
|
|
||||||
echo "Run integration tests"
|
|
||||||
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg
|
|
||||||
test-ncp-instance -a -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
|
||||||
|
|
||||||
echo "Integration tests failed"
|
|
||||||
echo "Here are the last lines of ncp-install.log:"
|
|
||||||
echo "==========================================="
|
|
||||||
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log;
|
|
||||||
echo "==========================================="
|
|
||||||
echo "and ncp.log:"
|
|
||||||
echo "==========================================="
|
|
||||||
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log;
|
|
||||||
echo "==========================================="
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
run-update-test:
|
|
||||||
needs:
|
|
||||||
- setup-update-test-instance
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
container:
|
|
||||||
image: thecalcaholic/ncp-test-automation:latest
|
|
||||||
env:
|
|
||||||
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
|
||||||
UID: "${{ github.run_id }}-update"
|
|
||||||
env:
|
|
||||||
PREVIOUS_VERSION: ${{ needs.setup-update-test-instance.outputs.previous_version }}
|
|
||||||
VERSION: ${{ needs.setup-update-test-instance.outputs.version }}
|
|
||||||
SERVER_ADDRESS: "${{ needs.setup-update-test-instance.outputs.server_address }}"
|
|
||||||
SNAPSHOT_ID: "${{ needs.setup-update-test-instance.outputs.snapshot_id }}"
|
|
||||||
HOME: /root
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
repository: 'theCalcaholic/ncp-test-automation'
|
repository: 'theCalcaholic/ncp-test-automation'
|
||||||
- name: download ssh private key from artifact store
|
ref: "bullseye"
|
||||||
uses: actions/download-artifact@v3
|
path: /__w/nextcloudpi/nextcloudpi/ncp-test-automation
|
||||||
with:
|
|
||||||
name: ${{ github.run_id }}-update-ssh-privkey
|
|
||||||
path: .ssh
|
|
||||||
- name: Activate and Test postinstall VM
|
- name: Activate and Test postinstall VM
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
echo "Setup ssh"
|
echo "Setup ssh"
|
||||||
chmod 0600 ./.ssh/automation_ssh_key
|
chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
eval "$(ssh-agent)"
|
eval "$(ssh-agent)"
|
||||||
ssh-add ./.ssh/automation_ssh_key
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
cd bin
|
|
||||||
source ./library.sh
|
source ./library.sh
|
||||||
|
|
||||||
trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
||||||
@ -205,7 +199,7 @@ jobs:
|
|||||||
|
|
||||||
echo "Run integration tests"
|
echo "Run integration tests"
|
||||||
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg
|
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg
|
||||||
test-ncp-instance -a -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
test-ncp-instance -a -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" --nc-test-args "--skip-release-check" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
||||||
|
|
||||||
echo "Integration tests failed"
|
echo "Integration tests failed"
|
||||||
echo "Here are the last lines of ncp-install.log:"
|
echo "Here are the last lines of ncp-install.log:"
|
||||||
@ -219,36 +213,177 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
- name: perform update
|
- name: perform update
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
echo "Setup ssh"
|
echo "Setup ssh"
|
||||||
chmod 0600 ./.ssh/automation_ssh_key
|
chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
eval "$(ssh-agent)"
|
eval "$(ssh-agent)"
|
||||||
ssh-add ./.ssh/automation_ssh_key
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
. ./bin/library.sh
|
source ./library.sh
|
||||||
|
|
||||||
echo "Updating from $PREVIOUS_VERSION to $VERSION"
|
echo "Updating from $PREVIOUS_VERSION to $VERSION"
|
||||||
ssh-keygen -f "$HOME/.ssh/known_hosts" -R "${SERVER_ADDRESS}" 2> /dev/null || true
|
ssh-keygen -f "$HOME/.ssh/known_hosts" -R "${SERVER_ADDRESS}" 2> /dev/null || true
|
||||||
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncp-update '$VERSION'"
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncp-update '$VERSION'"
|
||||||
- name: Run integration tests
|
- name: Run integration tests after update
|
||||||
|
id: final_test
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
echo "Setup ssh"
|
echo "Setup ssh"
|
||||||
eval "$(ssh-agent)"
|
eval "$(ssh-agent)"
|
||||||
ssh-add ./.ssh/automation_ssh_key
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
|
source ./library.sh
|
||||||
|
|
||||||
|
trap '[ $? -eq 0 ] || echo "test_result=failure" >> "$GITHUB_OUTPUT"; terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
||||||
|
|
||||||
|
echo "Run integration tests"
|
||||||
|
setup-ssh-port-forwarding "$SERVER_ADDRESS"
|
||||||
|
NC_TEST_ARGS=()
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep VERSION_ID=12 || NC_TEST_ARGS+=("--skip-release-check")
|
||||||
|
set -x
|
||||||
|
test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --nc-test-args "$NC_TEST_ARGS" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
||||||
|
|
||||||
|
echo "Integration tests failed"
|
||||||
|
echo "Here are the last lines of ncp-install.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log;
|
||||||
|
echo "==========================================="
|
||||||
|
echo "and ncp.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log;
|
||||||
|
echo "==========================================="
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "test_result=success" >> "$GITHUB_OUTPUT";
|
||||||
|
|
||||||
|
dist-upgrade-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: thecalcaholic/ncp-test-automation:bullseye
|
||||||
|
env:
|
||||||
|
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
||||||
|
UID: "${{ github.run_id }}-distupgrade"
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
outputs:
|
||||||
|
test_result: ${{ steps.final_test.outputs.test_result }}
|
||||||
|
ssh_artifact_name: ${{ env.SSH_ARTIFACT_NAME }}
|
||||||
|
server_address: ${{ steps.create-test-instance.outputs.server_address }}
|
||||||
|
snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }}
|
||||||
|
test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }}
|
||||||
|
previous_version: ${{ env.PREVIOUS_VERSION }}
|
||||||
|
version: ${{ env.VERSION }}
|
||||||
|
env:
|
||||||
|
PREVIOUS_VERSION: "v1.53.3"
|
||||||
|
VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
|
||||||
|
HOME: /root
|
||||||
|
SSH_ARTIFACT_NAME: "${{ github.run_id }}-distupgrade-ssh"
|
||||||
|
UID: "${{ github.run_id }}-distupgrade"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
path: /__w/nextcloudpi/nextcloudpi
|
||||||
|
- name: Generate ssh key
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
chown -R "$(id -u):$(id -g)" /__w/nextcloudpi/nextcloudpi
|
||||||
|
mkdir -p /__w/nextcloudpi/nextcloudpi/.ssh
|
||||||
|
ssh-keygen -t ed25519 -f "/__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key"
|
||||||
|
. /ncp-test-automation/bin/entrypoint.sh
|
||||||
|
- name: upload ssh private key to artifact store
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: "${{ env.SSH_ARTIFACT_NAME }}"
|
||||||
|
path: /__w/nextcloudpi/nextcloudpi/.ssh
|
||||||
|
if-no-files-found: error
|
||||||
|
- id: create-test-instance
|
||||||
|
uses: ./.github/actions/create-test-instance-bullseye
|
||||||
|
with:
|
||||||
|
version: "${{ env.PREVIOUS_VERSION }}"
|
||||||
|
uid: "${{ env.UID }}"
|
||||||
|
hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}
|
||||||
|
server_type: "cx11"
|
||||||
|
- name: Set instance variables
|
||||||
|
run: |
|
||||||
|
echo "SERVER_ADDRESS=${{ steps.create-test-instance.outputs.server_address }}" >> "$GITHUB_ENV"
|
||||||
|
echo "SNAPSHOT_ID=${{ steps.create-test-instance.outputs.snapshot_id }}" >> "$GITHUB_ENV"
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: 'theCalcaholic/ncp-test-automation'
|
||||||
|
ref: "bullseye"
|
||||||
|
path: /__w/nextcloudpi/nextcloudpi/ncp-test-automation
|
||||||
|
- name: Activate and Test postinstall VM
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
echo "Setup ssh"
|
||||||
|
chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
eval "$(ssh-agent)"
|
||||||
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
|
source ./library.sh
|
||||||
|
|
||||||
|
trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
||||||
|
|
||||||
|
setup-ssh-port-forwarding "$SERVER_ADDRESS"
|
||||||
|
|
||||||
|
echo "Run integration tests"
|
||||||
|
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg
|
||||||
|
test-ncp-instance -a -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" --nc-test-args "--skip-release-check" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
||||||
|
|
||||||
|
echo "Integration tests failed"
|
||||||
|
echo "Here are the last lines of ncp-install.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log;
|
||||||
|
echo "==========================================="
|
||||||
|
echo "and ncp.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log;
|
||||||
|
echo "==========================================="
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
- name: perform update
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Setup ssh"
|
||||||
|
chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
eval "$(ssh-agent)"
|
||||||
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
|
source ./library.sh
|
||||||
|
|
||||||
|
echo "Updating from $PREVIOUS_VERSION to $VERSION"
|
||||||
|
ssh-keygen -f "$HOME/.ssh/known_hosts" -R "${SERVER_ADDRESS}" 2> /dev/null || true
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncp-update '$VERSION'"
|
||||||
|
- name: Run integration tests after update
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Setup ssh"
|
||||||
|
eval "$(ssh-agent)"
|
||||||
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
cd bin
|
|
||||||
source ./library.sh
|
source ./library.sh
|
||||||
|
|
||||||
trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
||||||
|
|
||||||
echo "Run integration tests"
|
echo "Run integration tests"
|
||||||
setup-ssh-port-forwarding "$SERVER_ADDRESS"
|
setup-ssh-port-forwarding "$SERVER_ADDRESS"
|
||||||
|
NC_TEST_ARGS=()
|
||||||
test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep VERSION_ID=12 || NC_TEST_ARGS+=("--skip-release-check")
|
||||||
|
set -x
|
||||||
|
test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --nc-test-args "$NC_TEST_ARGS" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
||||||
|
|
||||||
echo "Integration tests failed"
|
echo "Integration tests failed"
|
||||||
echo "Here are the last lines of ncp-install.log:"
|
echo "Here are the last lines of ncp-install.log:"
|
||||||
@ -262,11 +397,64 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- name: NCP distupgrade
|
||||||
|
id: distupgrade
|
||||||
|
working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Setup ssh"
|
||||||
|
eval "$(ssh-agent)"
|
||||||
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
|
source ./library.sh
|
||||||
|
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep 'VERSION_ID="11"' || {
|
||||||
|
echo "Can't upgrade from Debian $(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" grep 'VERSION_ID=' /etc/os-release)"
|
||||||
|
echo "skipped=yes" | tee -a $GITHUB_OUTPUT
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" DEBIAN_FRONTEND=noninteractive ncp-dist-upgrade
|
||||||
|
echo "skipped=no" | tee -a $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Run integration tests after dist-upgrade
|
||||||
|
id: final_test
|
||||||
|
working-directory: /ncp-test-automation/bin
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Setup ssh"
|
||||||
|
eval "$(ssh-agent)"
|
||||||
|
ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key
|
||||||
|
|
||||||
|
source ./library.sh
|
||||||
|
|
||||||
|
trap '[ $? -eq 0 ] || echo "test_result=failure" >> "$GITHUB_OUTPUT"; terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2
|
||||||
|
|
||||||
|
echo "Run integration tests"
|
||||||
|
setup-ssh-port-forwarding "$SERVER_ADDRESS"
|
||||||
|
|
||||||
|
test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || {
|
||||||
|
|
||||||
|
echo "Integration tests failed"
|
||||||
|
echo "Here are the last lines of ncp-install.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log;
|
||||||
|
echo "==========================================="
|
||||||
|
echo "ncp.log:"
|
||||||
|
echo "==========================================="
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log;
|
||||||
|
echo "==========================================="
|
||||||
|
echo "nextcloud.log:"
|
||||||
|
ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /opt/ncdata/data/nextcloud.log;
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
echo "test_result=success" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
install-postactivation-snapshot:
|
install-postactivation-snapshot:
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
needs:
|
needs:
|
||||||
- setup-installation-test-instance
|
- installation-test
|
||||||
- run-installation-test
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: thecalcaholic/ncp-test-automation:latest
|
image: thecalcaholic/ncp-test-automation:latest
|
||||||
@ -275,28 +463,28 @@ jobs:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
TEST_TYPE: install
|
TEST_TYPE: install
|
||||||
SERVER_ADDRESS: ${{ needs.setup-installation-test-instance.outputs.server_address }}
|
SERVER_ADDRESS: ${{ needs.installation-test.outputs.server_address }}
|
||||||
TEST_RESULT: ${{ needs.setup-installation-test-instance.result }}
|
TEST_RESULT: ${{ needs.installation-test.test_result }}
|
||||||
TEST_SERVER_ID: ${{ needs.setup-installation-test-instance.outputs.test_server_id }}
|
TEST_SERVER_ID: ${{ needs.installation-test.outputs.test_server_id }}
|
||||||
VERSION: ${{ needs.setup-installation-test-instance.outputs.version }}
|
VERSION: ${{ needs.installation-test.outputs.version }}
|
||||||
|
SSH_ARTIFACT_NAME: "${{ needs.installation-test.outputs.ssh_artifact_name }}"
|
||||||
UID: ${{ github.run_id }}-install
|
UID: ${{ github.run_id }}-install
|
||||||
steps:
|
steps:
|
||||||
- name: download ssh private key from artifact store
|
- name: download ssh private key from artifact store
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
with:
|
with:
|
||||||
name: ${{ github.run_id }}-${{ env.TEST_TYPE }}-ssh-privkey
|
name: ${{ env.SSH_ARTIFACT_NAME }}
|
||||||
path: /github/workspace/.ssh
|
path: /github/workspace/.ssh
|
||||||
- name: Shutdown server
|
- name: Shutdown server
|
||||||
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
run: |
|
run: |
|
||||||
chmod 0600 /github/workspace/.ssh/automation_ssh_key
|
chmod 0600 /github/workspace/.ssh/automation_ssh_key
|
||||||
export SSH_PUBLIC_KEY="$(cat /github/workspace/.ssh/automation_ssh_key.pub)"
|
export SSH_PUBLIC_KEY="$(cat /github/workspace/.ssh/automation_ssh_key.pub)"
|
||||||
bash /ncp-test-automation/bin/entrypoint.sh
|
bash /ncp-test-automation/bin/entrypoint.sh
|
||||||
eval "$(ssh-agent)"
|
eval "$(ssh-agent)"
|
||||||
ssh-add /github/workspace/.ssh/automation_ssh_key
|
ssh-add /github/workspace/.ssh/automation_ssh_key
|
||||||
|
|
||||||
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" <<EOF
|
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" <<EOF
|
||||||
systemctl stop mariadb
|
systemctl stop mariadb
|
||||||
systemctl poweroff
|
systemctl poweroff
|
||||||
@ -304,11 +492,10 @@ jobs:
|
|||||||
- name: Create Snapshot
|
- name: Create Snapshot
|
||||||
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
working-directory: /ncp-test-automation/bin
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
echo "${{ needs.setup-installation-test-instance.outputs.test_server_id }}"
|
|
||||||
echo "${TEST_SERVER_ID?}"
|
echo "${TEST_SERVER_ID?}"
|
||||||
cd /ncp-test-automation/bin
|
|
||||||
|
|
||||||
. ./library.sh
|
. ./library.sh
|
||||||
|
|
||||||
@ -320,8 +507,7 @@ jobs:
|
|||||||
update-postactivation-snapshot:
|
update-postactivation-snapshot:
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
needs:
|
needs:
|
||||||
- setup-update-test-instance
|
- update-test
|
||||||
- run-update-test
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: thecalcaholic/ncp-test-automation:latest
|
image: thecalcaholic/ncp-test-automation:latest
|
||||||
@ -330,26 +516,27 @@ jobs:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
TEST_TYPE: update
|
TEST_TYPE: update
|
||||||
SERVER_ADDRESS: ${{ needs.setup-update-test-instance.outputs.server_address }}
|
SERVER_ADDRESS: ${{ needs.update-test.outputs.server_address }}
|
||||||
TEST_RESULT: ${{ needs.setup-update-test-instance.result }}
|
TEST_RESULT: ${{ needs.update-test.test_result }}
|
||||||
TEST_SERVER_ID: ${{ needs.setup-update-test-instance.outputs.test_server_id }}
|
TEST_SERVER_ID: ${{ needs.update-test.outputs.test_server_id }}
|
||||||
VERSION: ${{ needs.setup-update-test-instance.outputs.version }}
|
VERSION: ${{ needs.update-test.outputs.version }}
|
||||||
UID: ${{ github.run_id }}-update
|
UID: ${{ github.run_id }}-update
|
||||||
|
SSH_ARTIFACT_NAME: "${{ needs.update-test.outputs.ssh_artifact_name }}"
|
||||||
steps:
|
steps:
|
||||||
- name: download ssh private key from artifact store
|
- name: download ssh private key from artifact store
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
with:
|
with:
|
||||||
name: ${{ github.run_id }}-${{ env.TEST_TYPE }}-ssh-privkey
|
name: ${{ env.SSH_ARTIFACT_NAME }}
|
||||||
path: /github/workspace/.ssh
|
path: /github/workspace/.ssh
|
||||||
- name: Shutdown server
|
- name: Shutdown server
|
||||||
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
run: |
|
run: |
|
||||||
chmod 0600 /github/workspace/.ssh/automation_ssh_key
|
chmod 0600 /github/workspace/.ssh/automation_ssh_key
|
||||||
export SSH_PUBLIC_KEY="$(cat /github/workspace/.ssh/automation_ssh_key.pub)"
|
export SSH_PUBLIC_KEY="$(cat /github/workspace/.ssh/automation_ssh_key.pub)"
|
||||||
bash /ncp-test-automation/bin/entrypoint.sh
|
bash /ncp-test-automation/bin/entrypoint.sh
|
||||||
eval "$(ssh-agent)"
|
eval "$(ssh-agent)"
|
||||||
ssh-add /github/workspace/.ssh/automation_ssh_key
|
ssh-add /github/workspace/.ssh/automation_ssh_key
|
||||||
|
|
||||||
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" <<EOF
|
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" <<EOF
|
||||||
systemctl stop mariadb
|
systemctl stop mariadb
|
||||||
@ -358,11 +545,11 @@ jobs:
|
|||||||
- name: Create Snapshot
|
- name: Create Snapshot
|
||||||
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
working-directory: /ncp-test-automation/bin
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
echo "${{ needs.setup-update-test-instance.outputs.test_server_id }}"
|
echo "${{ needs.update-test.outputs.test_server_id }}"
|
||||||
echo "${TEST_SERVER_ID?}"
|
echo "${TEST_SERVER_ID?}"
|
||||||
cd /ncp-test-automation/bin
|
|
||||||
|
|
||||||
. ./library.sh
|
. ./library.sh
|
||||||
|
|
||||||
@ -371,11 +558,66 @@ jobs:
|
|||||||
snapshot_id="$(tf-output "$TF_SNAPSHOT" -state="${TF_SNAPSHOT}/${VERSION//\//.}.postactivation.tfstate" snapshot_id)"
|
snapshot_id="$(tf-output "$TF_SNAPSHOT" -state="${TF_SNAPSHOT}/${VERSION//\//.}.postactivation.tfstate" snapshot_id)"
|
||||||
hcloud image add-label -o "$snapshot_id" "test-result=${TEST_RESULT?}"
|
hcloud image add-label -o "$snapshot_id" "test-result=${TEST_RESULT?}"
|
||||||
|
|
||||||
|
dist-upgrade-postactivation-snapshot:
|
||||||
|
if: ${{ always() }}
|
||||||
|
needs:
|
||||||
|
- dist-upgrade-test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: thecalcaholic/ncp-test-automation:latest
|
||||||
|
env:
|
||||||
|
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
||||||
|
|
||||||
|
env:
|
||||||
|
TEST_TYPE: distupgrade
|
||||||
|
SERVER_ADDRESS: ${{ needs.dist-upgrade-test.outputs.server_address }}
|
||||||
|
TEST_RESULT: ${{ needs.dist-upgrade-test.outputs.test_result }}
|
||||||
|
TEST_SERVER_ID: ${{ needs.dist-upgrade-test.outputs.test_server_id }}
|
||||||
|
VERSION: ${{ needs.dist-upgrade-test.outputs.version }}
|
||||||
|
UID: ${{ github.run_id }}-distupgrade
|
||||||
|
SSH_ARTIFACT_NAME: "${{ needs.dist-upgrade-test.outputs.ssh_artifact_name }}"
|
||||||
|
steps:
|
||||||
|
- name: download ssh private key from artifact store
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
|
with:
|
||||||
|
name: ${{ env.SSH_ARTIFACT_NAME }}
|
||||||
|
path: /github/workspace/.ssh
|
||||||
|
- name: Shutdown server
|
||||||
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
|
run: |
|
||||||
|
chmod 0600 /github/workspace/.ssh/automation_ssh_key
|
||||||
|
export SSH_PUBLIC_KEY="$(cat /github/workspace/.ssh/automation_ssh_key.pub)"
|
||||||
|
bash /ncp-test-automation/bin/entrypoint.sh
|
||||||
|
eval "$(ssh-agent)"
|
||||||
|
ssh-add /github/workspace/.ssh/automation_ssh_key
|
||||||
|
|
||||||
|
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" <<EOF
|
||||||
|
systemctl stop mariadb
|
||||||
|
systemctl poweroff
|
||||||
|
EOF
|
||||||
|
- name: Create Snapshot
|
||||||
|
if: ${{ contains('success|failure', env.TEST_RESULT) }}
|
||||||
|
shell: bash
|
||||||
|
working-directory: /ncp-test-automation/bin
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
echo "${{ needs.dist-upgrade-test.outputs.test_server_id }}"
|
||||||
|
echo "${TEST_SERVER_ID?}"
|
||||||
|
|
||||||
|
. ./library.sh
|
||||||
|
|
||||||
|
tf-init "$TF_SNAPSHOT"
|
||||||
|
tf-apply "$TF_SNAPSHOT" "$TF_VAR_FILE" -var="branch=${VERSION?}" -var="snapshot_provider_id=${TEST_SERVER_ID?}" -var="snapshot_type=ncp-postactivation" -state="${TF_SNAPSHOT}/${VERSION//\//.}.postactivation.tfstate"
|
||||||
|
snapshot_id="$(tf-output "$TF_SNAPSHOT" -state="${TF_SNAPSHOT}/${VERSION//\//.}.postactivation.tfstate" snapshot_id)"
|
||||||
|
hcloud image add-label -o "$snapshot_id" "test-result=${TEST_RESULT?}"
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
needs:
|
needs:
|
||||||
- install-postactivation-snapshot
|
- install-postactivation-snapshot
|
||||||
- update-postactivation-snapshot
|
- update-postactivation-snapshot
|
||||||
|
- dist-upgrade-postactivation-snapshot
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: thecalcaholic/ncp-test-automation:latest
|
image: thecalcaholic/ncp-test-automation:latest
|
||||||
@ -383,7 +625,7 @@ jobs:
|
|||||||
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
uid: ["${{ github.run_id }}-install", "${{ github.run_id }}-update"]
|
uid: ["${{ github.run_id }}-install", "${{ github.run_id }}-update", "${{ github.run_id }}-distupgrade"]
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
env:
|
env:
|
||||||
HOME: '/root'
|
HOME: '/root'
|
||||||
@ -410,6 +652,7 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- install-postactivation-snapshot
|
- install-postactivation-snapshot
|
||||||
- update-postactivation-snapshot
|
- update-postactivation-snapshot
|
||||||
|
- dist-upgrade-postactivation-snapshot
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: thecalcaholic/ncp-test-automation:latest
|
image: thecalcaholic/ncp-test-automation:latest
|
||||||
@ -420,7 +663,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Delete old snapshots
|
- name: Delete old snapshots
|
||||||
run: |
|
run: |
|
||||||
for snapshot in $(hcloud image list -t snapshot -o noheader -o columns=id | head -n -16)
|
for snapshot in $(hcloud image list -t snapshot -o noheader -o columns=id | head -n -12)
|
||||||
do
|
do
|
||||||
echo "Deleting snapshot '$snapshot'..."
|
echo "Deleting snapshot '$snapshot'..."
|
||||||
hcloud image delete "$snapshot"
|
hcloud image delete "$snapshot"
|
||||||
|
|||||||
@ -1,137 +1,35 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set -eu -o pipefail
|
|
||||||
|
|
||||||
[[ -f /.dockerenv ]] && { echo "Not supported in Docker. Upgrade the container instead"; exit 0; }
|
|
||||||
|
|
||||||
new_cfg=/usr/local/etc/ncp-recommended.cfg
|
|
||||||
[[ -f "${new_cfg}" ]] || { echo "Already on the lastest recommended distribution. Abort." >&2; exit 1; }
|
|
||||||
|
|
||||||
APTINSTALL="apt-get install -y --no-install-recommends"
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
echo "
|
|
||||||
>>> ATTENTION <<<
|
|
||||||
This is a dangerous process that is only guaranteed to work properly if you
|
|
||||||
have not made manual changes in the system. Backup the SD card first and
|
|
||||||
proceed at your own risk.
|
|
||||||
|
|
||||||
Note that this is not a requirement for NCP to continue working properly.
|
|
||||||
The current distribution will keep receiving updates for some time.
|
|
||||||
|
|
||||||
Do you want to continue? [y/N]"
|
|
||||||
|
|
||||||
read key
|
|
||||||
[[ "$key" == y ]] || exit 0
|
|
||||||
|
|
||||||
source /usr/local/etc/library.sh # sets NCPCFG RELEASE PHPVER
|
|
||||||
old_cfg="${NCPCFG}"
|
|
||||||
|
|
||||||
trap "echo 'Something went wrong. Fix it and try again'" EXIT
|
|
||||||
|
|
||||||
save_maintenance_mode
|
|
||||||
|
|
||||||
# Fix grub-pc issue in VM
|
|
||||||
if apt show grub-pc-bin &>/dev/null; then
|
|
||||||
$APTINSTALL grub
|
|
||||||
fi
|
|
||||||
|
|
||||||
apt-get update
|
|
||||||
apt-get upgrade -y
|
|
||||||
|
|
||||||
# remove old PHP version
|
|
||||||
set +e
|
|
||||||
apt-get purge -y php${PHPVER} php${PHPVER}-curl php${PHPVER}-gd php${PHPVER}-fpm php${PHPVER}-cli php${PHPVER}-opcache \
|
|
||||||
php${PHPVER}-mbstring php${PHPVER}-xml php${PHPVER}-zip php${PHPVER}-fileinfo php${PHPVER}-ldap \
|
|
||||||
php${PHPVER}-intl php${PHPVER}-bz2 php${PHPVER}-json
|
|
||||||
apt-get purge -y php${PHPVER}-mysql
|
|
||||||
apt-get purge -y php${PHPVER}-redis
|
|
||||||
apt-get purge -y php${PHPVER}-exif
|
|
||||||
apt-get purge -y php${PHPVER}-bcmath
|
|
||||||
apt-get purge -y php${PHPVER}-gmp
|
|
||||||
apt-get purge -y php${PHPVER}-imagick
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# update sources
|
[[ "$UID" -eq 0 ]] || {
|
||||||
sed -i 's/buster/bullseye/g' /etc/apt/sources.list
|
echo "ERROR: Must be run as root (try sudo ncp-dist-upgrade)"
|
||||||
sed -i 's/buster/bullseye/g' /etc/apt/sources.list.d/* || true
|
exit 1
|
||||||
sed -i 's/bullseye\/updates/bullseye-security/g' /etc/apt/sources.list
|
}
|
||||||
rm -f /etc/apt/sources.list.d/php.list
|
|
||||||
|
|
||||||
# fix DHCP systemd service command https://forums.raspberrypi.com/viewtopic.php?t=320383 in raspbian
|
. /etc/os-release
|
||||||
if [[ -f /usr/bin/raspi-config ]]; then
|
|
||||||
sed -i 's|ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w|ExecStart=/usr/sbin/dhcpcd -q -w|g' /etc/systemd/system/dhcpcd.service.d/wait.conf
|
if [[ "$VERSION_ID" -eq 10 ]]
|
||||||
|
then
|
||||||
|
UPGRADE_CMD=(bash /usr/local/bin/ncp-dist-upgrade.d/debian-10.sh)
|
||||||
|
elif [[ "$VERSION_ID" -eq 11 ]]
|
||||||
|
then
|
||||||
|
UPGRADE_CMD=(bash /usr/local/bin/ncp-dist-upgrade.d/debian-11.sh)
|
||||||
|
else
|
||||||
|
echo "No dist-upgrade available for OS version: Debian ${VERSION}."
|
||||||
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# install latest distro
|
if { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } || [[ "${DEBIAN_FRONTEND:-}" == "noninteractive" ]] || ! [[ -t 0 ]]
|
||||||
apt-get update
|
then
|
||||||
apt-get dist-upgrade -y
|
"${UPGRADE_CMD[@]}"
|
||||||
|
else
|
||||||
|
tmux list-sessions | grep ncp-distupgrade && {
|
||||||
|
echo "Existing distupgrade process detected. Connecting..."
|
||||||
|
sleep 5
|
||||||
|
tmux attach -t ncp-distupgrade
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
tmux new-session -s ncp-distupgrade bash -c "${UPGRADE_CMD[*]}; bash"
|
||||||
|
fi
|
||||||
|
|
||||||
# install latest PHP version
|
|
||||||
release_new=$(jq -r '.release' < "${new_cfg}")
|
|
||||||
# the default repo in bullseye is bullseye-security - use bullseye if it is not available
|
|
||||||
grep -Eh '^deb ' /etc/apt/sources.list | grep 'bullseye-security' > /dev/null && release_new="${release_new}-security"
|
|
||||||
php_ver_new=$(jq -r '.php_version' < "${new_cfg}")
|
|
||||||
# PHP 8.1 is only supported via the
|
|
||||||
[[ "$php_ver_new" != 8.1 ]] || php_ver_new=7.4
|
|
||||||
|
|
||||||
$APTINSTALL -t ${release_new} php${php_ver_new} php${php_ver_new}-curl php${php_ver_new}-gd php${php_ver_new}-fpm php${php_ver_new}-cli php${php_ver_new}-opcache \
|
|
||||||
php${php_ver_new}-mbstring php${php_ver_new}-xml php${php_ver_new}-zip php${php_ver_new}-fileinfo php${php_ver_new}-ldap \
|
|
||||||
php${php_ver_new}-intl php${php_ver_new}-bz2 php${php_ver_new}-json
|
|
||||||
|
|
||||||
$APTINSTALL php${php_ver_new}-mysql
|
|
||||||
$APTINSTALL -t ${release_new} php${php_ver_new}-redis
|
|
||||||
|
|
||||||
$APTINSTALL -t ${release_new} smbclient exfat-fuse exfat-utils
|
|
||||||
sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop
|
|
||||||
$APTINSTALL -t ${release_new} php${php_ver_new}-exif
|
|
||||||
sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop
|
|
||||||
$APTINSTALL -t ${release_new} php${php_ver_new}-bcmath
|
|
||||||
sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop
|
|
||||||
$APTINSTALL -t ${release_new} php${php_ver_new}-gmp
|
|
||||||
#$APTINSTALL -t ${release_new} imagemagick php${php_ver_new}-imagick ghostscript
|
|
||||||
|
|
||||||
# Reinstall prometheus-node-exporter, specifically WITH install-recommends to include collectors on bullseye and later
|
|
||||||
{ dpkg -l | grep '^ii.*prometheus-node-exporter' >/dev/null && apt-get install -y prometheus-node-exporter-collectors; } || true
|
|
||||||
|
|
||||||
apt-get autoremove -y
|
|
||||||
apt-get clean
|
|
||||||
|
|
||||||
cat > /etc/php/${php_ver_new}/fpm/conf.d/90-ncp.ini <<EOF
|
|
||||||
; disable .user.ini files for performance and workaround NC update bugs
|
|
||||||
user_ini.filename =
|
|
||||||
|
|
||||||
; from Nextcloud .user.ini
|
|
||||||
upload_max_filesize=10G
|
|
||||||
post_max_size=10G
|
|
||||||
memory_limit=768M
|
|
||||||
mbstring.func_overload=0
|
|
||||||
always_populate_raw_post_data=-1
|
|
||||||
default_charset='UTF-8'
|
|
||||||
output_buffering=0
|
|
||||||
|
|
||||||
; slow transfers will be killed after this time
|
|
||||||
max_execution_time=3600
|
|
||||||
max_input_time=3600
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# restart services
|
|
||||||
service php${php_ver_new}-fpm restart
|
|
||||||
a2enconf php${php_ver_new}-fpm
|
|
||||||
service apache2 restart
|
|
||||||
|
|
||||||
is_active_app unattended-upgrades && run_app unattended-upgrades || true
|
|
||||||
|
|
||||||
# mark as successful
|
|
||||||
mv "${new_cfg}" "${old_cfg}"
|
|
||||||
install_template "php/opcache.ini.sh" "/etc/php/${php_ver_new}/mods-available/opcache.ini" --defaults
|
|
||||||
clear_opcache
|
|
||||||
|
|
||||||
source /usr/local/etc/library.sh # refresh NCPCFG RELEASE PHPVER
|
|
||||||
run_app nc-limits
|
|
||||||
restore_maintenance_mode
|
|
||||||
|
|
||||||
rm -f /etc/update-motd.d/30ncp-dist-upgrade
|
|
||||||
|
|
||||||
echo "Upgrade to ${release_new} successful"
|
|
||||||
trap '' EXIT
|
|
||||||
|
|||||||
137
bin/ncp-dist-upgrade.d/debian-10.sh
Normal file
137
bin/ncp-dist-upgrade.d/debian-10.sh
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu -o pipefail
|
||||||
|
|
||||||
|
[[ -f /.dockerenv ]] && { echo "Not supported in Docker. Upgrade the container instead"; exit 0; }
|
||||||
|
|
||||||
|
new_cfg=/usr/local/etc/ncp-recommended.cfg
|
||||||
|
[[ -f "${new_cfg}" ]] || { echo "Already on the lastest recommended distribution. Abort." >&2; exit 1; }
|
||||||
|
|
||||||
|
APTINSTALL="apt-get install -y --no-install-recommends"
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
echo "
|
||||||
|
>>> ATTENTION <<<
|
||||||
|
This is a dangerous process that is only guaranteed to work properly if you
|
||||||
|
have not made manual changes in the system. Backup the SD card first and
|
||||||
|
proceed at your own risk.
|
||||||
|
|
||||||
|
Note that this is not a requirement for NCP to continue working properly.
|
||||||
|
The current distribution will keep receiving updates for some time.
|
||||||
|
|
||||||
|
Do you want to continue? [y/N]"
|
||||||
|
|
||||||
|
read key
|
||||||
|
[[ "$key" == y ]] || exit 0
|
||||||
|
|
||||||
|
source /usr/local/etc/library.sh # sets NCPCFG RELEASE PHPVER
|
||||||
|
old_cfg="${NCPCFG}"
|
||||||
|
|
||||||
|
trap "echo 'Something went wrong. Fix it and try again'" EXIT
|
||||||
|
|
||||||
|
save_maintenance_mode
|
||||||
|
|
||||||
|
# Fix grub-pc issue in VM
|
||||||
|
if apt show grub-pc-bin &>/dev/null; then
|
||||||
|
$APTINSTALL grub
|
||||||
|
fi
|
||||||
|
|
||||||
|
apt-get update
|
||||||
|
apt-get upgrade -y
|
||||||
|
|
||||||
|
# remove old PHP version
|
||||||
|
set +e
|
||||||
|
apt-get purge -y php${PHPVER} php${PHPVER}-curl php${PHPVER}-gd php${PHPVER}-fpm php${PHPVER}-cli php${PHPVER}-opcache \
|
||||||
|
php${PHPVER}-mbstring php${PHPVER}-xml php${PHPVER}-zip php${PHPVER}-fileinfo php${PHPVER}-ldap \
|
||||||
|
php${PHPVER}-intl php${PHPVER}-bz2 php${PHPVER}-json
|
||||||
|
apt-get purge -y php${PHPVER}-mysql
|
||||||
|
apt-get purge -y php${PHPVER}-redis
|
||||||
|
apt-get purge -y php${PHPVER}-exif
|
||||||
|
apt-get purge -y php${PHPVER}-bcmath
|
||||||
|
apt-get purge -y php${PHPVER}-gmp
|
||||||
|
apt-get purge -y php${PHPVER}-imagick
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# update sources
|
||||||
|
sed -i 's/buster/bullseye/g' /etc/apt/sources.list
|
||||||
|
sed -i 's/buster/bullseye/g' /etc/apt/sources.list.d/* || true
|
||||||
|
sed -i 's/bullseye\/updates/bullseye-security/g' /etc/apt/sources.list
|
||||||
|
rm -f /etc/apt/sources.list.d/php.list
|
||||||
|
|
||||||
|
# fix DHCP systemd service command https://forums.raspberrypi.com/viewtopic.php?t=320383 in raspbian
|
||||||
|
if [[ -f /usr/bin/raspi-config ]]; then
|
||||||
|
sed -i 's|ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w|ExecStart=/usr/sbin/dhcpcd -q -w|g' /etc/systemd/system/dhcpcd.service.d/wait.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# install latest distro
|
||||||
|
apt-get update
|
||||||
|
apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# install latest PHP version
|
||||||
|
release_new=$(jq -r '.release' < "${new_cfg}")
|
||||||
|
# the default repo in bullseye is bullseye-security - use bullseye if it is not available
|
||||||
|
grep -Eh '^deb ' /etc/apt/sources.list | grep 'bullseye-security' > /dev/null && release_new="${release_new}-security"
|
||||||
|
php_ver_new=$(jq -r '.php_version' < "${new_cfg}")
|
||||||
|
# PHP 8.1 is only supported via the
|
||||||
|
[[ "$php_ver_new" != 8.1 ]] || php_ver_new=7.4
|
||||||
|
|
||||||
|
$APTINSTALL -t ${release_new} php${php_ver_new} php${php_ver_new}-curl php${php_ver_new}-gd php${php_ver_new}-fpm php${php_ver_new}-cli php${php_ver_new}-opcache \
|
||||||
|
php${php_ver_new}-mbstring php${php_ver_new}-xml php${php_ver_new}-zip php${php_ver_new}-fileinfo php${php_ver_new}-ldap \
|
||||||
|
php${php_ver_new}-intl php${php_ver_new}-bz2 php${php_ver_new}-json
|
||||||
|
|
||||||
|
$APTINSTALL php${php_ver_new}-mysql
|
||||||
|
$APTINSTALL -t ${release_new} php${php_ver_new}-redis
|
||||||
|
|
||||||
|
$APTINSTALL -t ${release_new} smbclient exfat-fuse exfat-utils
|
||||||
|
sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop
|
||||||
|
$APTINSTALL -t ${release_new} php${php_ver_new}-exif
|
||||||
|
sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop
|
||||||
|
$APTINSTALL -t ${release_new} php${php_ver_new}-bcmath
|
||||||
|
sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop
|
||||||
|
$APTINSTALL -t ${release_new} php${php_ver_new}-gmp
|
||||||
|
#$APTINSTALL -t ${release_new} imagemagick php${php_ver_new}-imagick ghostscript
|
||||||
|
|
||||||
|
# Reinstall prometheus-node-exporter, specifically WITH install-recommends to include collectors on bullseye and later
|
||||||
|
{ dpkg -l | grep '^ii.*prometheus-node-exporter' >/dev/null && apt-get install -y prometheus-node-exporter-collectors; } || true
|
||||||
|
|
||||||
|
apt-get autoremove -y
|
||||||
|
apt-get clean
|
||||||
|
|
||||||
|
cat > /etc/php/${php_ver_new}/fpm/conf.d/90-ncp.ini <<EOF
|
||||||
|
; disable .user.ini files for performance and workaround NC update bugs
|
||||||
|
user_ini.filename =
|
||||||
|
|
||||||
|
; from Nextcloud .user.ini
|
||||||
|
upload_max_filesize=10G
|
||||||
|
post_max_size=10G
|
||||||
|
memory_limit=768M
|
||||||
|
mbstring.func_overload=0
|
||||||
|
always_populate_raw_post_data=-1
|
||||||
|
default_charset='UTF-8'
|
||||||
|
output_buffering=0
|
||||||
|
|
||||||
|
; slow transfers will be killed after this time
|
||||||
|
max_execution_time=3600
|
||||||
|
max_input_time=3600
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# restart services
|
||||||
|
service php${php_ver_new}-fpm restart
|
||||||
|
a2enconf php${php_ver_new}-fpm
|
||||||
|
service apache2 restart
|
||||||
|
|
||||||
|
is_active_app unattended-upgrades && run_app unattended-upgrades || true
|
||||||
|
|
||||||
|
# mark as successful
|
||||||
|
mv "${new_cfg}" "${old_cfg}"
|
||||||
|
install_template "php/opcache.ini.sh" "/etc/php/${php_ver_new}/mods-available/opcache.ini" --defaults
|
||||||
|
clear_opcache
|
||||||
|
|
||||||
|
source /usr/local/etc/library.sh # refresh NCPCFG RELEASE PHPVER
|
||||||
|
run_app nc-limits
|
||||||
|
restore_maintenance_mode
|
||||||
|
|
||||||
|
rm -f /etc/update-motd.d/30ncp-dist-upgrade
|
||||||
|
|
||||||
|
echo "Upgrade to ${release_new} successful"
|
||||||
|
trap '' EXIT
|
||||||
79
bin/ncp-dist-upgrade.d/debian-11.sh
Normal file
79
bin/ncp-dist-upgrade.d/debian-11.sh
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu -o pipefail
|
||||||
|
|
||||||
|
new_cfg=/usr/local/etc/ncp-recommended.cfg
|
||||||
|
[[ -f "${new_cfg}" ]] || { echo "Already on the lastest recommended distribution. Abort." >&2; exit 1; }
|
||||||
|
|
||||||
|
echo "
|
||||||
|
>>> ATTENTION <<<
|
||||||
|
This is a dangerous process that is only guaranteed to work properly if you
|
||||||
|
have not made manual changes in the system. Backup the SD card first and
|
||||||
|
proceed at your own risk.
|
||||||
|
|
||||||
|
Note that this is not a requirement for NCP to continue working properly.
|
||||||
|
The current distribution will keep receiving updates for some time.
|
||||||
|
|
||||||
|
Do you want to continue? [y/N]"
|
||||||
|
|
||||||
|
if [[ "${DEBIAN_FRONTEND:-}" == "noninteractive" ]] || ! [[ -t 0 ]]
|
||||||
|
then
|
||||||
|
echo "Noninteractive environment detected. Automatically proceeding in 30 seconds..."
|
||||||
|
sleep 30
|
||||||
|
else
|
||||||
|
read -n1 -r key
|
||||||
|
[[ "${key,,}" == y ]] || exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
source /usr/local/etc/library.sh
|
||||||
|
is_more_recent_than "${PHPVER}.0" "8.0.0" || {
|
||||||
|
echo "You still have PHP version ${PHPVER} installed. Please update to the latest supported version of nextcloud (which will also update your PHP version) before proceeding with the distribution upgrade."
|
||||||
|
echo "Exiting."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
save_maintenance_mode
|
||||||
|
|
||||||
|
# Perform dist-upgrade
|
||||||
|
|
||||||
|
apt-get update && apt-get upgrade -y
|
||||||
|
for aptlist in /etc/apt/sources.list /etc/apt/sources.list.d/php.list /etc/apt/sources.list.d/armbian.list
|
||||||
|
do
|
||||||
|
[ -f "$aptlist" ] && sed -i -e "s/bullseye/bookworm/g" "$aptlist"
|
||||||
|
done
|
||||||
|
for aptlist in /etc/apt/sources.list.d/*.list
|
||||||
|
do
|
||||||
|
[[ "$aptlist" =~ "/etc/apt/sources.list.d/"(php|armbian)".list" ]] || continue
|
||||||
|
echo "Disabling repositories from \"$aptlist\""
|
||||||
|
sed -i -e "s/deb/#deb/g" "$aptlist"
|
||||||
|
done
|
||||||
|
apt-get update && apt-get upgrade -y --without-new-pkgs
|
||||||
|
if is_lxc
|
||||||
|
then
|
||||||
|
# Required to avoid breakage of /etc/resolv.conf
|
||||||
|
apt-get install -y --no-install-recommends systemd-resolved && systemctl enable --now systemd-resolved
|
||||||
|
fi
|
||||||
|
apt-get full-upgrade -y
|
||||||
|
sudo apt-get --purge autoremove -y
|
||||||
|
|
||||||
|
apt-get install -y --no-install-recommends exfatprogs
|
||||||
|
|
||||||
|
#mkdir -p /etc/systemd/system/php8.1-fpm.service.d
|
||||||
|
#echo '[Service]' > /etc/systemd/system/php8.1-fpm.service.d/ncp.conf
|
||||||
|
#echo 'ExecStartPre=mkdir -p /var/run/php' >> /etc/systemd/system/php8.1-fpm.service.d/ncp.conf
|
||||||
|
#[[ "$INIT_SYSTEM" != "systemd" ]] || { systemctl daemon-reload && systemctl restart php8.1-fpm; }
|
||||||
|
|
||||||
|
restore_maintenance_mode
|
||||||
|
cfg="$(jq "." "$NCPCFG")"
|
||||||
|
cfg="$(jq ".release = \"bookworm\"" <<<"$cfg")"
|
||||||
|
echo "$cfg" > "$NCPCFG"
|
||||||
|
rm -f /etc/update-motd.d/30ncp-dist-upgrade
|
||||||
|
|
||||||
|
echo "Update to Debian 12 (bookworm) successful."
|
||||||
|
|
||||||
|
is_active_app unattended-upgrades && {
|
||||||
|
echo "Setting up unattended upgrades..."
|
||||||
|
run_app unattended-upgrades || true
|
||||||
|
echo "done."
|
||||||
|
}
|
||||||
2
ncp.sh
2
ncp.sh
@ -22,7 +22,7 @@ install()
|
|||||||
{
|
{
|
||||||
# NCP-CONFIG
|
# NCP-CONFIG
|
||||||
apt-get update
|
apt-get update
|
||||||
$APTINSTALL git dialog whiptail jq file lsb-release
|
$APTINSTALL git dialog whiptail jq file lsb-release tmux
|
||||||
mkdir -p "$CONFDIR" "$BINDIR"
|
mkdir -p "$CONFDIR" "$BINDIR"
|
||||||
|
|
||||||
# This has changed, pi user no longer exists by default, the user needs to create it with Raspberry Pi imager
|
# This has changed, pi user no longer exists by default, the user needs to create it with Raspberry Pi imager
|
||||||
|
|||||||
@ -140,7 +140,7 @@ def close_first_run_wizard(driver: WebDriver):
|
|||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
|
|
||||||
|
|
||||||
def test_nextcloud(IP: str, nc_port: str, driver: WebDriver):
|
def test_nextcloud(IP: str, nc_port: str, driver: WebDriver, skip_release_check: bool):
|
||||||
""" Login and assert admin page checks"""
|
""" Login and assert admin page checks"""
|
||||||
test = Test()
|
test = Test()
|
||||||
test.new("nextcloud page")
|
test.new("nextcloud page")
|
||||||
@ -263,8 +263,11 @@ def test_nextcloud(IP: str, nc_port: str, driver: WebDriver):
|
|||||||
expected['ncp_version'] = True
|
expected['ncp_version'] = True
|
||||||
elif 'php version' in divs[0].text.lower() and divs[1].text == ncp_cfg['php_version']:
|
elif 'php version' in divs[0].text.lower() and divs[1].text == ncp_cfg['php_version']:
|
||||||
expected['php_version'] = True
|
expected['php_version'] = True
|
||||||
elif 'debian release' in divs[0].text.lower() and divs[1].text == ncp_cfg['release']:
|
elif 'debian release' in divs[0].text.lower():
|
||||||
expected['debian_release'] = True
|
if divs[1].text == ncp_cfg['release'] or skip_release_check:
|
||||||
|
expected['debian_release'] = True
|
||||||
|
else:
|
||||||
|
print(f"{tc.yellow}{divs[1].text} != {ncp_cfg['release']}")
|
||||||
failed = list(map(lambda item: item[0], filter(lambda item: not item[1], expected.items())))
|
failed = list(map(lambda item: item[0], filter(lambda item: not item[1], expected.items())))
|
||||||
test.check(len(failed) == 0, f"checks failed for admin section: [{', '.join(failed)}]")
|
test.check(len(failed) == 0, f"checks failed for admin section: [{', '.join(failed)}]")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -302,11 +305,12 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
# parse options
|
# parse options
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'hn', ['help', 'new', 'no-gui'])
|
opts, args = getopt.getopt(sys.argv[1:], 'hn', ['help', 'new', 'no-gui', 'skip-release-check'])
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError:
|
||||||
usage()
|
usage()
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
|
skip_release_check = False
|
||||||
options = webdriver.FirefoxOptions()
|
options = webdriver.FirefoxOptions()
|
||||||
for opt, arg in opts:
|
for opt, arg in opts:
|
||||||
if opt in ('-h', '--help'):
|
if opt in ('-h', '--help'):
|
||||||
@ -317,6 +321,8 @@ if __name__ == "__main__":
|
|||||||
os.unlink(test_cfg)
|
os.unlink(test_cfg)
|
||||||
elif opt == '--no-gui':
|
elif opt == '--no-gui':
|
||||||
options.add_argument("-headless")
|
options.add_argument("-headless")
|
||||||
|
elif opt == '--skip-release-check':
|
||||||
|
skip_release_check = True
|
||||||
else:
|
else:
|
||||||
usage()
|
usage()
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
@ -355,7 +361,7 @@ if __name__ == "__main__":
|
|||||||
driver = webdriver.Firefox(options=options)
|
driver = webdriver.Firefox(options=options)
|
||||||
failed=False
|
failed=False
|
||||||
try:
|
try:
|
||||||
test_nextcloud(IP, nc_port, driver)
|
test_nextcloud(IP, nc_port, driver, skip_release_check)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
print(traceback.format_exc())
|
print(traceback.format_exc())
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user