Apps: "Bash".
Здесь изложены необходимые для поддержки вызова внешнего приложения (в примере описывается связка с "Docker + Bash") дополнения к возможностям сервиса автоматизации доставки и развёртывания кода простейших web-приложений к серверам тестирования и публикации, рассматриваемого в вышестоящей заметке.
Используя функционал расширения конфигурации SUDO добавляем правила в отдельные файлы конфигурации, разрешая пользователю, от имени которого запущен web-сервер, простую прямую загрузку данных из Git-репозитория непосредственно в директории web-сайтов и запуск скриптов "деплоя":
# vi /etc/sudoers.d/web-deploy-users
....
www-data ALL=(root:root) NOPASSWD: /usr/bin/test,/usr/local/etc/devops/docker-ctrl.sh
....
www-data ALL=(root:root) NOPASSWD: /usr/bin/test,/usr/local/etc/devops/docker-ctrl.sh
....
Дополненный для поддержки вызова внешнего инструмента конфигурационный файл:
# vi ./group0-site.example.net-testing.conf
##
# (required file name format: ./groupname-reponame-branch.conf) - in lowercase! #
# (supported branches: {master|staging|testing}) - in lowercase! #
##
# Секретный ключ, которым подписывается тело уведомления от удалённого репозитория, или пароль простой аутентификации
WEBHOOK_SECRET_KEY="keyHMACforPOST"
# Задаём метод доставки и применения данных
CD_MODE="external" # {direct|external}
# Адрес удалённого Git-репозитория, из которого будут загружаться данные
# (не указывается, если используется внешний инструмента развёртывания)
#GIT_REMOTE="ssh://git@gitlab.example.net/group0/site.example.net.git"
# Пользователь, от имени которого следует обращаться к удалённому репозиторию
# (не указывается, если используется внешний инструмента развёртывания)
#GIT_USER="git-group0"
# Месторасположение локального репозитория
# (не указывается, если используется внешний инструмента развёртывания)
#GIT_DIR="/var/www/group0/site.example.net"
# Месторасположение внешнего инструмента развёртывания и конфигурационного файла сайта
CD_EXTERNAL_EXEC="/usr/local/etc/devops/docker-ctrl.sh"
CD_EXTERNAL_CONF="/usr/local/etc/devops/conf/stage-site.example.net.conf"
# (required file name format: ./groupname-reponame-branch.conf) - in lowercase! #
# (supported branches: {master|staging|testing}) - in lowercase! #
##
# Секретный ключ, которым подписывается тело уведомления от удалённого репозитория, или пароль простой аутентификации
WEBHOOK_SECRET_KEY="keyHMACforPOST"
# Задаём метод доставки и применения данных
CD_MODE="external" # {direct|external}
# Адрес удалённого Git-репозитория, из которого будут загружаться данные
# (не указывается, если используется внешний инструмента развёртывания)
#GIT_REMOTE="ssh://git@gitlab.example.net/group0/site.example.net.git"
# Пользователь, от имени которого следует обращаться к удалённому репозиторию
# (не указывается, если используется внешний инструмента развёртывания)
#GIT_USER="git-group0"
# Месторасположение локального репозитория
# (не указывается, если используется внешний инструмента развёртывания)
#GIT_DIR="/var/www/group0/site.example.net"
# Месторасположение внешнего инструмента развёртывания и конфигурационного файла сайта
CD_EXTERNAL_EXEC="/usr/local/etc/devops/docker-ctrl.sh"
CD_EXTERNAL_CONF="/usr/local/etc/devops/conf/stage-site.example.net.conf"
Выносим в подключаемый файл подборку функций, предназначенных передачи управления внешнему инструменту "деплоя":
# cd /var/www/cgi-bin/webhook/webhook/lib
# vi ./cd-external-wrapper.sh.snippet && chown www-data:www-data ./cd-external-wrapper.sh.snippet && chmod o-rwx ./cd-external-wrapper.sh.snippet
# vi ./cd-external-wrapper.sh.snippet && chown www-data:www-data ./cd-external-wrapper.sh.snippet && chmod o-rwx ./cd-external-wrapper.sh.snippet
#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
# Функция развёртывания внешним инструментом
function cd-external {
# Проверяем наличие обязательных переменных
if [[ -z "${CD_EXTERNAL_EXEC}" || -z "${CD_EXTERNAL_CONF}" ]] ; then
FORTH=false
STATUS="422 Unprocessable Entity"
echo "${DATE}: Некорректный запрос: не все обязательные параметры описания внешнего CI/CD-инструмента присутствуют." >> "${LOG}"
fi
# Проверяем наличие точки взаимодействия с внешним инструментом
if sudo -u root test -f "${CD_EXTERNAL_EXEC}" && sudo -u root test -f "${CD_EXTERNAL_CONF}" ; then
# Пробуем запустить на исполнение CI/CD-процедуру, сразу уводя её в фоновый режим
sudo -u root "${CD_EXTERNAL_EXEC}" start-group "${CD_EXTERNAL_CONF}" >> "${LOG}" 2>&1 &
if [ "${?}" -eq "0" ] ; then
STATUS="200 Ok"
echo "${DATE}: Запрос на CI/CD-процедуры отправлен внешнему инструменту \"${CD_EXTERNAL_EXEC}\"." >> "${LOG}"
else
FORTH=false
STATUS="422 Unprocessable Entity"
echo "${DATE}: Сбой на этапе отправки запроса CI/CD-процедур внешнему инструменту \"${CD_EXTERNAL_EXEC}\"." >> "${LOG}"
fi
else
FORTH=false
STATUS="422 Unprocessable Entity"
echo "${DATE}: Недоступен внешний инструмент \"${CD_EXTERNAL_EXEC}\"." >> "${LOG}"
fi
return ${?}
}
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
# Функция развёртывания внешним инструментом
function cd-external {
# Проверяем наличие обязательных переменных
if [[ -z "${CD_EXTERNAL_EXEC}" || -z "${CD_EXTERNAL_CONF}" ]] ; then
FORTH=false
STATUS="422 Unprocessable Entity"
echo "${DATE}: Некорректный запрос: не все обязательные параметры описания внешнего CI/CD-инструмента присутствуют." >> "${LOG}"
fi
# Проверяем наличие точки взаимодействия с внешним инструментом
if sudo -u root test -f "${CD_EXTERNAL_EXEC}" && sudo -u root test -f "${CD_EXTERNAL_CONF}" ; then
# Пробуем запустить на исполнение CI/CD-процедуру, сразу уводя её в фоновый режим
sudo -u root "${CD_EXTERNAL_EXEC}" start-group "${CD_EXTERNAL_CONF}" >> "${LOG}" 2>&1 &
if [ "${?}" -eq "0" ] ; then
STATUS="200 Ok"
echo "${DATE}: Запрос на CI/CD-процедуры отправлен внешнему инструменту \"${CD_EXTERNAL_EXEC}\"." >> "${LOG}"
else
FORTH=false
STATUS="422 Unprocessable Entity"
echo "${DATE}: Сбой на этапе отправки запроса CI/CD-процедур внешнему инструменту \"${CD_EXTERNAL_EXEC}\"." >> "${LOG}"
fi
else
FORTH=false
STATUS="422 Unprocessable Entity"
echo "${DATE}: Недоступен внешний инструмент \"${CD_EXTERNAL_EXEC}\"." >> "${LOG}"
fi
return ${?}
}
Напоминаю, что эта заметка является частью описания самодельного сервиса автоматизации доставки и развёртывания кода простейших web-приложений, изложенного в вышестоящей инструкции.