#! /usr/bin/env bash CD_DNS_SERVERS=( '9.9.9.9' ) CD_NAME='cd' CD_PROJECTS_PARENT='rwx' function 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_GROUP}" else echo 'CD_PROJECTS_URL' exit 3 fi # project / url CD_PROJECT_URL="${CD_PROJECTS_URL}/${CD_PROJECT_NAME}" } function 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}" } function cd_step { if [ "${1}" ] ; then CD_STEP=$((CD_STEP+1)) echo " ↕ ${CD_STEP} ↔ ${1} " fi } function cd_write { local file="${1}" local text="${2}" if [ "${file}" ] ; then echo -n "${text}" \ > "${file}" \ || exit fi } function cd_set_dns_resolving { local server local text='' cd_step "${FUNCNAME}" for server in "${CD_DNS_SERVERS[@]}" ; do text+="nameserver ${server} " done cd_write "${CD_DNS_FILE}" "${text}" } function 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 } function 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 } function 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 } function cd_update_packages_catalog { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') apt-get update || exit ;; *) exit 1 ;; esac } function cd_install_package { if [ "${1}" ] ; then case "${CD_OS_NAME}" in 'debian') apt-get install --yes "${1}" || exit ;; *) exit 1 ;; esac fi } function cd_install_ca { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'ca-certificates' ;; *) exit 1 ;; esac } function cd_install_git { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'git' ;; *) exit 1 ;; esac } function cd_install_packages_tools { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'apt-utils' ;; *) exit 1 ;; esac } function cd_install_python { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') cd_install_package 'python3' ;; *) exit 1 ;; esac } function cd_set_https_verification_on { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') rm '/etc/apt/apt.conf.d/https' ;; *) exit 1 ;; esac } function cd_upgrade_packages { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') apt-get upgrade --yes || exit ;; *) exit 1 ;; esac } function cd_clean_packages_cache { cd_step "${FUNCNAME}" case "${CD_OS_NAME}" in 'debian') apt-get clean || exit ;; *) exit 1 ;; esac } function cd_install { local repository local root cd_step "${FUNCNAME}" root="$(mktemp --directory)" || exit for repository in \ "${CD_PROJECTS_PARENT}" \ "${CD_NAME}" \ ; 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 } function cd_bootstrap { cd_step "${FUNCNAME}" "${CD_PYTHON_COMMAND}" -m "${CD_NAME}" } function cd_main { cd_set_environment cd_write_environment cd_set_dns_resolving 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_main