#! /usr/bin/env sh set 'cd' 'rwx' cd_main () { cd_set_environment cd_write_environment cd_set_dns_resolving \ '9.9.9.9' cd_set_packages_repositories cd_set_packages_configuration cd_set_https_verification_off cd_update_packages_catalog cd_install_packages_tools cd_install_ca cd_set_https_verification_on cd_update_packages_catalog cd_upgrade_packages cd_install_git cd_install_python cd_clean_packages_cache cd_install "${@}" cd_bootstrap "${@}" } cd_set_environment () { CD_DNS_FILE='/etc/resolv.conf' CD_ENV="$(mktemp)" case "${CD_OS_NAME}" in 'debian') CD_PYTHON_COMMAND='python3' CD_PYTHON_PACKAGES='/usr/lib/python3/dist-packages' case "${CD_OS_VERSION}" in 'bookworm') echo 'TODO' ;; *) echo 'CD_OS_VERSION' exit 2 ;; esac ;; *) echo 'CD_OS_NAME' exit 1 ;; esac # project / branch [ "${CI_COMMIT_BRANCH}" ] && CD_PROJECT_BRANCH="${CI_COMMIT_BRANCH}" [ "${GITHUB_REF_NAME}" ] && CD_PROJECT_BRANCH="${GITHUB_REF_NAME}" if [ ! "${CD_PROJECT_BRANCH}" ] ; then echo 'CD_PROJECT_BRANCH' exit 3 fi # project / name [ "${CI_PROJECT_PATH}" ] \ && CD_PROJECT_NAME="$(basename "${CI_PROJECT_PATH}")" [ "${GITHUB_REPOSITORY}" ] \ && CD_PROJECT_NAME="$(basename "${GITHUB_REPOSITORY}")" if [ ! "${CD_PROJECT_NAME}" ] ; then echo 'CD_PROJECT_NAME' exit 3 fi # projects / group [ "${CI_PROJECT_PATH}" ] \ && CD_PROJECTS_GROUP="$(dirname "${CI_PROJECT_PATH}")" [ "${GITHUB_REPOSITORY}" ] \ && CD_PROJECTS_GROUP="$(dirname "${GITHUB_REPOSITORY}")" if [ ! "${CD_PROJECTS_GROUP}" ] ; then echo 'CD_PROJECTS_GROUP' exit 3 fi # projects / url [ "${CI_SERVER_URL}" ] && CD_PROJECTS_URL="${CI_SERVER_URL}" [ "${GITHUB_SERVER_URL}" ] && CD_PROJECTS_URL="${GITHUB_SERVER_URL}" if [ "${CD_PROJECTS_URL}" ] ; then CD_PROJECTS_URL="${CD_PROJECTS_URL}/${CD_PROJECTS_GROUP}" else echo 'CD_PROJECTS_URL' exit 3 fi # project / url CD_PROJECT_URL="${CD_PROJECTS_URL}/${CD_PROJECT_NAME}" } cd_write_environment () { cd_write "${CD_ENV}" "{ \"project\": { \"branch\": \"${CD_PROJECT_BRANCH}\", \"name\": \"${CD_PROJECT_NAME}\", \"url\": \"${CD_PROJECT_URL}\" }, \"projects\": { \"group\": \"${CD_PROJECTS_GROUP}\", \"url\": \"${CD_PROJECTS_URL}\" } } " cat "${CD_ENV}" } cd_step () { if [ "${1}" ] ; then CD_STEP=$((CD_STEP+1)) echo " ${CD_STEP} ${1} " fi } cd_write () { local file="${1}" local text="${2}" if [ "${file}" ] ; then echo -n "${text}" \ > "${file}" \ || exit fi } cd_set_dns_resolving () { local server local text='' cd_step "${FUNCNAME}" for server in "${@}" ; do text="${text}nameserver ${server} " done cd_write "${CD_DNS_FILE}" "${text}" } cd_set_packages_repositories () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_write '/etc/apt/sources.list' "\ deb https://deb.debian.org/debian bookworm main deb https://deb.debian.org/debian bookworm-backports main deb https://deb.debian.org/debian bookworm-updates main deb https://deb.debian.org/debian-security bookworm-security main " ;; *) exit 1 ;; esac } cd_set_packages_configuration () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') export DEBIAN_FRONTEND='noninteractive' cd_write '/etc/apt/apt.conf.d/apt.conf' "\ Acquire::Check-Valid-Until True; APT::Get::Show-Versions True; APT::Install-Recommends False; APT::Install-Suggests False; Dir::Etc::SourceParts \"\"; " ;; *) exit 1 ;; esac } cd_set_https_verification_off () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_write '/etc/apt/apt.conf.d/https' "\ Acquire::https::Verify-Peer False; " ;; *) exit 1 ;; esac } cd_update_packages_catalog () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') apt-get update || exit ;; *) exit 1 ;; esac } cd_install_package () { if [ "${1}" ] ; then case "${CD_OS_NAME}" in 'debian') apt-get install --yes "${1}" || exit ;; *) exit 1 ;; esac fi } cd_install_ca () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'ca-certificates' ;; *) exit 1 ;; esac } cd_install_git () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'git' ;; *) exit 1 ;; esac } cd_install_packages_tools () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'apt-utils' ;; *) exit 1 ;; esac } cd_install_python () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'python3' ;; *) exit 1 ;; esac } cd_set_https_verification_on () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') rm '/etc/apt/apt.conf.d/https' ;; *) exit 1 ;; esac } cd_upgrade_packages () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') apt-get upgrade --yes || exit ;; *) exit 1 ;; esac } cd_clean_packages_cache () { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') apt-get clean || exit ;; *) exit 1 ;; esac } cd_install () { local repository local root cd_step "${FUNCNAME}" root="$(mktemp --directory)" || exit for repository in "${@}" ; do git clone \ "${CD_PROJECTS_URL}/${repository}" "${root}/${repository}" \ || exit cp --recursive \ "${root}/${repository}/${repository}" "${CD_PYTHON_PACKAGES}" \ || exit done rm --force --recursive "${root}" || exit } cd_bootstrap () { cd_step "${FUNCNAME}" "${CD_PYTHON_COMMAND}" -m "${1}" } cd_main "${@}"