Настройка тестирующего сервера - 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 '{}' \;