Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Действия

  1. Создайте и обновите новую VM

  2. Создайте новую зону по умолчанию

  3. Проверьте, что новая зона по умолчанию создалась правильно

  4. Создайте зону для получения зависимостей и получите зависимости

  5. Создайте новую зону для создания локального репозиторияПодготовьте окружение для создания новых зон

  6. Подготовьте скрип для получения зависимостей компонент

  7. Создайте зону для локального репозитроия

  8. Создайте в этой зоне локальны репозиторий

  9. Создайте новую зону для сборки компонентСоздайте новую зону для тестовой установки компонент

  10. Соберите компоненты

1. Создайте и обновите новую

...

VM

...

Для создания VM в vSphere SPB-LABS выполните шаги 1-5 из этой инструкции.

2. Залогиньтесь с правами root и

...

Для KVM используйте следующие инструкции:

  1. Настройка сети

  2. Создание зоны по умолчанию

Для VM в vSphere:

  1. Создайте mountpoint, куда будут монтироваться зоны:

...

подготовьте VM для созданиня зон

  1. Создайте mountpoint, куда будут монтироваться зоны:

Code Block
languagebash
root@dilos:~# zfs create -o mountpoint=/zones rpool/zones
root@dilos:~# mkdir /export/builds

...

Code Block
languagebash
cat > create_zone.sh <<SCRIPT
#!/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 2>&1 | /usr/bin/tee -a /var/tmp/${TYPE_ZONE}-bts.log
zoneadm -z \${TYPE_ZONE} install 2>&& zoneadm1 | /usr/bin/tee -z \a /var/tmp/${TYPE_ZONE}-bts.log
boot
zoneadm -z ${TYPE_ZONE} boot 2>&1 | /usr/bin/tee -a /var/tmp/${TYPE_ZONE}-bts.log
echo "127.0.0.1 localhost.\${TYPE_ZONE} \${TYPE_ZONE}" >> /zones/\${TYPE_ZONE}/root/etc/hosts
SCRIPT

Cделайте его выполняемым:

Code Block
languagebash
chmod 777 ./create_zone.sh

Info

Теперь Вы можете запустить его в формате ./create_zone.sh <zone-name> <zone-ip-domain> <zone-ip-node> , например!:

./create_zone.sh zone02 192.168.0 3

3. Получите зависимости

Обновите файл /etc/apt/sources.list :

Code Block
languagebash
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

Создайте папку для репозитория и перейдите туда:

Code Block
languagebash
mkdir -p /data/repo/pkg
cd /data/repo/pkg

Чтобы нижеприведённый скрипт заработал, Вам нужно создать файл list_component , содержимое которого можно взять отсюда.

Здесь же создайте скрипт для получения исходников и их зависимостей. Для этого скопируйте этот скрипт в файл, например, make_repo.sh или выполните следующую команду:

Code Block
languagebash
cat > make_repo.sh <<EOT
#!/bin/bash

#DEP_FILE=""
DEP_FILE="req.txt"
LOG_FILE=""
#LOG_FILE="errors.log"
function print_log {
  if [[ "\$LOG_FILE" != "" ]]; then
    echo "\$1" >> \$LOG_FILE
  fi
}

## Loop for get build components dependencies
echo "" > list_to_check
echo "" > final_list
sed -i '/^[ \\t]*\$/d' list_component
echo "" >> list_component
echo "" > temp
while read comp; do
  ## Skip empty line
  if [[ "" == "\$comp" ]]; then
    continue
  fi 
  echo -e "\\033[33m =====> Getting depends for \$comp... \\033[0m"
  res=\$(apt-rdepends --build-depends --follow=DEPENDS \$comp)
  echo "\$res" | grep 'Build-Depends:' > tmp
  echo "\$res" | grep 'Build-Depends-Indep:' >> tmp
  sed 's/^[ \\t]*Build-Depends:[ \\t]*//; s/^[ \\t]*Build-Depends-Indep:[ \\t]*//' tmp | sed 's/[ \\t]*(.*)res=$(grep -e 'WARNING:' -e 'warning:' -e 'W:' -e 'error:' -e 'E:' -e 'cannot' /var/tmp/${TYPE_ZONE}-bts.log | sort -u)
if [[ "$res" == "" ]]; then
  echo " =========== Zone ${TYPE_ZONE} is successfully created and ready to use ============="
else
  echo " =========== Zone ${TYPE_ZONE} creation log ============="
  echo "$res"
  echo "$res" | sed '/W: --force-yes is deprecated/d; /\/man\//d'
  if [[ "$res" != "" ]]; then
    echo " ========================================================"
    echo "Please stop and report about zone bootstrap errors!"
  fi
fi
SCRIPT

Cделайте его выполняемым:

Code Block
languagebash
chmod 777 ./create_zone.sh

Info

Теперь Вы можете запустить его в формате ./create_zone.sh <zone-name> <zone-ip-domain> <zone-ip-node> , например!:

./create_zone.sh zone02 192.168.0 3

3. Подготовьте скрипт для получения зависимостей

Обновите файл /etc/apt/sources.list :

Code Block
languagebash
cat > /etc/apt/sources.list <<EOT
deb http://10.20.50.188/dilos dg2-unstable main contrib non-free
deb http://10.20.50.188/dilos du2-unstable main contrib non-free
EOT
apt-get update

Создайте папку для репозитория и перейдите туда:

Code Block
languagebash
mkdir -p /data/repo/pkg
cd /data/repo/pkg

Чтобы нижеприведённый скрипт заработал, Вам нужно создать файл list_component , содержимое которого можно взять отсюда.

Здесь же создайте скрипт для получения исходников и их зависимостей. Для этого скопируйте этот скрипт в файл, например, make_repo.sh или выполните следующую команду:

Code Block
languagebash
cat > make_repo.sh <<EOT
#!/bin/bash

#DEP_FILE=""
DEP_FILE="req.txt"
LOG_FILE=""
#LOG_FILE="/export/home/admin/repo.log"
function print_log {
  if [[ "\$LOG_FILE" != "" ]]; then
    echo "\$1" >> \$LOG_FILE
  fi
}

## Loop for get build components dependencies
echo "" > list_to_check
echo "publicsuffix" > final_list
sed -i '/^[ \\t]*\$//d' >>list_component
tempecho "" >> rm -f tmp
 list_component
echo "" > temp
if [[ "\$DEP_FILE" != "" ]]; then 
    sedecho "s/^/\$comp:/g" temp >>> \$DEP_FILE
fi
while firead donecomp; <do
list_component  ## PreparationSkip empty ofline
initial list ofif dependencies[[ sort -u temp > list_to_check
sed -i '/^[ \\t]*\$/d' list_to_check
end=\$(cat list_to_check)
echo "" >> list_to_check

mkdir /data/repo/pkg/_tdir
apt-get -R /data/repo/pkg/_tdir update

## Loop for get packages dependencies
while [[ "\$end" != "" ]]; do"" == "\$comp" ]]; then
    continue
  fi 
  echo -e "\\033[33m =====> Getting depends for \$comp... \\033[0m"
  res=\$(apt-rdepends --build-depends --follow=DEPENDS \$comp)
  echo "\$res" | grep 'Build-Depends:' > tmp
  echo "\$res" >| temp
  while read comp; do
    ## Skip empty line
    if [[ "" == "\$compgrep 'Build-Depends-Indep:' >> tmp
  sed 's/^[ \\t]*Build-Depends:[ \\t]*//; s/^[ \\t]*Build-Depends-Indep:[ \\t]*//' tmp | sed 's/[ \\t]*(.*)[ \\t]*\$//' >> temp
  rm -f tmp
  if [[ "\$DEP_FILE" != "" ]]; then 
     continue
 sed "s/^/\$comp:/g" temp >> \$DEP_FILE
  fi
done < list_component

## SkipPreparation packagesof thatinitial arelist alreadyof checkeddependencies
forsort dependencies-u temp > list_to_check
 res=\$(grep "sed -i '/^[ \\t]*\$comp[ \\t]*\\\$" final_list)
    if [[ "" != "\$res$/d' list_to_check
end=\$(cat list_to_check)
echo "" >> list_to_check

mkdir /data/repo/pkg/_tdir
apt-get -R /data/repo/pkg/_tdir update

## Loop for get packages dependencies
while [[ "\$end" != "" ]]; thendo
  echo "" > temp
continue  while read comp; fido
    echo "=====> Getting depends for \$comp..."## Skip empty line
    if  apt-get -R /data/repo/pkg/_tdir install --dry-run \$comp | grep "^Inst " | sed 's/^Inst //; s/ .*\$//' >> temp
    ##apt-cache depends --no-pre-depends --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances apt-cache depends --no-pre-depends --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances \$comp | sed 's/^[ \t|]*Depends: //; /</d; s/^[ \\t]*//' | sed 's/^[ \\t|]*Depends: //; /</d; s/^[ \\t]*//' >> temp
    ## Add checked package to the list of already checked packages
    echo "\$comp" >> final_list
    if [[ "\$DEP_FILE" != "" ]]; then
      sed "s/^/\$comp:/g" temp >> $\DEP_FILE
    fi
  done < list_to_check

  ## Remove repeated records from the list
  sort -u temp > list_to_check
  ## Remove empty lines if any
  sed -i '[[ "" == "\$comp" ]]; then
      continue
    fi
    ## Skip packages that are already checked for dependencies
    res=\$(grep "^[ \\t]*\$comp[ \\t]*\\\$" final_list)
    if [[ "" != "\$res" ]]; then
      continue
    fi
    echo "=====> Getting depends for \$comp..."
    apt-get -R /data/repo/pkg/_tdir install --dry-run \$comp | grep "^Inst " | sed 's/^Inst //; s/ .*\$//' >> temp
    ##apt-cache depends --no-pre-depends --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances apt-cache depends --no-pre-depends --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances \$comp | sed 's/^[ \t|]*Depends: //; /</d; s/^[ \\t]*\$//d' list_to_check
 | sed -i 's/^[ \\t|]*\$Depends: //; /</d' final_list
  end=\$(cat list_to_check)
  echo "" >> list_to_check
done

## Loop for check and download dependencies
rmdir /data/repo/pkg/_tdir
sed -i '/^[ \\t]*\$/d' final_list
sort -u final_list > temp
mv -f temp final_list
echo "" >> final_list
rm -f; s/^[ \\t]*//' >> temp
    ## Add checked package to the list of already checked packages
    echo "\$comp" >> final_list
    if [[ "\$DEP_FILE" != "" ]]; then
      sed "s/^/\$comp:/g" temp >> \$DEP_FILE
    fi
  done < list_to_check
while
read pkg; do## Remove repeated if [[ "" == "\$pkg" ]]; then
    continue
  fi
  echo -e "\\033[36m =====> Check \$pkg... \\033[0m"
  ## Check if a package exists
  res=\$(apt-cache show \$pkg | grep "Package: \$pkg")
  if [[ "\$res" != "" ]]; then
    ## Download existed package
    echo -e "\\033[35m =====> Downloading package \$pkg... \\033[0m"
    res=\$(apt-get download \$pkg | grep 'E:' | sed -n 's/E://')
    if [[ "\$res" == "records from the list
  sort -u temp > list_to_check
  ## Remove empty lines if any
  sed -i '/^[ \\t]*\$/d' list_to_check
  sed -i '/^[ \\t]*\$/d' final_list
  end=\$(cat list_to_check)
  echo "" >> list_to_check
done

## Loop for check and download dependencies
rmdir --ignore-fail-on-non-empty /data/repo/pkg/_tdir
sed -i '/^[ \\t]*\$/d' final_list
sort -u final_list > temp
mv -f temp final_list
echo "" >> final_list
rm -f list_to_check
while read pkg; do
  if [[ "" == "\$pkg" ]]; then
    continue
 print_log "\$pkg : OK"
    else
   fi
   echo -e "\\033[31;1;4m \$res36m =====> Check \$pkg... \\033[0m"
  ## Check if  print_log "\$pkg: \$res"
   a package exists
  res=\$(apt-cache show \$pkg | grep "Package: \$pkg")
  if [[ "\$DEP_FILE$res" != "" ]]; then
    ## Download existed package
    echo -e "\\033[35m =======================================" >> errors.log
> Downloading package \$pkg... \\033[0m"
    res=\$(apt-get -R  echo "\$pkg: \$res" >> errors.log
/data/repo/pkg/_tdir download \$pkg | grep 'E:' | sed -n 's/E://')
    if [[  grep ":\$pkg$res" \$DEP_FILE >> errors.log
== "" ]]; then
     fi print_log "\$pkg : OK"
     fi
  else
  
 ## Put error message if package doesn't exist
    echo -e "\\033[31;1;4m \$pkg: No package found \\$res \\033[0m"
      print_log "\$pkg: No\$res"
package found"     if [[ "\$DEP_FILE" != "" ]]; then
        echo "=======================================" >> errors.log
        echo "\$pkg: No package found\$res" >> errors.log
        grep ":\$pkg" \$DEP_FILE >> errors.log
      fi     
    fi
  else
done < final_list  ## Downloading *.deb packagesPut error message if package doesn't exist
    echo -e "\\033[32;1m =====> Uploading *.deb packages... 31;1;4m\$pkg: No package found \\033[0m"
reprepro -b /data/repo --export=never -C main includedeb du2-prebuild /data/repo/pkg/*.deb

## Loop for download sources
while read component; do
   print_log "\$pkg: No package found"
    if [[ "\$DEP_FILE" !== "\$component" ]]; then
    continue   fi
  echo -e "\\033[33;1m "=======================================>" Downloading>> sourceserrors.log
for \$component... \\033[0m"   apt-get source --download-onlyecho \$component
 "\$pkg: No package found" >> errors.log
      grep ":\$pkg" \$DEP_FILE >> errors.log
    fi
  fi
done < final_list

## Downloading *.deb packages
echo -e "\\033[32;1m =====> Uploading sources for \$component*.deb packages... \\033[0m"

 reprepro -b /data/repo --export=never -C main includedscincludedeb du2-prebuild \$component*.dsc
  rm -rf \$component*
done < list_component

## Creating index for local repo/data/repo/pkg/*.deb

## Loop for download sources
while read component; do
  if [[ "" == "\$component" ]]; then
    continue
  fi
  echo -e "\\033[3233;1m =====> CreatingDownloading indicessources for local repo\$component... \\033[0m"
reprepro  apt-Vb /data/repo export du2-prebuildget source --download-only \$component
  echo -e "\\033[32;1m =====> DONE Uploading sources for \$component... \\033[0m"
if [[ "\$LOG_FILE" != "" ]]; then
  echo "Downloaded package list is put to \$LOG_FILE"
fi
EOT

Сделайте этот файл исполняемым:

Code Block
languagebash
chmod 777 ./make_repo.sh

Если Вы хотите получить лог с ошибками, то в строку LOG_FILE="" впишите имя файла, куда будет записываться сообщения о ходе выполнения, например:

Code Block
LOG_FILE="/export/admin/repo.log"

4. Создайте зону для локального репозитория

...

 reprepro -b /data/repo --export=never -C main includedsc du2-prebuild \$component*.dsc
  rm -rf \$component*
done < list_component

## Creating index for local repo
echo -e "\\033[32;1m =====> Creating indices for local repo... \\033[0m"
reprepro -Vb /data/repo export du2-prebuild
echo -e "\\033[32;1m =====> DONE \\033[0m"
if [[ "\$LOG_FILE" != "" ]]; then
  echo "Downloaded package list is put to \$LOG_FILE"
fi
EOT

Сделайте этот файл исполняемым:

Code Block
languagebash
cdchmod ~777 ./createmake_zone.sh zonerepo 192.168.0 2
zlogin zonerepo
Info

Команды ниже выполняются в зоне.

...

repo.sh

Если Вы хотите получить лог с ошибками, то в строку LOG_FILE="" впишите имя файла, куда будет записываться сообщения о ходе выполнения, например:

Code Block
LOG_FILE="/export/home/admin/repo.log"

4. Создайте зону для локального репозитория

Создайте зону и войдите в неё:

Code Block
languagebash
cat cd ~
./create_zone.sh zonerepo 192.168.0 2
zlogin zonerepo
Info

Команды ниже выполняются в зоне.

Обновите файл /etc/apt/sources.list:

Code Block
languagebash
cat > /etc/apt/sources.list <<EOT
deb http://apt10.20.dilos50.org188/dilos dg2-unstable main contrib non-free
deb http://apt10.20.dilos50.org188/dilos du2-unstable main contrib non-free
deb-src http://apt10.20.dilos50.org188/dilos du2-unstable main contrib non-free
EOT
apt-get update

Установите в зоне необходимые пакеты для работы репозитория:

Code Block
languagebash
apt-get install reprepro apache2 debhelper dpkg-dev dh-exec apt-rdepends screen -y
ln -s /data/repo /var/www/html/dilos
svcadm enable http
svcs http

Создайте директорию, где у вас будут лежать конфигурационные файлы для репозитория:

...

Workaround : Для создания локального репозитория нужен reprepro версии
Code Block
languagebash
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
Note

5.

...

mv /etc/apt/sources.list /etc/apt/sources.list.bak

cat > /etc/apt/sources.list <<EOT

deb http://apt.dilos.org/dilos du3-unstable main contrib non-free

EOT

apt-get update && apt-get install reprepro -y

mv /etc/apt/sources.list.bak /etc/apt/sources.list

apt-get update

Выполните эти команды для добавления пакетов и исходных файлов в репозиторий:

Code Block
languagebash
cd /data/repo/pkg
./make_repo.sh
exit

...

Выполните эти команды для добавления пакетов и исходных файлов в репозиторий:

Code Block
languagebash
cd /data/repo/pkg
./make_repo.sh
exit

Процедура создания репозитория может занять длительное время. Поэтому можно запустить скрипт при помощи утилиты screen.

Expand
titleЗапуск при помощи утилиты screen

Если Вы подключились по SSH и хотите отключиться от сессии SSH или отключить свой компьютер на время, то выполните следующую команду:

Code Block
screen ./make_repo.sh

Дальше в любой момент Вы можете нажать Ctrl-A d, после чего отключиться от сессии SSH.

Затем когда Вы захотите вернуться, залогиньтесь снова по SSH и введите команду:

Code Block
screen -r

6. Создайте новую зону для сборки компонент

Создайте зону и войдите в неё:

...

Code Block
languagebash
cat > prepare.sh <<EOT<<SCRPT
#!/bin/bash
WORKSPACE=/export/home/admin/du2

apt-get clean
apt-get autoclean
apt-get remove libiconv-dev -y

apt-getcat install -y acl iputils-ping kbd ksh scheduler system-data-console-fonts
apt-get install -y traceroute gmake build-essential man-db po-debconf po4a debhelper
apt-get install -y libx11-6 libxi6 libxtst6 liblua5.2-dev libnghttp2-dev libjansson-dev> /etc/apt/sources.list <<EOT
deb http://10.20.50.188/dilos dg2-unstable main contrib non-free
deb http://10.20.50.188/dilos du2-unstable main contrib non-free
deb-src http://10.20.50.188/dilos du2-unstable main contrib non-free
EOT
apt-get update -y

apt-get install -y mawkbison doxygen graphviz libdb-dev libgdbm-dev libsqlite3-dev libpq-devdh-exec cmake docbook-xml docbook-xsl libgtest-dev screenapt-get install -y acl iputils-ping kbd ksh scheduler system-data-console-fonts git
apt-get install -y bisontraceroute dh-exec cmake docbook-xml docbook-xsl libgtest-dev

/usr/bin/ln -fs libX11.so.6 /usr/gmake build-essential man-db po-debconf po4a debhelper
apt-get install -y libx11-6 libxi6 libxtst6 liblua5.2-dev libnghttp2-dev libjansson-dev
apt-get install -y mawk doxygen graphviz libdb-dev libgdbm-dev libsqlite3-dev libpq-dev

#/usr/bin/ln -fs libX11.so.6 /usr/lib/64/libX11.so.4
#/usr/bin/ln -fs libXi.so.6 /usr/lib/64/libXi.so.5
#/usr/bin/ln -fs libXtst.so.6 /usr/lib/64/libXtst.so.1

cp /etc/apt/sources.list /etc/apt/sources.list.bak
echo ""cat > /etc/apt/sources.list echo<<EOT
"deb [trusted=yes] http://192.168.0.2/dilos du2-prebuild main contrib non-free" >>
/etc/apt/sources.list
echo "deb-src [trusted=yes] http://192.168.0.2/dilos du2-prebuild main contrib non-free" 2>/dev/null >> /etc/apt/sources.list
EOT
cp /etc/apt/sources.list /etc/apt/sources.list.dev

apt-get update -y

test#test -f /var/lib/dpkg/lock && rm -f /var/lib/dpkg/lock
test#test -f /var/cache/apt/archives/lock && rm -f /var/cache/apt/archives/lock
dpkg#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
EOTSCRPT

Сделайте его исполняемым и запустите:

Code Block
languagebash
chmod 777 ./prepare.sh
./prepare.sh

...

7. Постройте компоненты

Скопируйте этот скрипт в файл, например, build_all.sh или выполните команду:

Code Block
languagebash
cat > build_all.sh <<EOT
#!/bin/bash

BLD_PARALLEL="4"
WORKSPACE=/export/home/admin/du2

#STOP_ON_ERROR=1
STOP_ON_ERROR=0

while read COMP; do
  if [[ "" == "\$COMP" ]]; then
    continue
  fi./build_all.sh#GCC_COMPILER="gcc-6"
GCC_COMPILER=""

# Build a component: \$1 - component name, \$2 - stop-on-error flag
function build_component {
  local START_TIME
  local END_TIME
  local BLD_RESULT

  BLD_RESULT="/data/repo/du/\$COMP$1"
  test -z "\$COMP$1" && exit 1
  test -d \${BLD_RESULT} && rm -rf \${BLD_RESULT}
   if [[ "$COMP" == "bind9" ]]; then
    cp /etc/apt/sources.list.dev /etc/apt/sources.list
    apt-get update
    apt-get install -y libssl1.0-dev
    cp /etc/apt/sources.list.bak /etc/apt/sources.list
    apt-get update
  fi
#  apt-get update && apt-get upgrade -y || exit 1
#  apt-get install -y build-essential illumos-dev dpkg-dev gmake || exit 1

  DEB_BUILD_OPTIONS="nocheck notest parallel=\${BLD_PARALLEL}"
  export DEB_BUILD_OPTIONS

  test -d \${WORKSPACE}/\$COMP && rm -rf \${WORKSPACE}/\$COMP

  mkdir -p \${WORKSPACE}/\$COMP
  cd \${WORKSPACE}/\$COMP
  echo "====================== \$COMP ======================"  | tee berror.log
  if [[ \$STOP_ON_ERROR -eq 0 ]]; then
    apt-get build-dep -y \$COMP >> berror.log || continue 2>&1
    apt-get source --compile \$COMP >> berror.log || continue 2>&1
  else
    apt-get build-dep -y \$COMP >> berror.log || exit 1 2>&1
    #DEB_BUILD_OPTIONS="nocheck notest parallel=4" apt-get source --compile \$COMP || exit 1
    apt-get source --compile \$COMP >> berror.log || exit 1 2>&1
  fi

  mkdir -p \${BLD_RESULT}
  cp -ax *.deb \${BLD_RESULT}/ || exit 1
  cp -ax *.changes \${BLD_RESULT}/ || exit 1
  cp -ax *.buildinfo \${BLD_RESULT}/ || exit 1
done < /data/repo/pkg/list_component
EOT

Если Вы хотите, чтобы пстроение закончилось после первой же ошибки, присвойте 1 переменной STOP_ON_ERROR STOP_ON_ERROR=1. В противном случае скрипт будет строить все компоненты по-очереди, независимо от ошибок. При этом в директории каждого компонента будет создаваться файл berror.log, где вы сможете увидеть ошибки построения.

Сделайте файл выполняемым и запустите его:

Code Block
languagebash
chmod 777 ./build_all.sh
./build_all.sh
DEB_BUILD_OPTIONS="nocheck notest parallel=\${BLD_PARALLEL}"
  export DEB_BUILD_OPTIONS
  test -d \${WORKSPACE}/\$1 && rm -rf \${WORKSPACE}/\$1
  mkdir -p \${WORKSPACE}/\$1
  cd \${WORKSPACE}/\$1
  START_TIME=\$(date +%s)
  echo "====================== \$1 ======================"  | tee berror.log
  if [[ \$2 -eq 0 ]]; then
    apt-get build-dep -y \$1 >> berror.log || return 0 2>&1
    apt-get source --compile \$1 >> berror.log || return 0 2>&1
  else
    apt-get build-dep -y \$1 >> berror.log || return 1 2>&1
    apt-get source --compile \$1 >> berror.log || return 1 2>&1
  fi
  END_TIME=\$(date +%s)
  printf "%06d %s\\n" \$((\${END_TIME} - \${START_TIME})) \$1 >> \${WORKSPACE}/tmpbt.log
  mkdir -p \${BLD_RESULT}
  cp -ax *.deb \${BLD_RESULT}/ || exit 1
  cp -ax *.changes \${BLD_RESULT}/ || exit 1
  cp -ax *.buildinfo \${BLD_RESULT}/ || exit 1
}

if [[ "\$GCC_COMPILER" != "" ]]; then
  echo "====================== Building GCC ======================"
  build_component \$GCC_COMPILER 1
  if [[ \$? -eq 1 ]]; then
    exit 1
  fi
  dpkg -i \$WORKSPACE/\$GCC_COMPILER/*.deb
fi
if [[ ! -f \$WORKSPACE/build_components ]]; then
  cp /data/repo/pkg/list_component \$WORKSPACE/build_components
fi
rm -f tmpbt.log
while read COMP; do
  if [[ "" == "\$COMP" ]] || [[ "\$GCC_COMPILER" == "\$COMP" ]]; then
    continue
  fi
  build_component \$COMP \$STOP_ON_ERROR
  if [[ \$? -eq 1 ]]; then
    exit 1
  fi
done < \$WORKSPACE/build_components
sort tmpbt.log > build_components
sed -i 's/^[0-9]* //g' build_components
EOT

Если Вы хотите, чтобы пстроение закончилось после первой же ошибки, присвойте 1 переменной STOP_ON_ERROR STOP_ON_ERROR=1. В противном случае скрипт будет строить все компоненты по-очереди, независимо от ошибок. При этом в директории каждого компонента будет создаваться файл berror.log, где вы сможете увидеть ошибки построения.

Сделайте файл выполняемым и запустите его:

Code Block
languagebash
chmod 777 ./build_all.sh
./build_all.sh

Построение компонент может занять длительное время. Поэтому можно запустить скрипт при помощи утилиты screen.

Expand
titleЗапуск при помощи утилиты screen

Если Вы подключились по SSH и хотите отключиться от сессии SSH или отключить свой компьютер на время, то выполните следующую команду:

Code Block
screen ./build_all.sh

Дальше в любой момент Вы можете нажать Ctrl-A d, после чего отключиться от сессии SSH.

Затем когда Вы захотите вернуться, залогиньтесь снова по SSH и введите команду:

Code Block
screen -r

Если Вы запустили построение всех компонент, то проверить, какие компоненты не построились, можно, выполнив команды:

Code Block
languagebash
cat > check_fails.sh <<EOT
#!/bin/bash

#WDIR=\$1
WDIR=/export/home/admin/du2

subdirs=\$(ls -1 \$WDIR)

for dr in \$subdirs
do
  res=\$(tail -1 \$WDIR/\$dr/berror.log)
  if [[ "\$(echo \$res | grep 'Fetched')" == "" ]]; then
    cat \$WDIR/\$dr/berror.log
  fi
done
echo ""
echo "================= Local repo sources"
cat /etc/apt/sources.list
EOT
chmod 777 ./check_fails.sh
./check_fails.sh
Info

Note : Если Вам нужно сначала собрать компилятор GCC и провести построение при его помощи, то укажите имя компоненты компилятора в переменной GCC_COMPILER, например:

GCC_COMPILER="gcc-6". Его точное имя можно посмотреть в файле list_component.

После сборки компонент Вы можете проверить их установку в отдельной новой зоне.

...