Установка PHP 7.4 с компиляцией модуля v8js на ubuntu 22

В README файлах официальных репозиториях V8 и V8JS достаточно информации по установке/компиляции компонентов для PHP 8+, но эти инструкции не работают для PHP 7.4.

Ниже, проверенная инструкция для установки из исходников V8 и компиляция модуля V8JS для PHP 7.4 на операционной системе Ubuntu 22

Получаем рут права:

sudo su

Обновляем компоненты ОС ubuntu 22, чтобы работать с самыми актуальными версиями пакетов :

apt-get update -y --fix-missing && apt-get upgrade -y;

Добавляем репозитория для установки PHP и модулей (так как в стандартных репозитория нету PHP 7.4):

add-apt-repository ppa:ondrej/php

Устанавливаем PHP 7.4 с стандартными модулями:

apt install php7.4 php7.4-fpm php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-mysql php7.4-mbstring php7.4-zip php7.4-curl php7.4-gd php7.4-xml php7.4-dev

Далее, устанавливаем инструмент для сборки программного обеспечения (V8)

apt install ninja-build

И другие, необходимые для сборки проекта V8, инструменты:

apt-get install -y --no-install-recommends \
    libtinfo5 libtinfo-dev \
    build-essential \
    curl \
    git \
    libglib2.0-dev \
    libxml2 \
    python2 \
    patchelf \
    && sudo ln -sf /usr/bin/python2.7 /usr/bin/python \
    && cd /tmp \
    \
    && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --progress --verbose \
    && export PATH="$PATH:/tmp/depot_tools" \
    \
    && fetch v8 \
    && cd v8 \
    && git checkout 8.9.255.25 \
    && gclient sync \
    \
    && tools/dev/v8gen.py -vv x64.release -- is_component_build=true use_custom_libcxx=false

В том числе Depot tools — набор утилит Гугла для сборки проектов (V8).

Из важного — используется не последняя версия V8 из репозитория, а версия 8.9.255.25

Процесс сборки представлен ниже:

export PATH="$PATH:/tmp/depot_tools" \
    && cd /tmp/v8 \
    && ninja -C out.gn/x64.release/ \
    && mkdir -p /opt/v8/lib && mkdir -p /opt/v8/include \
    && cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin out.gn/x64.release/icudtl.dat /opt/v8/lib/ \
    && cp -R include/* /opt/v8/include/ \
    && apt-get install patchelf \
    && for A in /opt/v8/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done

После этого, можем скачивать и компилировать модуль V8Js:

cd /tmp \
    && git clone https://github.com/phpv8/v8js.git \
    && cd v8js \
    && git reset --hard e648f43 \
    && git checkout  e648f43 \
    && phpize \
    && ./configure --with-v8js=/opt/v8 LDFLAGS="-lstdc++" CPPFLAGS="-DV8_COMPRESS_POINTERS" \
    && make \
    && make install

В результате успешного выполнения всех процедур будет файл v8js.so в папке /usr/lib/php/20190902

Необходимо добавить его в конфиги ini PHP:

cd /etc/php/7.4/cli/conf.d/

Создаем новый ini файл. Можно использовать любой редактор. В примере ниже используется nano:

nano 50-v8js.ini

Вводим всего одну строчку в свежем файле:

extension=v8js.so

И сохраняет этот файл.

Приступим к проверке работоспособности. Для этого переходим в любую временную папку на сервер и создаем тестовый php файл

cd /tmp
nano test_v8js.php

В который вставляем следующий PHP код, задействующий V8Js :

<?php
$v8js = new V8Js();
$JS = <<< EOT
  var s = 'Hello world';
  s;
EOT;
$r = $v8js->executeString($JS);
var_dump($r);

Сохраняем файл и запускаем:

php test_v8js.php

В случае успеха увидим вывод в консоли:

string(11) "Hello world"

Jenkins — git — собираем проект из приватного репозитория

Генерируем на целевом сервере SSH ключ

Чтобы Jenkins на нашем сервере смог получить доступ к коду из репозитория — необходимо сгенерировать приватный и публичный ключ и раздать их в соответствии с назначением.
Для генерации ключей, в терминате (консоли) сервера вводим команду

$ ssh-keygen

При этом видим предложение сгенерировать ключ по стандартному для этого случая пути

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user01/.ssh/id_rsa):

Рекомендуется выбирать дефолтный путь — жмем Enter, но вы можете и поменять путь.

Далее система попросит ввести passphrase. Для простоты можем оставить это поле пустым, как и следующее (подтверждающее ввод)

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Успешная генерация ключа сопровождается следующим выводом в консоли

Your identification has been saved in /Users/emmap1/.ssh/id_rsa.
Your public key has been saved in /Users/emmap1/.ssh/id_rsa.pub.
The key fingerprint is:
4c:80:61:2c:00:3f:9d:dc:08:41:2e:c0:cf:b9:17:69 emmap1@myhost.local
The key’s randomart image is:
+—[ RSA 2048]—-+
|*o+ooo.          |
|.+.=o+ .         |
|. *.* o .        |
| . = E o         |
|    o . S        |
|   . .           |
|     .           |
|                 |
|                 |
+——————+

Выведем сгенерированные файлы списком на экран

$ ls ~/.ssh
id_rsa id_rsa.pub

Выводится 2 файла:

id_rsa — приватный ключ, который понадобится нам для генерациия пользователя аутентификации в репозитории на cтороне Jenkins

id_rsa.pub — публичный ключ, который необходимо разместить в разделе access keys целевого репозитория

Добавляем публичный ключ в разделе ключей приватного репозитория

Например, в Bitbucket, публичный ключ можно добавить в разделе
Repository settingsAccess keysAdd key (настройки конкретного репозитория)

Добавляем приватный ключ в Jenkins

Заходим в раздел Управления Ключами (JenkinsManage JenkinsManage Credentials)

И добавляем приватный ключ (содержимое файла id_rsa.pub) в поле Private key, как проиллюстрировано ниже

Заполняем поле Username — имя для пользователя. Сохраняем.

Осталось подключится к репозиторию.

Перейдем в настройки ранее созданного проекта в Jenkins.

Source Code Management — выбираем Git (1)

Repositories — вставляем ссылку на репозиторий (2) и из выпадающего списка выбираем нашего только что созданного пользователя с приватным ключом (3)

Branches to build — обычно указывают мастер ветку — */master (4)

Сохраняем проект в Jenkins.

Теперь мы готовы собрать проект из приватного репозитория.