Действия
Создайте и обновите новую VM
Создайте новую зону по умолчанию
Проверьте, что новая зона по умолчанию создалась правильно
Создайте зону для получения зависимостей и получите зависимости
Создайте новую зону для создания локального репозитория
Создайте новую зону для сборки компонент
Создайте новую зону для тестовой установки компонент
1. Создайте и обновите новую VM
Для создания новой VM в vmware/virtualbox/kvm воспользуйтесь этой инструкцией.
Для создания VM в vSphere SPB-LABS выполните шаги 1-5 из этой инструкции.
2. Залогиньтесь с правами root и создайте новую зону по умолчанию
Для KVM используйте следующие инструкции:
Для VM в vSphere:
Создайте mountpoint, куда будут монтироваться зоны:
root@dilos:~# zfs create -o mountpoint=/zones rpool/zones root@dilos:~# mkdir /export/builds root@dilos:~# apt install reprepro
2. Добавьте пользователя admin:
root@dilos:~# useradd -m -g staff admin root@dilos:~# passwd admin Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully root@dilos:~# echo "admin ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers.d/admin
3. Выполните Инструкцию по настройке сети до шага, на котором создаётся зона zone01
.
4. Создайте зону default
, выполнив следующие команды:
root@dilos:~# cat > defzone.cmd <<EOT create set zonename=default set zonepath=/zones/default set autoboot=false set ip-type=exclusive add net set physical=iz1 set global-nic=vsw0 add property (name=ip,value="192.168.0.1") add property (name=gateway,value="192.168.0.254") add property (name=netmask,value="255.255.255.0") add property (name=primary,value="true") end add attr set name=resolvers set type=string set value=8.8.8.8 end add fs set dir=/export/home/admin set special=/export/home/admin set type=lofs end add fs set dir=/export/builds set special=/export/builds set type=lofs end commit verify exit EOT zonecfg -z default -f defzone.cmd
Для установки зоны по умолчанию выполните:
zoneadm -z default install
Для автоматизации создания остальных зон и входа в них можно использовать скрипт из Jenkins:
#!/bin/bash TYPE_ZONE=$1 IP=$2 SER=$3 cat > ${HOME}/${TYPE_ZONE}.cmd <<EOT create set zonename=${TYPE_ZONE} set zonepath=/zones/${TYPE_ZONE} set autoboot=false set ip-type=exclusive add net set physical=iz${SER} set global-nic=vsw0 add property (name=ip,value="${IP}.${SER}") add property (name=gateway,value="${IP}.254") add property (name=netmask,value="255.255.255.0") add property (name=primary,value="true") end add attr set name=resolvers set type=string set value=8.8.8.8 end add fs set dir="/export/home/admin" set special="/export/home/admin" set type="lofs" end add fs set dir="/export/builds" set special="/export/builds" set type="lofs" end add fs set dir="/data/repo" set special="/data/repo" set type="lofs" end verify commit exit EOT zonecfg -z ${TYPE_ZONE} -f ${HOME}/${TYPE_ZONE}.cmd zoneadm -z ${TYPE_ZONE} install zoneadm -z ${TYPE_ZONE} boot sleep 10 zlogin ${TYPE_ZONE}
Для этого скопируйте этот код в файл, например, create_zone.sh
и сделайте его выполняемым:
chmod 777 ./create_zone.sh
Теперь Вы можете запустить его в формате ./create_zone.sh <zone-name> <zone-ip-domain> <zone-ip-node>
, например!:
./create_zone.sh zone02 192.168.0 3
3. Создайте зону для получения зависимостей и получите зависимости
Создайте папку для репозитория:
mkdir -p /data/repo mkdir -p /data/repo/pkg
Создайте зону и войдите в неё:
./create_zone.sh zonedep 192.168.0 2
Команды ниже выполняются в зоне.
Обновите файл /etc/apt/sources.list
:
cat > /etc/apt/sources.list <<EOT deb http://apt.dilos.org/dilos dg2-unstable main contrib non-free deb http://apt.dilos.org/dilos du2-unstable main contrib non-free EOT apt-get update
Для удобства сбор зависимостей выполняется в директории /data/repo/pkg
:
cd /data/repo/pkg
Чтобы нижеприведённый скрипт заработал, Вам нужно создать два файла (текущее содержимое их можно получить по ссылкам ниже):
list_component
- список компонентlist_pkg_sec
- список для построения компонент
Теперь получите зависимости. Для этого создайте файл, например, get_deps.sh
и сделайте его исполняемым:
cat > get_deps.sh <<EOT #!/bin/bash #File create for save temporary values >list_one >list_two >pkg_dep >tmp0 >tmp1 >tmp # function get_depends() { ## This function get depends for build component [ -z "\$(grep -f pkg_dep <<< \$1)" ] && apt-get install -s \$1 2>/dev/null | grep Inst | awk '{print \$2}'| sort -u && echo \$pkg >> pkg_dep } # # function all_dep() { ##This recursion function for get recursion depends for build conmponents for pkg in \$@; do all_dep \$(get_depends \$pkg) done } ## Loop for get depends for build components while read component; do if [[ "" == "\$component" ]]; then continue fi apt-get --dry-run build-dep \$component 2>/dev/null | grep Inst | awk '{print \$2}' >> list_one done < list_component while read pkg; do if [[ "" == "\$pkg" ]]; then continue fi apt-get install -s \$pkg 2>/dev/null | grep Inst | awk '{print \$2}' >> list_two done < list_pkg_sec cat list_one >> tmp0 cat list_two >> tmp0 cat list_component >> tmp0 cat list_pkg_sec >> tmp0 cat tmp0 | sort -u >> tmp1 ## Loop for get depends, use function 'all_dep' while read pkg; do if [[ "" == "\$pkg" ]]; then continue fi all_dep \$pkg >/dev/null done < tmp1 cat pkg_dep >> tmp1 cat tmp1 | sort -u >> tmp while read pkg; do if [[ "" == "\$pkg" ]]; then continue fi sudo apt-get download \$pkg done < tmp EOT chmod 777 ./get_deps.sh
Запустите его:
./get_deps.sh exit
4. Создайте новую зону для создания локального репозитория
Создайте зону и войдите в неё:
./create_zone.sh zonerepo 192.168.0 3
Команды ниже выполняются в зоне.
Обновите файл /etc/apt/sources.list
:
cat > /etc/apt/sources.list <<EOT deb http://apt.dilos.org/dilos dg2-unstable main contrib non-free deb http://apt.dilos.org/dilos du2-unstable main contrib non-free deb-src http://apt.dilos.org/dilos du2-unstable main contrib non-free EOT apt-get update
Установите в зоне необходимые пакеты для работы репозитория:
apt-get install reprepro -y apt-get install apache2 -y apt-get install dpkg-dev -y ln -s /data/repo /var/www/html/dilos svcadm enable http svcs http
Создайте директорию, где у вас буду лежать конфигурационные файлы для репозитория:
mkdir -p /data/repo/conf
и создайте конфигурационный файл репозитория:
echo -n "Codename: du2-prebuild Suite: prebuild Version: 2.0 Origin: DilOS Label: DilOS prebuild Description: DilOS Prebuild Repository Architectures: solaris-i386 solaris-sparc source Components: main contrib non-free ##SignWith: default DebIndices: Packages Release . .gz .bz2 .xz DscIndices: Sources Release . .gz .bz2 .xz Contents: . .gz .bz2 .xz " > /data/repo/conf/distributions
Выполните эти команды для добавления пакетов *.deb
в репозиторий:
reprepro -b /data/repo -C main includedeb du2-prebuild /data/repo/pkg/*.deb reprepro -Vb /data/repo export du2-prebuild
Получите исходные файлы для локального репозитория, для чего создайте файл, например, get_sources.sh
и сделайте его исполняемым (для работы скрипта требуется установленный пакет dpkg-dev):
cat > get_sources.sh <<EOT #!/bin/bash COMPONENTS='main' CODENAME='du2-prebuild' while read component; do if [[ "" == "\$component" ]]; then continue fi apt-get source --download-only \$component reprepro -b /data/repo -C \$COMPONENTS includedsc \$CODENAME \$component*.dsc rm -rf \$component done < /data/repo/pkg/list_component EOT chmod 777 ./get_sources.sh
Теперь запустите его:
./get_sources.sh exit
5. Создайте новую зону для сборки компонент
Создайте зону и войдите в неё:
./create_zone.sh zonebld 192.168.0 4
Команды ниже выполняются в зоне.
Подготовьте зону для сборки компонент. Для этого создайте файл, например, prepare.sh
и сделайте его исполняемым:
cat > prepare.sh <<EOT apt-get clean apt-get autoclean apt-get remove libiconv-dev -y APTLIST="/tmp/apt_sources.list" APTLISTETC="/etc/apt/sources.list" echo "" > \$APTLIST echo "deb [trusted=yes] http://192.168.0.3/dilos du2-prebuild main contrib non-free" >> \$APTLIST echo "deb-src [trusted=yes] http://192.168.0.3/dilos du2-prebuild main contrib non-free" 2>/dev/null >> \$APTLIST mv \$APTLIST \$APTLISTETC apt-get update -y test -f /var/lib/dpkg/lock && rm -f /var/lib/dpkg/lock test -f /var/cache/apt/archives/lock && rm -f /var/cache/apt/archives/lock dpkg --configure -a rm -rf \${WORKSPACE} && mkdir -p \${WORKSPACE} apt-get upgrade -y env DEBIAN_FRONTEND=noninteractive apt-get install -y -f env DEBIAN_FRONTEND=noninteractive apt-get install -y git openssh-server oracle-jdk EOT chmod 777 ./prepare.sh
Запустите:
./prepare.sh
6. Постройте компоненты
Эти переменные зарегистрированы в Jenkins:
{WORKSPACE}
{COMPONENT}
{JOBS}
В нашем случае в скрипте нужно объявить три переменные
Создайте файл, например, build_all.sh
и сделайте его выполняемым:
cat > build_all.sh <<EOT #!/bin/bash COMPONENT=$1; WORKDIR=/export/home/admin; WORKSPACE=${WORKDIR}/du2; JOBS=4; umask 022 export CCACHE_DISABLE="true" echo '===================== ENVIRONMENT ==================' env echo '===================== GET SOURCES ==================' test -L /etc/dpkg/origins/default || sudo ln -fs dilos /etc/dpkg/origins/dilos test -f /usr/bin/gmake || sudo ln -fs make /usr/bin/gmake git clone https://bitbucket.org/dilos/du2.git ${WORKSPACE} echo '===================== GET PACKAGES ==================' cd ${WORKDIR} export DEB_BUILD_OPTIONS="parallel= 2" sudo -E apt-get update sudo apt-get install -y acl iputils-ping kbd ksh scheduler system-data-console-fonts traceroute gmake build-essential DEBIAN_FRONTEND=nkvmoninteractive sudo -E apt-get install -f -y DEBIAN_FRONTEND=noninteractive sudo -E apt-get upgrade -y if ! getent group shadow | grep -q '^shadow:[^:]*:42' then sudo -E groupadd -g 42 shadow fi test -L /usr/lib/jvm/default-java || sudo -E /usr/bin/ln -fs oracle-default-jdk /usr/lib/jvm/default-java sudo -E apt-get install -y libx11-6 libxi6 libxtst6 sudo -E /usr/bin/ln -fs libX11.so.6 /usr/lib/64/libX11.so.4 sudo -E /usr/bin/ln -fs libXi.so.6 /usr/lib/64/libXi.so.5 sudo -E /usr/bin/ln -fs libXtst.so.6 /usr/lib/64/libXtst.so.1 echo '===================== BUILD ${COMPONENT} ==================' #test -d ${WORKSPACE}/components/${COMPONENT} || exit 1 cd "${WORKSPACE}/du2/components/${COMPONENT}" sudo -E mkdir -p /data/repo/${COMPONENT} BLD_COMPONENT=${COMPONENT}-$(date '+%Y-%m-%d') BUILD_RESULT=/data/repo/${COMPONENT} export COMPONENT_RESULT=`echo ${BLD_COMPONENT} | sed -e 's;/;-;'` sudo -E /usr/bin/rm -rf ${BUILD_RESULT}/du/${COMPONENT_RESULT} mkdir -p ${BUILD_RESULT}/du/${COMPONENT_RESULT} 2>/dev/null sudo -E gmake JOBS=${JOBS} WS_DEBS=${BUILD_RESULT}/du/${COMPONENT_RESULT} deb RES=$? echo '===================== BUILD DEBCLOBBER ==================' sudo -E gmake debclobber if (( $RES > 0 )); then echo "===================== ERROR : ${RES} ==================" exit 1 fi echo '===================== DONE ==================' EOT chmod 777 ./build_all.sh
Запустите его (на место {COMPONENT}
надо поставить имя компоненты из списка для сборки):
./build_all.sh {COMPONENT}
После сборки компонент Вы можете проверить их установку в отдельной новой зоне.