Вопрос или проблема
Я выполняю ниже jenkins.war с помощью следующей команды:
jenkins -jar jenkins.war
Но я хочу указать путь, который будет использоваться при выполнении war:
`/data/jenkins`
и он должен выполняться как пользователь jenkins
. В настоящее время он выполняется как пользователь root
и в каталоге /root
.
Как я могу этого добиться?
Я использовал переменные окружения следующим образом в скрипте:
JENKINS_HOME=”/data/jenkins”
JENKINS_WAR=”/data/jenkins/jenkins.war”
и передал их в Java с опцией -D:
java -DJENKINS_HOME=$JENKINS_HOME -jar $JENKINS_WAR
# ps -ef | grep java
root 5 1 0 Mar19 ? 00:05:10 /apps/java/jdk1.8.0_121/bin/java -DJENKINS_HOME=/data/jenkins -jar /data/jenkins/jenkins.war
Вики-сайт Jenkins обсуждает настройку службы как демона Unix: Installing Jenkins as a Unix daemon. У вас в вопросе тег RHEL, и поскольку RHEL 7 использует systemd
, вы можете настроить Jenkins для работы как сервис systemd
. Шаги для этого показаны ниже.
-
Сначала вам нужно загрузить файл Jenkins WAR и разместить его где-нибудь, например, я выбрал местоположение
/opt/jenkins/jenkins.war
. -
Далее, вам нужно создать или подготовить директорию данных, которую вы хотите использовать, это
/data/jenkins
. -
Теперь вы можете создать системный учетный запись пользователя с именем
jenkins
:useradd -r jenkins
-
Далее, измените владельца файла Jenkins WAR и директории данных на этого нового пользователя:
chown -R jenkins:jenkins /opt/jenkins/ chown -R jenkins:jenkins /data/jenkins/
-
Далее, определите сервис
systemd
, создав новый unit-файл:vi /etc/systemd/system/jenkins.service [Unit] Description=Jenkins Daemon [Service] ExecStart=/bin/java -jar /opt/jenkins/jenkins.war User=jenkins Environment=JENKINS_HOME=/data/jenkins [Install] WantedBy=multi-user.target
-
Покажите
systemd
новый unit, перезагрузив его:systemctl daemon-reload
-
Наконец, запустите Jenkins:
systemctl start jenkins
Теперь вы должны иметь возможность доступа к Jenkins на порту 8080. Если firewalld
активен, вам нужно будет разрешить порт, выполнив команду firewall-cmd --add-port=8080/tcp
на системе.
Логи Jenkins теперь можно увидеть с помощью journalctl _SYSTEMD_UNIT=jenkins.service
. Выполнение ps -ef | grep jenkins
покажет, что он работает как пользователь jenkins
:
jenkins 1749 1 7 11:04 ? 00:00:35 /bin/java -jar /opt/jenkins/jenkins.war
В качестве дополнительного бонуса выполните systemctl enable jenkins
, если вы хотите, чтобы служба Jenkins автоматически запускалась при загрузке системы.
.
Ответ или решение
Чтобы запустить Jenkins с определённой рабочей директорией и под конкретным пользовательским аккаунтом, как это требуется в описанной вами ситуации, вам необходимо выполнить ряд шагов, которые включают настройку системного демона через systemd
на вашем сервере RHEL 7.
Теория
Ваш текущий подход использует java -jar
, но для запуска Jenkins как службы systemd с использованием определённого пути и пользователя требуется создать специфическую конфигурацию. Преимуществом использования systemd
является упрощённое управление службами, автоматический запуск при старте системы и более чёткий контроль над средой выполнения.
Пример
Вот пошаговое руководство:
-
Получение Jenkins WAR: Скачайте файл
jenkins.war
и разместите его, например, в/opt/jenkins/
. -
Подготовка рабочей директории: Создайте и подготовьте рабочую директорию
/data/jenkins
. -
Создание системного пользователя: Создайте системного пользователя
jenkins
для выполнения операций от его имени.useradd -r jenkins
-
Права доступа: Измените владельца на директорию с данными Jenkins и сам файл WAR.
chown -R jenkins:jenkins /opt/jenkins/ chown -R jenkins:jenkins /data/jenkins/
-
Создание системного юнита для systemd: Создайте файл юнита
jenkins.service
.vi /etc/systemd/system/jenkins.service
Содержимое файла:
[Unit] Description=Jenkins Daemon [Service] ExecStart=/bin/java -jar /opt/jenkins/jenkins.war User=jenkins Environment=JENKINS_HOME=/data/jenkins [Install] WantedBy=multi-user.target
-
Перезагрузка конфигурации systemd:
systemctl daemon-reload
-
Запуск Jenkins:
systemctl start jenkins
-
(Опционально) Настройка автозапуска:
systemctl enable jenkins
Применение
С использованием вышеописанных шагов, Jenkins будет запускаться под пользователем jenkins
и использовать директорию /data/jenkins
для хранения данных. Таким образом, управление Jenkins становится более сопоставимым с стандартными практиками работы на RHEL 7 и увеличивает безопасность за счёт выполнения процесса от ограниченного системного пользователя.
Убедитесь, что ваш файерволл позволяет доступ к необходимому порту (обычно 8080) с помощью команды:
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
Это решение обеспечит вам надёжное и безопасное развертывание Jenkins в продакшн среде.