Compare commits

...

17 Commits
0.9 ... master

Author SHA1 Message Date
samuel c74762858b [Dev] Remove double logs in runner 2023-05-11 15:09:39 +02:00
samuel 14ed4ab071 [Dev] Display live messages in pipeline 2023-05-11 14:18:57 +02:00
samuel f9a5808607 [Fix] Do not try to install package if already upgraded just before 2023-05-11 01:59:20 +02:00
samuel e797b705ab [Dev] Add go-toolset to requirements 2023-05-11 01:58:19 +02:00
samuel 08237fc626 [Dev] Rewrite tests files to respect shellcheck and shfmt 2023-05-11 00:56:10 +02:00
samuel 8958bea96b [Fix] Replace reserved word deamon with deamonize 2023-05-10 12:59:56 +02:00
samuel e0c2fa89de [Dev] Hide ps output in runner stop 2023-05-09 15:25:55 +02:00
samuel 734bbb8ecf [Fix] Check runner sock already running only when starting 2023-05-09 15:23:43 +02:00
samuel d204aec2a6 [Dev] Hide getent output 2023-05-09 15:15:17 +02:00
samuel 5ec38ad657 [Dev] Add some logs in deployer stop 2023-05-09 15:11:59 +02:00
samuel 89131ec9ee [Fix] Fix boolean usage in deployer stop 2023-05-09 15:11:37 +02:00
samuel d5ca04a90d [Fix] Move test case to respect alphabetic order 2023-05-09 15:10:57 +02:00
samuel 40324e5be9 [Dev] Hide getent output 2023-05-09 15:09:15 +02:00
samuel c6373af98c [Dev] Add some logs in deployer stop 2023-05-09 15:02:07 +02:00
samuel 4af7c48a52 [Fix] Fix boolean command in deployer 2023-05-09 15:01:47 +02:00
samuel 048a325166 [Dev] Do not display ps output in deployer 2023-05-09 14:19:03 +02:00
samuel cde881f1b8 [Dev] Do not display getent output in deployer service 2023-05-09 14:18:47 +02:00
8 changed files with 200 additions and 159 deletions

View File

@ -86,12 +86,13 @@ install: conf/*.sample systemd/*.service bin/*
.PHONY: check_format .PHONY: check_format
check_format: check_format:
shfmt --diff ./src shfmt --diff ./src ./tests
.PHONY: check_linting .PHONY: check_linting
check_linting: check_linting:
shfmt --find ./src | xargs bash -o noexec shfmt --find ./src ./tests | while read f; do bash -o noexec $$f; done
shfmt --find ./src | xargs shellcheck --external-sources shfmt --find ./src ./tests | while read f; do \
shellcheck --external-sources $$f; done
.PHONY: unit_test .PHONY: unit_test
unit_test: unit_test:

View File

@ -10,7 +10,7 @@ Source0: %{name}-%{version}.tar.gz
BuildArch: x86_64 BuildArch: x86_64
BuildRequires: make BuildRequires: make
Requires: bash,inotify-tools,jq,nmap-ncat,rpm-build,rpmdevtools,ShellCheck,shfmt Requires: bash,go-toolset,inotify-tools,jq,nmap-ncat,rpm-build,rpmdevtools,ShellCheck,shfmt
%description %description
Netoik Continuous Deployment tool Netoik Continuous Deployment tool

View File

@ -198,9 +198,9 @@ process_request() (
fi fi
log_debug "RPM path found at '${rpm_path}'." log_debug "RPM path found at '${rpm_path}'."
# Upgrade package if already installed.
log_debug "Check if pkg '${pkg_name}' is already installed." log_debug "Check if pkg '${pkg_name}' is already installed."
if rpm --query "${pkg_name}" 1>/dev/null 2>/dev/null; then if rpm --query "${pkg_name}" 1>/dev/null 2>/dev/null; then
# Upgrade package if already installed.
log_debug "Package '${pkg_name}' already installed, so upgrade to v log_debug "Package '${pkg_name}' already installed, so upgrade to v
${pkg_version}" ${pkg_version}"
if ! output="$(sudo rpm --upgrade \ if ! output="$(sudo rpm --upgrade \
@ -210,15 +210,15 @@ process_request() (
return return
fi fi
log_debug "RPM package '${pkg_name}' upgraded to v${pkg_version}." log_debug "RPM package '${pkg_name}' upgraded to v${pkg_version}."
fi else
# Install package if not already installed.
# Install package if not already installed. log_debug "Package '${pkg_name}' is not already installed, so install
log_debug "Package '${pkg_name}' is not already installed, so install v${pkg_version}."
v${pkg_version}." if ! output="$(sudo rpm --install --verbose --hash "${rpm_path}")"; then
if ! output="$(sudo rpm --install --verbose --hash "${rpm_path}")"; then reply "${err_rpm_install}" \
reply "${err_rpm_install}" \ "Cannot install package '${pkg_name}' v${pkg_version}: ${output}."
"Cannot install package '${pkg_name}' v${pkg_version}: ${output}." return
return fi
fi fi
# Package deployed. # Package deployed.
@ -246,7 +246,7 @@ process_loop() (
main() ( main() (
# Parse arguments. # Parse arguments.
daemon="false" daemonize="false"
keep_open="true" keep_open="true"
config_file="${DEFAULT_CONFIG_FILE}" config_file="${DEFAULT_CONFIG_FILE}"
errors_file="${DEFAULT_ERRORS_FILE}" errors_file="${DEFAULT_ERRORS_FILE}"
@ -268,7 +268,7 @@ main() (
shift 2 shift 2
;; ;;
-d | --daemon) -d | --daemon)
daemon="true" daemonize="true"
shift shift
;; ;;
-e | --errs) -e | --errs)
@ -378,7 +378,7 @@ main() (
fail "Variable runner_deployer_username is empty." \ fail "Variable runner_deployer_username is empty." \
"${err_runner_deployer_groupname_empty}" "${err_runner_deployer_groupname_empty}"
fi fi
if ! getent group "${runner_deployer_groupname}"; then if ! getent group "${runner_deployer_groupname}" >/dev/null; then
fail "Runner-deployer group '${runner_deployer_groupname}' does not exist." \ fail "Runner-deployer group '${runner_deployer_groupname}' does not exist." \
"${err_runner_deployer_group_not_exist}" "${err_runner_deployer_group_not_exist}"
fi fi
@ -415,7 +415,7 @@ main() (
) & ) &
# Run process loop in background or foreground. # Run process loop in background or foreground.
if "${daemon}"; then if "${daemonize}"; then
log_info "Run process loop in background." log_info "Run process loop in background."
process_loop & process_loop &
echo "$!" >"${deployer_pid}" echo "$!" >"${deployer_pid}"
@ -436,14 +436,20 @@ main() (
fi fi
pid="$(cat "${deployer_pid}")" pid="$(cat "${deployer_pid}")"
rm --force "${deployer_pid}" rm --force "${deployer_pid}"
if ! ps -p "${pid}"; then
# Kill deployer process.
log_info "Kill deployer process with pid '${pid}'."
if ! ps -p "${pid}" >/dev/null; then
fail "Deployer process with pid='${pid}' is not running." \ fail "Deployer process with pid='${pid}' is not running." \
"${err_deployer_process_not_running}" "${err_deployer_process_not_running}"
fi fi
if ! kill "${pid}" || kill -KILL "${pid}"; then if ! output="$(kill "${pid}" 2>&1 || kill -KILL "${pid}" 2>&1)"; then
fail "Cannot kill deployer process." \ fail "Cannot kill deployer process: ${output}." \
"${err_deployer_process_not_killed}" "${err_deployer_process_not_killed}"
fi fi
# Remove deployer sock file.
log_info "Remove deployer sock at '${deployer_sock}'."
rm --force "${deployer_sock}" rm --force "${deployer_sock}"
;; ;;
esac esac

View File

@ -259,21 +259,25 @@ main() (
echo "${runner_request}" | ncat --unixsock "${runner_sock}" echo "${runner_request}" | ncat --unixsock "${runner_sock}"
) & ) &
# Wait for runner response. # Start CI runner.
echo -e "Starting CI runner..."
cd "${rd_pipeline_sock_dir}" cd "${rd_pipeline_sock_dir}"
ncat_cmd="ncat --listen --unixsock --keep-open pipeline.sock"
if [ "${runner_timeout}" -gt 0 ]; then if [ "${runner_timeout}" -gt 0 ]; then
response="$(timeout "${runner_timeout}" ncat --listen \ ncat_cmd="timeout ${runner_timeout} ${ncat_cmd}"
--unixsock pipeline.sock)"
else
response="$(ncat --listen --unixsock pipeline.sock)"
fi fi
while read -r response; do
echo -e "$(echo "${response}" | jq --raw-output .msg)"
code="$(echo "${response}" | jq .code)"
[ "${code}" = "null" ] || break
done < <($ncat_cmd)
pkill --full --exact --parent "$$" "${ncat_cmd}" || true
# Remove random directory. # Remove random directory.
rm --recursive "${rd_pipeline_sock_dir}" rm --recursive "${rd_pipeline_sock_dir}"
# Display response. # Display response.
echo -e "Response from RUNNER:\n$(echo "${response}" | jq --raw-output .msg)" exit "${code}"
exit "$(echo "${response}" | jq .code)"
) )
main "$@" main "$@"

View File

@ -95,21 +95,29 @@ Positional argument ACTION
) )
reply() ( reply() (
code="$1" msg="$1"
msg="$2" code="$2"
if [ "${code}" -gt 0 ]; then if [ -z "${code}" ]; then
log_error "${msg}"
else
log_info "${msg}" log_info "${msg}"
json="$(jq --null-input \
--compact-output \
--arg m "${msg}" \
'{"msg":$m}')"
else
if [ "${code}" -eq 0 ]; then
log_info "${msg}"
else
log_error "${msg}"
fi
json="$(jq --null-input \
--compact-output \
--arg m "${msg}" \
--arg c "${code}" \
'{"msg":$m,"code":$c|tonumber}')"
fi fi
if ! output="$(jq --null-input \ if ! output="$(echo "${json}" | ncat --unixsock "${response_sock}" 2>&1)"; then
--compact-output \
--arg c "${code}" \
--arg m "${msg}" \
'{"code":$c|tonumber,"msg":$m}' |
ncat --unixsock "${response_sock}" 2>&1)"; then
log_error "Cannot write to sock '${response_sock}': ${output}." log_error "Cannot write to sock '${response_sock}': ${output}."
fi fi
) )
@ -149,17 +157,18 @@ process_request() (
log_debug "Get repo_name from json." log_debug "Get repo_name from json."
if ! repo_name="$(echo "${request}" | if ! repo_name="$(echo "${request}" |
jq --raw-output ".repo_name" 2>&1)"; then jq --raw-output ".repo_name" 2>&1)"; then
reply "${err_json_bad_format}" \ reply "Cannot parse json '${request}': ${repo_name}." \
"Cannot parse json '${request}': ${repo_name}." "${err_json_bad_format}"
return return
fi fi
if [ "${repo_name}" = "null" ]; then if [ "${repo_name}" = "null" ]; then
reply "${err_repo_name_missing}" "Missing key repo_name in '${request}'." reply "Missing key repo_name in '${request}'." \
"${err_repo_name_missing}"
return return
fi fi
if [ -z "${repo_name}" ]; then if [ -z "${repo_name}" ]; then
reply "${err_repo_name_empty}" \ reply "Empty value for key repo_name in '${request}'." \
"Empty value for key repo_name in '${request}'." "${err_repo_name_empty}"
return return
fi fi
log_debug "Got pkg name: '${repo_name}'." log_debug "Got pkg name: '${repo_name}'."
@ -167,7 +176,8 @@ process_request() (
# Get repository folder. # Get repository folder.
repo_dir="${repos_dir}/${repo_name}.git" repo_dir="${repos_dir}/${repo_name}.git"
if [ ! -d "${repo_dir}" ]; then if [ ! -d "${repo_dir}" ]; then
reply "${err_repo_dir_not_exist}" "Repository '${repo_dir}' does not exist." reply "Repository '${repo_dir}' does not exist." \
"${err_repo_dir_not_exist}"
return return
fi fi
log_debug "Repository is present at '${repo_dir}'." log_debug "Repository is present at '${repo_dir}'."
@ -175,30 +185,31 @@ process_request() (
# Get repo_hash from json. # Get repo_hash from json.
log_debug "Get repo_hash from json." log_debug "Get repo_hash from json."
if ! repo_hash=$(echo "${request}" | jq --raw-output ".repo_hash" 2>&1); then if ! repo_hash=$(echo "${request}" | jq --raw-output ".repo_hash" 2>&1); then
reply "${err_json_bad_format}" \ reply "Cannot parse json '${request}': ${repo_hash}." \
"Cannot parse json '${request}': ${repo_hash}." "${err_json_bad_format}"
return return
fi fi
if [ "${repo_hash}" = "null" ]; then if [ "${repo_hash}" = "null" ]; then
reply "${err_repo_hash_missing}" "Missing key repo_hash in '${request}'." reply "Missing key repo_hash in '${request}'." \
"${err_repo_hash_missing}"
return return
fi fi
if [ -z "${repo_hash}" ]; then if [ -z "${repo_hash}" ]; then
reply "${err_repo_hash_empty}" \ reply "Empty value for key repo_hash in '${request}'." \
"Empty value for key repo_hash in '${request}'." 1>&2 "${err_repo_hash_empty}"
return return
fi fi
# Get repo_tag from json. # Get repo_tag from json.
log_debug "Get repo_tag from json." log_debug "Get repo_tag from json."
if ! repo_tag=$(echo "${request}" | jq --raw-output ".repo_tag"); then if ! repo_tag=$(echo "${request}" | jq --raw-output ".repo_tag"); then
reply "${err_json_bad_format}" \ reply "Cannot parse json '${request}': ${repo_tag}." \
"Cannot parse json '${request}': ${repo_tag}." "${err_json_bad_format}"
return return
fi fi
if [ -z "${repo_tag}" ]; then if [ -z "${repo_tag}" ]; then
reply "${err_repo_tag_empty}" \ reply "Empty value for key repo_tag in '${request}'." \
"Empty value for key repo_tag in '${request}'." "${err_repo_tag_empty}"
return return
fi fi
@ -207,66 +218,72 @@ process_request() (
[ "${repo_tag}" != "null" ] && repo_id="${repo_tag}" [ "${repo_tag}" != "null" ] && repo_id="${repo_tag}"
rand="$(echo "${RANDOM}" | md5sum | head --bytes 7)" rand="$(echo "${RANDOM}" | md5sum | head --bytes 7)"
repo_clone="${runner_cloning_dir}/${repo_name}-${repo_id}-${rand}" repo_clone="${runner_cloning_dir}/${repo_name}-${repo_id}-${rand}"
log_info "Clone '$repo_name'." reply "Cloning repo '${repo_name}'..."
if ! output="$(git clone "$repo_dir" "$repo_clone" 2>&1)"; then if ! output="$(git clone "${repo_dir}" "${repo_clone}" 2>&1)"; then
reply "${err_clone_repo}" "Cannot clone repo '${repo_name}': ${output}." reply "Cannot clone repo '${repo_name}': ${output}." \
"${err_clone_repo}"
return return
fi fi
cd "$repo_clone" cd "$repo_clone"
# Checkout git hash. # Checkout git hash.
log_info "Checkout hash $repo_hash." reply "Checkouting hash '${repo_hash}..."
if ! output="$(git checkout "$repo_hash" 2>&1)"; then if ! output="$(git checkout "$repo_hash" 2>&1)"; then
reply "${err_checkout_hash}" \ reply "Cannot checkout hash '${repo_hash}': ${output}." \
"Cannot checkout hash '${repo_hash}': ${output}." "${err_checkout_hash}"
return return
fi fi
# Check code validity. # Check code validity.
log_info "Check code validity." reply "Checking code format..."
if ! output="$(make check_format 2>&1)"; then if ! output="$(make check_format 2>&1)"; then
reply "${err_check_format}" "Check format error: ${output}." reply "Check format error: ${output}." "${err_check_format}"
return return
fi fi
reply "Checking code linting..."
if ! output="$(make check_linting 2>&1)"; then if ! output="$(make check_linting 2>&1)"; then
reply "${err_check_linting}" "Check linting error: ${output}." reply "Check linting error: ${output}." "${err_check_linting}"
return return
fi fi
reply "Running unit tests..."
if ! output="$(make unit_test 2>&1)"; then if ! output="$(make unit_test 2>&1)"; then
reply "${err_unit_test}" "Unit test error: ${output}." reply "Unit test error: ${output}." "${err_unit_test}"
return return
fi fi
# Stop now if no tag specified. # Stop now if no tag specified.
if [ "$repo_tag" = "null" ]; then if [ "$repo_tag" = "null" ]; then
reply 0 "Hash '${repo_hash}' OK for repo '${repo_name}'." reply "Hash '${repo_hash}' OK for repo '${repo_name}'." 0
return return
fi fi
# Build rpm package. # Build rpm package.
echo "Build RPM package." reply "Adding tag '${repo_tag}'..."
if ! output="$(git tag --message="$repo_tag" "$repo_tag" 2>&1)"; then if ! output="$(git tag --message="$repo_tag" "$repo_tag" 2>&1)"; then
reply "${err_add_tag}" "Cannot add git tag '${repo_tag}': ${output}." reply "Cannot add git tag '${repo_tag}': ${output}." "${err_add_tag}"
return return
fi fi
reply "Making source tarball..."
if ! output="$(make tarball 2>&1)"; then if ! output="$(make tarball 2>&1)"; then
reply "${err_make_tarball}" \ reply "Cannot make tarball for tag '${repo_tag}': ${output}." \
"Cannot make tarball for tag '${repo_tag}': ${output}." "${err_make_tarball}"
return return
fi fi
repo_version="$(make version)"
reply "Building RPM package '${repo_name}' v${repo_version}..."
if ! output="$(rpmbuild -bb "$repo_name.spec" 2>&1)"; then if ! output="$(rpmbuild -bb "$repo_name.spec" 2>&1)"; then
reply "${err_rpm_build}" \ reply "Cannot build rpm for tag '${repo_tag}': ${output}." \
"Cannot build rpm for tag '${repo_tag}': ${output}." "${err_rpm_build}"
return return
fi fi
# Deploy rpm package. # Deploy rpm package.
log_info "Deploy RPM package." reply "Deploying RPM package '${repo_name}' v${repo_version}..."
deployer_request="$(jq --null-input \ deployer_request="$(jq --null-input \
--compact-output \ --compact-output \
--arg s "${repo_clone}/runner.sock" \ --arg s "${repo_clone}/runner.sock" \
--arg n "${repo_name}" \ --arg n "${repo_name}" \
--arg v "$(make version)" \ --arg v "${repo_version}" \
'{"response_sock":$s,"pkg_name":$n,"pkg_version":$v}')" '{"response_sock":$s,"pkg_name":$n,"pkg_version":$v}')"
( (
inotifywait --timeout 1 --quiet --quiet \ inotifywait --timeout 1 --quiet --quiet \
@ -433,10 +450,6 @@ main() (
fail "Directory of runner_sock='${runner_sock}' is not writable." \ fail "Directory of runner_sock='${runner_sock}' is not writable." \
"${err_runner_sock_dir_not_writable}" "${err_runner_sock_dir_not_writable}"
fi fi
if [ -e "${runner_sock}" ]; then
fail "Sock deployer_sock='${runner_sock}' is already in use." \
"${err_runner_sock_already_in_use}"
fi
if [ -z "${runner_cloning_dir}" ]; then if [ -z "${runner_cloning_dir}" ]; then
fail "Variable runner_cloning_dir is empty." \ fail "Variable runner_cloning_dir is empty." \
@ -474,7 +487,7 @@ main() (
if [ -z "${runner_deployer_groupname}" ]; then if [ -z "${runner_deployer_groupname}" ]; then
fail "Variable runner_deployer_groupname is empty." "${err_runner_deployer_groupname_empty}" fail "Variable runner_deployer_groupname is empty." "${err_runner_deployer_groupname_empty}"
fi fi
if ! getent group "${runner_deployer_groupname}"; then if ! getent group "${runner_deployer_groupname}" >/dev/null; then
fail "Runner-deployer group '${runner_deployer_groupname}' does not exist." \ fail "Runner-deployer group '${runner_deployer_groupname}' does not exist." \
"${err_runner_deployer_group_not_exist}" "${err_runner_deployer_group_not_exist}"
fi fi
@ -482,7 +495,7 @@ main() (
if [ -z "${git_runner_groupname}" ]; then if [ -z "${git_runner_groupname}" ]; then
fail "Variable git_runner_groupname is empty." "${err_git_runner_groupname_empty}" fail "Variable git_runner_groupname is empty." "${err_git_runner_groupname_empty}"
fi fi
if ! getent group "${git_runner_groupname}"; then if ! getent group "${git_runner_groupname}" >/dev/null; then
fail "Git-runner group '${git_runner_groupname}' does not exist." \ fail "Git-runner group '${git_runner_groupname}' does not exist." \
"${err_git_runner_group_not_exist}" "${err_git_runner_group_not_exist}"
fi fi
@ -501,11 +514,20 @@ main() (
# Run chosen action. # Run chosen action.
case "${action}" in case "${action}" in
test)
# Stop now if we are only testing.
log_info "Configuration OK."
exit 0
;;
start) start)
if [ ! -S "${deployer_sock}" ]; then if [ ! -S "${deployer_sock}" ]; then
fail "Sock deployer_sock='${deployer_sock}' does not exist." \ fail "Sock deployer_sock='${deployer_sock}' does not exist." \
"${err_deployer_sock_not_exist}" "${err_deployer_sock_not_exist}"
fi fi
if [ -e "${runner_sock}" ]; then
fail "Sock deployer_sock='${runner_sock}' is already in use." \
"${err_runner_sock_already_in_use}"
fi
# Set right access in background after nc listen. # Set right access in background after nc listen.
( (
@ -537,20 +559,22 @@ main() (
fi fi
pid="$(cat "${runner_pid}")" pid="$(cat "${runner_pid}")"
rm --force "${runner_pid}" rm --force "${runner_pid}"
if ! ps -p "${pid}"; then
# Kill runner process.
log_info "Kill runner process with pid '${pid}'."
if ! ps -p "${pid}" >/dev/null; then
fail "Runner process with pid='${pid}' is not running." \ fail "Runner process with pid='${pid}' is not running." \
"${err_runner_process_not_running}" "${err_runner_process_not_running}"
fi fi
if ! kill "${pid}" || kill -KILL "${pid}"; then if ! output="$(kill "${pid}" || kill -KILL "${pid}")"; then
fail "Cannot kill runner process." "${err_runner_process_not_killed}" fail "Cannot kill runner process: ${output}." \
"${err_runner_process_not_killed}"
fi fi
# Remove runner sock file.
log_info "Remove runner sock at '${runner_sock}'."
rm --force "${runner_sock}" rm --force "${runner_sock}"
;; ;;
test)
# Stop now if we are only testing.
log_info "Configuration OK."
exit 0
;;
esac esac
) )

View File

@ -1,10 +1,11 @@
# #
# Deployer unit tests using BATS framework. # Deployer unit tests using BATS framework.
# #
bats_require_minimum_version 1.5.0 bats_require_minimum_version 1.5.0
setup() { setup() {
# shellcheck source=./tests/tests.conf
source "${PWD}/tests/tests.conf" source "${PWD}/tests/tests.conf"
make build >/dev/null make build >/dev/null
DESTDIR="${temp}" make install >/dev/null DESTDIR="${temp}" make install >/dev/null
@ -13,6 +14,7 @@ setup() {
"${temp}${sysconf_dir}/${name}/${name}.conf" "${temp}${sysconf_dir}/${name}/${name}.conf"
install --directory "${temp}${var_dir}/${name}/repositories/test.git" install --directory "${temp}${var_dir}/${name}/repositories/test.git"
install --directory "${temp}${var_dir}/${name}/RPMS" install --directory "${temp}${var_dir}/${name}/RPMS"
# shellcheck source=./conf/errors.conf.sample
source "${errs_file}" source "${errs_file}"
} }
@ -21,22 +23,22 @@ teardown() {
make clean >/dev/null make clean >/dev/null
} }
@test "run with bad arguments" { run_with_bad_arguments() { #@test
run -1 "${deployer_bin}" -z test run -1 "${deployer_bin}" -z test
run -1 "${deployer_bin}" --zzz test run -1 "${deployer_bin}" --zzz test
run -1 "${deployer_bin}" zzz run -1 "${deployer_bin}" zzz
run -1 "${deployer_bin}" --conf run -1 "${deployer_bin}" --conf
run -1 "${deployer_bin}" --conf=/path/to/nowhere test run -1 "${deployer_bin}" --conf=/path/to/nowhere test
run -1 "${deployer_bin}" --errs run -1 "${deployer_bin}" --errs
run -1 "${deployer_bin}" --errs=/path/to/nowhere test run -1 "${deployer_bin}" --errs=/path/to/nowhere test
run -1 "${deployer_bin}" --verbose --quiet test run -1 "${deployer_bin}" --verbose --quiet test
} }
@test "run without loop" { run_without_loop() { #@test
"${deployer_bin}" --conf="${conf_file}" --errs="${errs_file}" --verbose test "${deployer_bin}" --conf="${conf_file}" --errs="${errs_file}" --verbose test
} }
send_request() ( send_request() (
@ -47,63 +49,63 @@ send_request() (
( (
inotifywait --timeout 1 --quiet --quiet \ inotifywait --timeout 1 --quiet --quiet \
--event create "${response_sock_dir}" || true --event create "${response_sock_dir}" || true
echo "${request}" | ncat --unixsock "${deployer_sock}" echo "${request}" | ncat --unixsock "${deployer_sock}"
) & ) &
code="$(ncat --listen --unixsock "${response_sock}" | jq .code)" code="$(ncat --listen --unixsock "${response_sock}" | jq .code)"
"${deployer_bin}" --conf="${conf_file}" --errs="${errs_file}" stop "${deployer_bin}" --conf="${conf_file}" --errs="${errs_file}" stop
return "${code}" return "${code}"
) )
@test "run with err_pkg_name_missing" { run_with_err_pkg_name_missing() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s}')" '{"response_sock":$s}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_pkg_name_missing}" echo "status: got ${status:?}, expected ${err_pkg_name_missing}"
[ "${status}" -eq "${err_pkg_name_missing}" ] [ "${status}" -eq "${err_pkg_name_missing}" ]
} }
@test "run with err_pkg_name_empty" { run_with_err_pkg_name_empty() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"pkg_name":""}')" '{"response_sock":$s,"pkg_name":""}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_pkg_name_empty}" echo "status: got ${status:?}, expected ${err_pkg_name_empty}"
[ "${status}" -eq "${err_pkg_name_empty}" ] [ "${status}" -eq "${err_pkg_name_empty}" ]
} }
@test "run with err_repo_dir_not_exist" { run_with_err_repo_dir_not_exist() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"pkg_name":"not_exist"}')" '{"response_sock":$s,"pkg_name":"not_exist"}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_repo_dir_not_exist}" echo "status: got ${status:?}, expected ${err_repo_dir_not_exist}"
[ "${status}" -eq "${err_repo_dir_not_exist}" ] [ "${status}" -eq "${err_repo_dir_not_exist}" ]
} }
@test "run with err_pkg_version_missing" { run_with_err_pkg_version_missing() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"pkg_name":"test"}')" '{"response_sock":$s,"pkg_name":"test"}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_pkg_version_missing}" echo "status: got ${status:?}, expected ${err_pkg_version_missing}"
[ "${status}" -eq "${err_pkg_version_missing}" ] [ "${status}" -eq "${err_pkg_version_missing}" ]
} }
@test "run with err_pkg_version_empty" { run_with_err_pkg_version_empty() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"pkg_name":"test","pkg_version":""}')" '{"response_sock":$s,"pkg_name":"test","pkg_version":""}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_pkg_version_empty}" echo "status: got ${status:?}, expected ${err_pkg_version_empty}"
[ "${status}" -eq "${err_pkg_version_empty}" ] [ "${status}" -eq "${err_pkg_version_empty}" ]
} }
@test "run with err_rpm_path_not_exist" { run_with_err_rpm_path_not_exist() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"pkg_name":"test","pkg_version":"0.1"}')" '{"response_sock":$s,"pkg_name":"test","pkg_version":"0.1"}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_rpm_path_not_exist}" echo "status: got ${status:?}, expected ${err_rpm_path_not_exist}"
[ "${status}" -eq "${err_rpm_path_not_exist}" ] [ "${status}" -eq "${err_rpm_path_not_exist}" ]
} }

View File

@ -5,12 +5,14 @@
bats_require_minimum_version 1.5.0 bats_require_minimum_version 1.5.0
setup() { setup() {
# shellcheck source=./tests/tests.conf
source "${PWD}/tests/tests.conf" source "${PWD}/tests/tests.conf"
make build >/dev/null make build >/dev/null
DESTDIR="${temp}" make install >/dev/null DESTDIR="${temp}" make install >/dev/null
install --no-target-directory \ install --no-target-directory \
"${PWD}/tests/tests.conf" \ "${PWD}/tests/tests.conf" \
"${temp}${sysconf_dir}/${name}/${name}.conf" "${temp}${sysconf_dir}/${name}/${name}.conf"
# shellcheck source=./conf/errors.conf.sample
source "${errs_file}" source "${errs_file}"
} }
@ -19,7 +21,7 @@ teardown() {
make clean >/dev/null make clean >/dev/null
} }
@test "run with bad arguments" { run_with_bad_arguments() { #@test
run -1 "${pipeline_bin}" run -1 "${pipeline_bin}"
run -1 "${pipeline_bin}" bad_pipeline run -1 "${pipeline_bin}" bad_pipeline
@ -39,21 +41,21 @@ teardown() {
run -1 "${pipeline_bin}" -e /path/to/nowhere -H hash -n name newcommit run -1 "${pipeline_bin}" -e /path/to/nowhere -H hash -n name newcommit
} }
@test "run without runner sock" { run_without_runner_sock() { #@test
run "${pipeline_bin}" --conf="${conf_file}" --errs="${errs_file}" \ run "${pipeline_bin}" --conf="${conf_file}" --errs="${errs_file}" \
--test --hash hash --name name newcommit --test --hash hash --name name newcommit
echo "status: got ${status}, expected ${err_runner_sock_not_exist}" echo "status: got ${status:?}, expected ${err_runner_sock_not_exist}"
[ "${status}" -eq "${err_runner_sock_not_exist}" ] [ "${status}" -eq "${err_runner_sock_not_exist}" ]
} }
@test "run newcommit ok" { run_newcommit_ok() { #@test
ncat --listen --unixsock "${runner_sock}" & ncat --listen --unixsock "${runner_sock}" &
"${pipeline_bin}" --conf="${conf_file}" --errs="${errs_file}" \ "${pipeline_bin}" --conf="${conf_file}" --errs="${errs_file}" \
--test --hash hash --name name newcommit --test --hash hash --name name newcommit
echo "done" | ncat --unixsock "${runner_sock}" echo "done" | ncat --unixsock "${runner_sock}"
} }
@test "run newtag ok" { run_newtag_ok() { #@test
ncat --listen --unixsock "${runner_sock}" & ncat --listen --unixsock "${runner_sock}" &
"${pipeline_bin}" --conf="${conf_file}" --errs="${errs_file}" \ "${pipeline_bin}" --conf="${conf_file}" --errs="${errs_file}" \
--test --hash hash --name name --tag tag newtag --test --hash hash --name name --tag tag newtag

View File

@ -1,10 +1,11 @@
# #
# Deployer unit tests using BATS framework. # Deployer unit tests using BATS framework.
# #
bats_require_minimum_version 1.5.0 bats_require_minimum_version 1.5.0
setup() { setup() {
# shellcheck source=./tests/tests.conf
source "${PWD}/tests/tests.conf" source "${PWD}/tests/tests.conf"
make build >/dev/null make build >/dev/null
DESTDIR="${temp}" make install >/dev/null DESTDIR="${temp}" make install >/dev/null
@ -13,6 +14,7 @@ setup() {
"${temp}${sysconf_dir}/${name}/${name}.conf" "${temp}${sysconf_dir}/${name}/${name}.conf"
install --directory "${temp}${var_dir}/${name}/repositories/test.git" install --directory "${temp}${var_dir}/${name}/repositories/test.git"
install --directory "${temp}${var_dir}/${name}/RPMS" install --directory "${temp}${var_dir}/${name}/RPMS"
# shellcheck source=./conf/errors.conf.sample
source "${errs_file}" source "${errs_file}"
} }
@ -21,99 +23,99 @@ teardown() {
make clean >/dev/null make clean >/dev/null
} }
@test "run with bad arguments" { run_with_bad_arguments() { #@test
run -1 "${runner_bin}" -z run -1 "${runner_bin}" -z
run -1 "${runner_bin}" --zzz run -1 "${runner_bin}" --zzz
run -1 "${runner_bin}" zzz run -1 "${runner_bin}" zzz
run -1 "${runner_bin}" --conf run -1 "${runner_bin}" --conf
run -1 "${runner_bin}" --conf=/path/to/nowhere run -1 "${runner_bin}" --conf=/path/to/nowhere
run -1 "${runner_bin}" --errs run -1 "${runner_bin}" --errs
run -1 "${runner_bin}" --errs=/path/to/nowhere run -1 "${runner_bin}" --errs=/path/to/nowhere
run -1 "${runner_bin}" --verbose --quiet run -1 "${runner_bin}" --verbose --quiet
} }
@test "run without loop" { run_without_loop() { #@test
ncat --listen --unixsock "${deployer_sock}" & ncat --listen --unixsock "${deployer_sock}" &
"${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" --verbose test "${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" --verbose test
echo "done" | ncat --unixsock "${deployer_sock}" echo "done" | ncat --unixsock "${deployer_sock}"
} }
send_request() ( send_request() (
request="$1" request="$1"
ncat --listen --unixsock "${deployer_sock}" & ncat --listen --unixsock "${deployer_sock}" &
"${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" \ "${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" \
--daemon --once --verbose start --daemon --once --verbose start
code=$? code=$?
if [ "${code}" -ne 0 ]; then if [ "${code}" -ne 0 ]; then
echo "fail" | ncat --unixsock "${deployer_sock}" echo "fail" | ncat --unixsock "${deployer_sock}"
"${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" stop "${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" stop
return "${code}" return "${code}"
fi fi
( (
inotifywait --timeout 1 --quiet --quiet \ inotifywait --timeout 1 --quiet --quiet \
--event create "${response_sock_dir}" >&3 --event create "${response_sock_dir}" >&3
echo "${request}" | ncat --unixsock "${runner_sock}" echo "${request}" | ncat --unixsock "${runner_sock}"
) & ) &
echo "done" | ncat --unixsock "${deployer_sock}" echo "done" | ncat --unixsock "${deployer_sock}"
code="$(ncat --listen --unixsock "${response_sock}" | jq .code)" code="$(ncat --listen --unixsock "${response_sock}" | jq .code)"
"${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" stop "${runner_bin}" --conf="${conf_file}" --errs="${errs_file}" stop
return "${code}" return "${code}"
) )
@test "run with err_repo_name_missing" { run_with_err_repo_name_missing() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s}')" '{"response_sock":$s}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_repo_name_missing}" echo "status: got ${status:?}, expected ${err_repo_name_missing}"
[ "${status}" -eq "${err_repo_name_missing}" ] [ "${status}" -eq "${err_repo_name_missing}" ]
} }
@test "run with err_repo_name_empty" { run_with_err_repo_name_empty() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"repo_name":""}')" '{"response_sock":$s,"repo_name":""}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_repo_name_empty}" echo "status: got ${status:?}, expected ${err_repo_name_empty}"
[ "${status}" -eq "${err_repo_name_empty}" ] [ "${status}" -eq "${err_repo_name_empty}" ]
} }
@test "run with err_repo_dir_not_exist" { run_with_err_repo_dir_not_exist() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"repo_name":"not_exist"}')" '{"response_sock":$s,"repo_name":"not_exist"}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_repo_dir_not_exist}" echo "status: got ${status:?}, expected ${err_repo_dir_not_exist}"
[ "${status}" -eq "${err_repo_dir_not_exist}" ] [ "${status}" -eq "${err_repo_dir_not_exist}" ]
} }
@test "run with err_repo_hash_missing" { run_with_err_repo_hash_missing() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"repo_name":"test"}')" '{"response_sock":$s,"repo_name":"test"}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_repo_hash_missing}" echo "status: got ${status:?}, expected ${err_repo_hash_missing}"
[ "${status}" -eq "${err_repo_hash_missing}" ] [ "${status}" -eq "${err_repo_hash_missing}" ]
} }
@test "run with err_repo_hash_empty" { run_with_err_repo_hash_empty() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"repo_name":"test","repo_hash":""}')" '{"response_sock":$s,"repo_name":"test","repo_hash":""}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_repo_hash_empty}" echo "status: got ${status:?}, expected ${err_repo_hash_empty}"
[ "${status}" -eq "${err_repo_hash_empty}" ] [ "${status}" -eq "${err_repo_hash_empty}" ]
} }
@test "run with err_repo_tag_empty" { run_with_err_repo_tag_empty() { #@test
request="$(jq --null-input --compact-output \ request="$(jq --null-input --compact-output \
--arg s "${response_sock}" \ --arg s "${response_sock}" \
'{"response_sock":$s,"repo_name":"test","repo_hash":"hash","repo_tag":""}')" '{"response_sock":$s,"repo_name":"test","repo_hash":"hash","repo_tag":""}')"
run send_request "${request}" run send_request "${request}"
echo "status: got ${status}, expected ${err_repo_tag_empty}" echo "status: got ${status:?}, expected ${err_repo_tag_empty}"
[ "${status}" -eq "${err_repo_tag_empty}" ] [ "${status}" -eq "${err_repo_tag_empty}" ]
} }