Установка или обновление Jenkins — ошибка пермишенов при сборке — запуск сервиса Jenkins от юзера

Jenkins update

При установке и обновлении Jenkins, сервис в Linux стартуется от лица стандартного пользователя «jenkins», что может приводить к ошибкам вида «wrong permissions» или подобным на фазе отработки процесса сборки проекта.

Особенно это актуально, когда идет сборка на основе репозитория и права на папке проекта принадлежат определенному пользователю. Например, ec2-user для амазонских линуксов, или ubuntu — для убунту, соответственно.

В таком случае, требуется запускать сервис Jenkins от иного пользователя, а не стандартного. И нужно сделать следующее:

  • Находим конфигурационный файл запуска сервиса Jenkins
systemctl status jenkins

и находим путь к конфигу, смотрите скриншот ниже

Jenkins status 01
jenkins status 02
  • Стопаем Jenkins и редактируем User and Group в конфиг-файле.

В случае примера со второго скрина — основной конфигурации имеет под-конфиг, в поле JENKINS_CONFIG (JENKINS_CONFIG=/etc/sysconfig/jenkins)

systemctl stop jenkins
# путь к конфигу ниже берем из подхода, описанного выше
nano /usr/lib/systemd/system/jenkins.service

Комментируем текущие User and Group и вставляем необходимые, сохраняем файл

#User=jenkins
#Group=jenkins
User=ec2-user
Group=ec2-user
  • Кроме этого, нужно назначить права на папку с jenkins для этого пользователя.

Обычно Jenkins устанавливается по пути /var/lib/jenkins/ :

chown -R ec2-user:ec2-user /var/lib/jenkins/
  • Все готово для старта сервиса Jenkins:
systemctl start jenkins

В интерфейсе Дженкинса можно проверить, что новый юзер «применился»:

Manage Jenkins -> System Information -> Environment Variables
поле — USER

Установка 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"

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

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

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

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

sudo su

Обновляем операционную систему, чтобы работать с самыми актуальными версиями пакетов и ПО:

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

Устанавливаем 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 \
    python \
    patchelf \
    && 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"

Установка скомпилированной версии v8js в Ubuntu или CentOS для server-side rendering

  • Скачаем архив со скомпилированной версией расширения v8js.so

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

> sudo su
  • Создаем временную папку для скачивания и заходим в нее
# mkdir -p /opt/google
# cd /opt/google
  • Сохраняем архив с расширением для рендеринга на серверной стороне
# wget https://blog.bayrell.org/media/files/archives/v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Распаковываем архив тут же
# tar xvf v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Далее необходимо скопировать расширение в папку расширений для вашего PHP
    Получить папку с расширениями можно следующей командой
# php -i | grep extension_dir

Ниже можно увидеть результат команды

тогда копируем расширение в эту папку, в нашем случае это:

# cp /opt/google/v8/6.4/v8js.so /usr/lib64/php/modules
  • А теперь нужно добавить это расширение в ini конфиг php
    получаем папку, в которой хранятся дополнительные ini конфиги
# php -i | grep "additional .ini files"

Вывод будет примерно как на скриншоте ниже

Заходим в папку и создаем ini файл для v8js расширения
В нашем случае это:

# cd /etc/php.d
# nano 50-v8js.ini

И вставляем в файл следюущий код:

extension=v8js.so

Сохраняем файл (CTRL+O, CTRL+X)

  • Теперь можем проверить работоспособность установленного расширения
    Переходим в какую то временную папку на сервер и создаем тестовый php файл
# nano test_v8js.php

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

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

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

string(11) "Hello world"

Если, в качестве менеджера процессов вы используете, например, php-fpm — необходимо его перезагрузить

# systemctl restart php-fpm

Если у вас PHP 7.4 или инструкции выше не работают, можно обратиться к процедуре компиляции V8Js из официальных репозиториев для Ubuntu 20 или Ubuntu 22

Установка Redis на MacOS, Debian, Ubuntu, Centos

MacOS (Catalina)

(Если вам необходимо установить Redis на Mac c процессором семейства M — есть отдельная инструкция)

Открываем терминал (Terminal.app) и обновляем локальные пакеты:

> brew update

Устанавливаем Редис одной командой

> brew install redis

В процессе успешной установки увидим подобные сообщения:

$ brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-5.0.6.catalina.bottle
==> Downloading from https://akamai.bintray.com/8a/8ae4fed5494daa20391ab16d4be0b
################################################################## 100.0%
==> Pouring redis-5.0.6.catalina.bottle.tar.gz
==> Caveats
To have launchd start redis now and restart at login:
brew services start redis
Or, if you don’t want/need a background service you can just run:
redis-server /usr/local/etc/redis.conf
==> Summary
/usr/local/Cellar/redis/5.0.6: 13 files, 3.1MB

Redis успешно установлен. Запустим процесс, чтобы он работал в бекграунде:

> brew services start redis

В случае успешного запуска увидим подобное сообщение:

==> Successfully started redis (label: homebrew.mxcl.redis)

Это все. Процесс установки и запуска завершен.
Проверим работоспособность запущенного редис-сервиса

redis-cli ping

Если видим вывод “PONG” значит все прошло успешно и редис готов к работе.

Linux (Debian, Ubuntu)

Открывает терминал, переходим в домашнюю папку для скачивания архива с Редисом:

$ cd ~/

Скачиваем архив с установочными файлами Redis (последняя стабильная версия):

$ curl -s -o redis-stable.tar.gz "http://download.redis.io/redis-stable.tar.gz"

Далее выполняем команды под рутом — командой получаем права:

$ sudo su

Создаем необходимую папку (флаг -p означает, что создаем ее только в случае если ее нету)

# mkdir -p /usr/local/lib/

И назначаем права

# chmod a+w /usr/local/lib/

Разархивирует в нее архив с файлами Редис:

# tar -C /usr/local/lib/ -xzf redis-stable.tar.gz

Удаляем файл архива — он нам больше не нужен

# rm redis-stable.tar.gz

Переходим в папку с файлами Редиса

# cd /usr/local/lib/redis-stable/

И устанавливаем его (так как это установочные файлы написанные на языке C)

# make && make install

Проверим уставлен ли Редис, выведя его версию

# redis-cli --version

Далее, как рекомендуется в официальной документации, запускаем скрипт конфигурирования. Перейдем в его папку

# cd /usr/local/lib/redis-stable/utils/

И запускаем его

# sh install_server.sh

В процессе работы скрипт будет задавать вопросы (например, на каком порте будет работать Редис сервер). Вполне достаточно оставлять ответы по умолчанию — жмем все время Enter.
В результате скрипт настроит редис, соберет конфигурации, сформирует и добавит сервис в автозагрузку
После этого можно запустить Редис командой

# service redis_6379 start

Linux (CentOS)

Открывает терминал, обновляем установленные пакеты (для некоторых версий может быть важно)

$ sudo yum -y update

Убеждаемся, что необходимые для установки Редис пакеты и утилиты установлены

$ sudo yum -y install scl-utils
$ sudo yum -y install centos-release-scl devtoolset-7 llvm-toolset-7
$ sudo scl enable devtoolset-7 llvm-toolset-7 bash
$ sudo yum -y install gcc gcc-c++ make

Переходим в домашнюю папку для скачивания архива с Редисом:

$ cd ~/

Скачиваем архив с установочными файлами Redis:

$ curl -s -o redis-stable.tar.gz "http://download.redis.io/redis-stable.tar.gz"

Далее выполняем команды под рутом — командой получаем права:

$ sudo su

Создаем необходимую папку (флаг -p означает, что создаем ее только в случае если ее нету)

# mkdir -p /usr/local/lib/

И назначаем права

# chmod a+w /usr/local/lib/

Разархивирует в нее архив с файлами Редис:

# tar -C /usr/local/lib/ -xzf redis-stable.tar.gz

Удаляем файл архива — он нам больше не нужен

# rm redis-stable.tar.gz

Переходим в папку с файлами Редиса

# cd /usr/local/lib/redis-stable/

И устанавливаем его (так как это установочные файлы написанные на языке C)

# make && make install

Проверим уставлен ли Редис, выведя его версию

# redis-cli --version

Если, при этом, будет выведено сообщение об ошибке “command not found” — необходимо добавить /usr/local/bin в переменную среды PATH таким образом

# export PATH="$PATH:/usr/local/bin"

И вновь проверить успешно ли установлен Редис, как описано выше
Далее, как рекомендуется в официальной документации, запускаем скрипт конфигурирования. Перейдем в его папку

# cd /usr/local/lib/redis-stable/utils/

И запускаем его

# sh install_server.sh

Если в процессе будет выведена ошибка ”… This system seems to use systemd. Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry! “ — необходимо внести небольшое изменение в скрипт установки install_server.sh:

# nano install_server.sh

Закомментировать следующие строки

# bail if this system is managed by systemd
# _pid_1_exe=»$(readlink -f /proc/1/exe)»
# if [ «${_pid_1_exe##*/}» = systemd ]
# then
# echo «This systems seems to use systemd.»
# echo «Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!»
# exit 1
# fi
# unset _pid_1_exe

Сохранить файл и запустить его.
В процессе работы скрипт будет задавать вопросы (например, на каком порте будет работать Редис сервер). Вполне достаточно оставлять ответы по умолчанию — жмем все время Enter.
В результате скрипт настроит редис, сформирует конфигурации, сформирует и добавить сервис в автозагрузку
Проверим работу сервера
При этом сам сервис Редеем запускается командой

$ redis-cli

127.0.0.1:6379> ping
PONG

$ service redis_6379 start