Настройка тестирующего сервера - LernaProject/Lerna GitHub Wiki

На тестирующую машину требуется установить пропатченное ядро Linux. Конфиги для сборки следует брать с машины, предназначенной для тестирования. Версия 4.1.32 без проблем собирается и работает с конфигами Ubuntu 16.04 x64, однако при попытке поставить 4.7.4 система стала виснуть при выключении. Так что другие комбинации ядро+дистрибутив рекомендуется сначала проверить на виртуальной/локальной машине.

Сборка ядра в четыре потока занимает примерно полтора часа.

Ниже описана примерная последовательность действий для приведения системы в состояние готовности:

# Под Рутом:
# Обновляем списки пакетов.
apt update
# Поскольку у нас все равно кастомное ядро, не имеет смысла обновлять его из репозиториев Ubuntu.
# Фиксируем текущую версию и запрещаем автообновление.
apt-mark hold linux-generic linux-headers-generic linux-image-generic
# Обновляем все пакеты.
apt dist-upgrade
# Иногда после крупных обновлений надо перезагрузить машину. Об этом пишет при логине.
reboot
# Удаляем ставшие ненужными пакеты.
apt autoremove
# Устанавливаем Friendly Interactive Shell.
apt install fish
# Создаем пользователей.
groupadd dev
useradd -ms/usr/bin/fish -gdev -Gsudo sovictor
useradd -ms/usr/bin/fish -gdev -Gsudo viers
useradd -ms/usr/bin/fish -gdev -Gsudo nickolas
passwd sovictor
passwd viers
passwd nickolas
# Блокируем доступ в домашние каталоги пользователей кому попало.
chmod 700 /home/*
# Создаем файлы с настройками VCS по умолчанию.
cat <<EOF >>/etc/gitconfig
[core]
    autocrlf = input
    safecrlf = true

[push]
    default = simple
EOF
cat <<EOF >>/etc/mercurial/hgrc

[extensions]
eol =
EOF
# Убираем возможность логиниться под Рутом.
passwd -l root
exit

# Устанавливаем пропатченное ядро (необходимо для ejudge-execute).
sudo dpkg -i ~/linux-*.deb
# Смотрим, под каким номером оно прописалось.
view /boot/grub/grub.cfg
# И задаем его как ядро по умолчанию (GRUB_DEFAULT).
sudo -e /etc/default/grub
sudo update-grub
# Загружаемся в новое ядро.
sudo reboot

# Создаем пользователя, под которым будет запускаться скрипт тестирования.
sudo useradd -ms/usr/bin/fish -gdev tester
sudo passwd tester
# Разрешаем группе писать в его домашний каталог.
sudo chmod 770 ~tester
# Создаем недо-пользователя, под которым будут запускаться решения.
sudo useradd -Mgnogroup -s/usr/sbin/nologin invoker
# И рабочие директории.
mkdir -m777 /tmp/run.{0,1,2}
# Разрешаем тестеру выполнять любые действия из-под invoker'а.
echo 'tester ALL = (invoker) NOPASSWD: ALL' | sudo tee -a /etc/sudoers.d/tester >/dev/null

cd ~tester

# Ставим много вкусного.
sudo apt install \
    python3-pip python3-venv postgresql postgresql-server-dev-9.5 git mercurial screen \
    g++ mono-mcs default-jdk-headless fp-compiler gfortran ruby gawk checkinstall \
    libstdc++6:i386 wine p7zip-full p7zip-rar lynx tree
# Обновляем менеджер пакетов Python.
sudo -H pip3 install -U pip setuptools

mkdir 3rd
pushd 3rd
    # Собираем ejudge. (Из всего комплекта его программ нам нужен только ejudge-execute).
    sudo apt install uuid-dev libelf-dev bison flex libncurses5-dev libncursesw5-dev
    git clone git://github.com/blackav/ejudge
    pushd ejudge
        git checkout `git tag | tail -n1`
        ./configure --prefix=/usr/local --disable-nls
        make # Ключ -j приводит к мистическим фейлам при сборке.
        sudo checkinstall
        make clean
    popd

    # Скачиваем testlib.
    git clone git://github.com/MikeMirzayanov/testlib
    pushd testlib
        git checkout `git tag | tail -n1`
    popd

    # Ставим DMD - эталонный компилятор D.
    DMD_VERSION=2.072.0
    DMD_PACKAGE=dmd_$DMD_VERSION-0_amd64.deb
    wget http://downloads.dlang.org/releases/2.x/$DMD_VERSION/$DMD_PACKAGE
    sudo apt install xdg-utils
    sudo dpkg -i $DMD_PACKAGE
    # Качаем LDC - оптимизирующий компилятор D.
    git clone --recursive git://github.com/ldc-developers/ldc
    sudo apt install cmake llvm-dev libconfig-dev
    pushd ldc
        git checkout v1.0.0
        git submodule update --recursive
        # Собираем его из исходников. Для этого должен уже иметься какой-нибудь компилятор D.
        mkdir ldc-dev-1.0.0
        cd ldc-dev-1.0.0
        cmake ..
        make -j4
        sudo checkinstall
        # Удаляем артефакты сборки.
        cd ..
        sudo rm -rf ldc-dev-1.0.0
        # А теперь проделываем все это еще раз.
        # При сборке LDC второго поколения будет использоваться LDC первого.
        mkdir ldc-dev-1.0.0
        cd ldc-dev-1.0.0
        cmake ..
        make -j4
        sudo checkinstall
        # Удаляем артефакты сборки. Это освободит порядка 600 MB на диске.
        cd ..
        sudo rm -rf ldc-dev-1.0.0
    popd
    # Теперь у нас есть LDC, и DMD можно было бы удалить.
    # sudo dpkg -r dmd
popd

# Создаем виртуальное окружение, которое будет использоваться для запуска посылок на Python.
sudo python3 -mvenv /opt/py3venv

# Клонируем репозитории проекта.
git clone git://github.com/SirNickolas/Lerna.Checkers checkers
pushd checkers
    ./make.py
popd
git clone git://github.com/SoVictor/Lerna lerna
pushd lerna
    sudo -H pip3 install -Urrequirements.txt
    cp lerna/local_settings.py.template lerna/local_settings.py
    vim lerna/local_settings.py
popd
hg clone https://bitbucket.org/olympictusur/problems
# Настраиваем Ruby для работы со старым скриптом тестилки Олимпика.
sudo apt install ruby-dev
sudo gem install bundle
hg clone https://bitbucket.org/olympictusur/trunk
pushd trunk
    bundle install
popd

# Настраиваем PostgreSQL.
sudo -u postgres psql <<EOF
ALTER USER postgres PASSWORD 'topsecret';
CREATE USER hydra PASSWORD 'secret';
CREATE DATABASE lerna OWNER hydra;
EOF
sed -i 's/OWNER TO admin/OWNER TO hydra/g' dump.sql
psql -hlocalhost lerna hydra < dump.sql
# TODO: Сгенерировать SSH-ключи для BitBucket и GitHub, настроить crontab...
# To be continued...

# Фиксим права файлов.
sudo chown -R tester:dev ~tester
sudo find ~tester -perm /g+r -exec chmod g+w '{}' \;
⚠️ **GitHub.com Fallback** ⚠️