mirror of
https://github.com/YunoHost/package_check.git
synced 2024-09-03 20:06:20 +02:00
196 lines
6.5 KiB
Bash
Executable file
196 lines
6.5 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
#=================================================
|
|
# Determine if it's a CI environment
|
|
#=================================================
|
|
|
|
# By default, it's a standalone execution.
|
|
type_exec_env=0
|
|
# CI environment
|
|
[ -e "./../config" ] && type_exec_env=1
|
|
# Official CI environment
|
|
[ -e "./../auto_build/auto.conf" ] && type_exec_env=2
|
|
|
|
|
|
# Try to find a optionnal email address to notify the maintainer
|
|
# In this case, this email will be used instead of the email from the manifest.
|
|
notification_email="$(grep -m1 "^Email=" $TEST_CONTEXT/check_process.options | cut -d '=' -f2)"
|
|
|
|
# Try to find a optionnal option for the grade of notification
|
|
notification_mode="$(grep -m1 "^Notification=" $TEST_CONTEXT/check_process.options | cut -d '=' -f2)"
|
|
|
|
|
|
#=================================================
|
|
# Notification grade
|
|
#=================================================
|
|
|
|
notif_grade () {
|
|
# Check the level of notification from the check_process.
|
|
# Echo 1 if the grade is reached
|
|
|
|
compare_grade ()
|
|
{
|
|
if echo "$notification_mode" | grep -q "$1"; then
|
|
echo 1
|
|
else
|
|
echo 0
|
|
fi
|
|
}
|
|
|
|
case "$1" in
|
|
all)
|
|
# If 'all' is needed, only a grade of notification at 'all' can match
|
|
compare_grade "^all$"
|
|
;;
|
|
change)
|
|
# If 'change' is needed, notification at 'all' or 'change' can match
|
|
compare_grade "^all$\|^change$"
|
|
;;
|
|
down)
|
|
# If 'down' is needed, notification at 'all', 'change' or 'down' match
|
|
compare_grade "^all$\|^change$\|^down$"
|
|
;;
|
|
*)
|
|
echo 0
|
|
;;
|
|
esac
|
|
}
|
|
|
|
#=================================================
|
|
# Inform of the results by XMPP and/or by mail
|
|
#=================================================
|
|
|
|
send_mail=0
|
|
|
|
# If package check it's in the official CI environment
|
|
# Check the level variation
|
|
if [ $type_exec_env -eq 2 ]
|
|
then
|
|
|
|
# Get the job name, stored in the work_list
|
|
job=$(head -n1 "./../work_list" | cut -d ';' -f 3)
|
|
|
|
# Identify the type of test, stable (0), testing (1) or unstable (2)
|
|
# Default stable
|
|
test_type=0
|
|
message=""
|
|
if echo "$job" | grep -q "(testing)"
|
|
then
|
|
message="(TESTING) "
|
|
test_type=1
|
|
elif echo "$job" | grep -q "(unstable)"
|
|
then
|
|
message="(UNSTABLE) "
|
|
test_type=2
|
|
fi
|
|
|
|
# Build the log path (and replace all space by %20 in the job name)
|
|
if [ -n "$job" ]; then
|
|
if systemctl list-units | grep --quiet jenkins
|
|
then
|
|
job_log="/job/${job// /%20}/lastBuild/console"
|
|
elif systemctl list-units | grep --quiet yunorunner
|
|
then
|
|
# Get the directory of YunoRunner
|
|
ci_dir="$(grep WorkingDirectory= /etc/systemd/system/yunorunner.service | cut -d= -f2)"
|
|
# List the jobs from YunoRunner and grep the job (without Community or Official).
|
|
job_id="$(cd "$ci_dir"; ve3/bin/python ciclic list | grep ${job%% *} | head -n1)"
|
|
# Keep only the id of the job, by removing everything after -
|
|
job_id="${job_id%% -*}"
|
|
# And remove any space before the id.
|
|
job_id="${job_id##* }"
|
|
job_log="/job/$job_id"
|
|
fi
|
|
fi
|
|
|
|
# If it's a test on testing or unstable
|
|
if [ $test_type -gt 0 ]
|
|
then
|
|
# Remove unstable or testing of the job name to find its stable version in the level list
|
|
job="${job% (*)}"
|
|
fi
|
|
|
|
# Get the previous level, found in the file list_level_stable
|
|
previous_level=$(grep "^$job:" "./../auto_build/list_level_stable" | cut -d: -f2)
|
|
|
|
# Print the variation of the level. If this level is different than 0
|
|
if [ $global_level -gt 0 ]
|
|
then
|
|
message="${message}Application $app_id"
|
|
# If non previous level was found
|
|
if [ -z "$previous_level" ]; then
|
|
message="$message just reach the level $global_level"
|
|
send_mail=$(notif_grade all)
|
|
# If the level stays the same
|
|
elif [ $global_level -eq $previous_level ]; then
|
|
message="$message stays at level $global_level"
|
|
# Need notification at 'all' to notify by email
|
|
send_mail=$(notif_grade all)
|
|
# If the level go up
|
|
elif [ $global_level -gt $previous_level ]; then
|
|
message="$message rise from level $previous_level to level $global_level"
|
|
# Need notification at 'change' to notify by email
|
|
send_mail=$(notif_grade change)
|
|
# If the level go down
|
|
elif [ $global_level -lt $previous_level ]; then
|
|
message="$message go down from level $previous_level to level $global_level"
|
|
# Need notification at 'down' to notify by email
|
|
send_mail=$(notif_grade down)
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# If the app completely failed and obtained 0
|
|
if [ $global_level -eq 0 ]
|
|
then
|
|
message="${message}Application $app_id has completely failed the continuous integration tests"
|
|
|
|
# Always send an email if the app failed
|
|
send_mail=1
|
|
fi
|
|
|
|
subject="[YunoHost] $message"
|
|
|
|
# If the test was perform in the official CI environment
|
|
# Add the log address
|
|
# And inform with xmpp
|
|
if [ $type_exec_env -eq 2 ]
|
|
then
|
|
|
|
# Build the address of the server from auto.conf
|
|
ci_path=$(grep "DOMAIN=" "./../auto_build/auto.conf" | cut -d= -f2)/$(grep "CI_PATH=" "./../auto_build/auto.conf" | cut -d= -f2)
|
|
|
|
# Add the log adress to the message
|
|
message="$message on https://$ci_path$job_log"
|
|
|
|
# Send a xmpp notification on the chat room "apps"
|
|
# Only for a test with the stable version of YunoHost
|
|
if [ $test_type -eq 0 ]
|
|
then
|
|
"./../auto_build/xmpp_bot/xmpp_post.sh" "$message" > /dev/null 2>&1
|
|
fi
|
|
fi
|
|
|
|
# Send a mail to main maintainer according to notification option in the check_process.
|
|
# Only if package check is in a CI environment (Official or not)
|
|
if [ $type_exec_env -ge 1 ] && [ $send_mail -eq 1 ]
|
|
then
|
|
|
|
# Add a 'from' header for the official CI only.
|
|
# Apparently, this trick is not needed anymore !?
|
|
# if [ $type_exec_env -eq 2 ]; then
|
|
# from_yuno="-a \"From: yunohost@yunohost.org\""
|
|
# fi
|
|
|
|
# Get the maintainer email from the manifest. If it doesn't found if the check_process
|
|
if [ -z "$notification_email" ]; then
|
|
notification_email=$(grep '\"email\": ' "$package_path/manifest.json" | cut -d '"' -f 4)
|
|
fi
|
|
|
|
# Send the message by mail, if a address has been find
|
|
if [ -n "$notification_email" ]; then
|
|
mail $from_yuno -s "$subject" "$notification_email" <<< "$message"
|
|
fi
|
|
fi
|
|
|
|
|