Установка Jenkins
Важно!
Начиная с версии 2024.4.1, если планируется использование инструментов PT Application Inspector или CodeScoring, необходимо подготовить Docker-образ по инструкции, приведенной в разделе «Добавление в Docker-образ hub-engine агентов Johnny и PT AISA».
Master нода
За основу взята сборка Jenkins, запускаемая в rootless Docker. Для сборки используется нода master.
Установлен следующий набор плагинов
ace-editor:latest ant:latest antisamy-markup-formatter:latest apache-httpcomponents-client-4-api:latest authentication-tokens:latest bitbucket:latest blueocean:latest blueocean-autofavorite:latest blueocean-bitbucket-pipeline:latest blueocean-commons:latest blueocean-config:latest blueocean-core-js:latest blueocean-dashboard:latest blueocean-display-url:latest blueocean-events:latest blueocean-github-pipeline:latest blueocean-git-pipeline:latest blueocean-i18n:latest blueocean-jira:latest blueocean-jwt:latest blueocean-personalization:latest blueocean-pipeline-api-impl:latest blueocean-pipeline-editor:latest blueocean-pipeline-scm-api:latest blueocean-rest:latest blueocean-rest-impl:latest blueocean-web:latest bouncycastle-api:latest branch-api:latest build-pipeline-plugin:latest build-timeout:latest build-token-root:latest build-token-trigger:latest checkmarx:latest cloudbees-bitbucket-branch-source:latest cloudbees-folder:latest command-launcher:latest conditional-buildstep:latest configuration-as-code:latest copy-data-to-workspace-plugin:latest credentials:latest credentials-binding:latest dependency-check-jenkins-plugin:latest dependency-track:latest display-url-api:latest docker-commons:latest docker-workflow:latest durable-task:latest email-ext:latest external-monitor-job:latest favorite:latest generic-webhook-trigger:latest git:latest git-client:latest github:latest github-api:latest github-branch-source:latest gitlab-plugin:latest git-server:latest gradle:latest handlebars:latest handy-uri-templates-2-api:latest htmlpublisher:latest jackson2-api:latest javadoc:latest jdk-tool:latest jenkins-design-language:latest jira:latest job-fan-in:latest jquery:latest jquery-detached:latest jsch:latest junit:latest ldap:latest lockable-resources:latest mailer:latest mapdb-api:latest matrix-auth:latest matrix-project:latest maven-plugin:latest mercurial:latest metrics:latest momentjs:latest nested-view:latest nexus-jenkins-plugin:latest nuget:latest pam-auth:latest parameterized-trigger:latest permissive-script-security:latest pipeline-build-step:latest pipeline-graph-analysis:latest pipeline-input-step:latest pipeline-milestone-step:latest pipeline-model-api:latest pipeline-model-declarative-agent:latest pipeline-model-definition:latest pipeline-model-extensions:latest pipeline-rest-api:latest pipeline-stage-step:latest pipeline-stage-tags-metadata:latest pipeline-stage-view:latest plain-credentials:latest pubsub-light:latest resource-disposer:latest run-condition:latest scm-api:latest script-security:latest sloccount:latest sse-gateway:latest ssh-agent:latest ssh-credentials:latest ssh-slaves:latest stash-pullrequest-builder:latest structs:latest subversion:latest text-finder:latest timestamper:latest token-macro:latest trilead-api:latest variant:latest view-job-filters:latest windows-slaves:latest workflow-aggregator:latest workflow-api:latest workflow-basic-steps:latest workflow-cps:latest workflow-cps-global-lib:latest workflow-durable-task-step:latest workflow-job:latest workflow-multibranch:latest workflow-scm-step:latest workflow-step-api:latest workflow-support:latest ws-cleanup:latest
Во время запуска проводятся первоначальные настройки, которые задают учетные данные Администратора и базовый URL Jenkins, импортируют в систему все SSL-сертификаты как доверенные и устанавливают переменные окружения.
Slave нода
За основу взят базовый образ Ubuntu, который также запускается в rootless контейнере, поверх которого установлены утилиты и сборщики, необходимые для проведения сканирований.
Данный образ может работать со следующим списком утилит: mono, cdxgen, nuget, npm, java, maven и gradle.
При подключении ноды к Jenkins необходимо указать следующие метки: all super jenkins-slave-node-all maven mono npm nodejs docker java python pypi cdxgen.
Установка
-
Создайте папки.
sudo mkdir -p /opt/jenkins/jenkins_home sudo mkdir -p /opt/jenkins/jenkins-slave-all sudo mkdir -p /opt/jenkins/ssh-pub-keys-all sudo mkdir -p /opt/jenkins/certs sudo mkdir -p /opt/jenkins/docker-certs sudo mkdir -p /opt/jenkins/fortify -
Сохраните файл с публичным ключом authorized_keys в папку ssh-pub-keys-all.
-
Если в качестве доверенных необходимо добавить самоподписанные сертификаты, сохраните корневой сертификат или сертификаты всех узлов с расширением .crt в папку certs. Более подробная информация приведена в разделе «Безопасная сетевая конфигурация».
-
Если для Docker в качестве доверенных необходимо добавить самоподписанные сертификаты, создайте папку docker-certs/<repo>, где
<repo>— container registry, который указывается при авторизации.Например
Если необходимо выполнить авторизацию с помощью команды
docker login gitlab.example.com, создайте директорию docker-certs/gitlab.example.com и сохраните корневой сертификат или сертификат узла в ней. -
Задайте права пользователя на папки и файлы.
sudo chown 1000:1000 -R /opt/jenkins/jenkins_home sudo chmod 775 -R /opt/jenkins/fortify sudo chown 1000:2000 -R /opt/jenkins/fortify sudo chown 2000:2000 -R /opt/jenkins/jenkins-slave-all sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown 2000:2000 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chmod 755 -R /opt/jenkins/certs/ sudo chown 1000:2000 -R /opt/jenkins/certs/export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_1000=$((${REMAP_UID}+999)) sudo chown ${UID_1000}:${UID_1000} -R /opt/jenkins/jenkins_home sudo chmod 775 -R /opt/jenkins/fortify sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/fortify sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/jenkins-slave-all sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/ssh-pub-keys-all sudo chmod 755 -R /opt/jenkins/certs/ sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/certs/ -
Создайте файл /opt/jenkins/.env со следующим содержимым:
hub_engine_manager_version=<version> hub_engine_version=<version>где
<version>— последняя актуальная версия продукта, например —2025.4.2. -
Для корректной работы контейнера docker-in-docker выполните следующие команды.
sudo mkdir /sys/fs/cgroup/systemd sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd -
Создайте файл /opt/jenkins/docker-compose.yaml, пример см. в «Приложении 10».
Важно!
При использовании rootless Docker на хостовой системе контейнер docker-in-docker начинает работать нестабильно. В качестве альтернативы предлагается использовать внешний Docker-демон, взаимодействие с которым осуществляется через SSH-соединение. Таким образом, проводя операции с Docker-контейнерами в образе node-all (запуск, удаление и т. п.), мы проводим эти операции на удалённом хосте, с которым установлено соединение. Важно, что для обеспечения работоспособности такой системы не обязательно иметь 2 инстанса — можно использовать тот же хост, на котором происходит установка Jenkins. Далее приведена инструкция по конфигурации подключения удалённого Docker-демона.
-
Уберите из docker-compose.yaml сервис docker-in-docker.
-
На отдельном хосте установите rootless Docker (хост может быть тот, на котором устанавливается Jenkins).
-
Создайте SSH-ключи БЕЗ ПАРОЛЯ.
-
Запишите ключ удаленного хоста в файл known_hosts (измените
<domain>на доменное имя хоста, на котором запущен rootless Docker):ssh-keyscan -H <domain> | sudo tee -a /opt/jenkins/ssh-pub-keys-all/known_hosts -
Сохраните публичный SSH-ключ в файл /home/<user>/.ssh/authorized_keys на хосте, где запущен rootless Docker (замените
<user>на имя пользователя на удаленном хосте, от которого запущен Docker). -
Сохраните приватный ключ в файл с названием
id_rsaв директорию /opt/jenkins/ssh-pub-keys-all на хосте, где устанавливается Jenkins. -
Замените в файле docker-compose.yaml значение переменной
DOCKER_HOSTв сервисах Jenkins и node-all наssh://<user>@<domain>, где<user>— имя пользователя, от которого на удаленном хосте запущен Docker, а<domain>— доменное имя хоста, на котором запущен rootless Docker. -
Если владельцем Docker-сокета является непривилегированный пользователь, установите необходимые права и владельца на добавленные файлы.
export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_1000=$((${REMAP_UID}+999)) sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/known_hosts sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/known_hosts sudo chmod 400 /opt/jenkins/ssh-pub-keys-all/id_rsa sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/id_rsa sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/ssh-pub-keys-all
-
-
Для корректной работы отдельных утилит и инструментов, например cdxgen, могут потребоваться переменные окружения, которые указываются в файле docker-compose.yaml (раздел environment сервиса jenkins). Перечень переменных окружения контейнера hub-engine-manager приведен в Приложении 11.
Примечание
Для автоматического конфигурирования URL Jenkins и учетных данных Администратора используются переменные окружения:
JENKINS_URL,JENKINS_ADMIN_USER,JENKINS_ADMIN_PASSWORD. При запуске Jenkins соответствующие параметры берутся из перечисленных переменных.Если после запуска необходимо скрыть учетные данные Администратора, следует убрать переменные
JENKINS_ADMIN_USERиJENKINS_ADMIN_PASSWORDиз docker-compose.yaml — текущие учетные данные (username/password) будут сохранены в Jenkins и, используя их, можно войти в систему. -
Если необходимо использовать Fortify, предварительно создав файл license/fortify.license с лицензией для него, добавьте в docker-compose.yaml следующий раздел.
fortify-node: image: registry.appsec.global/appsechub/hub-engine:${hub_engine_version} container_name: node-fortify user: 2000:2000 networks: - network restart: always environment: - LANG=en_US.utf-8 - "JAVA_OPTS=-DLANG=en_US.UTF-8" volumes: - ./certs:/tmp/certs - ./ssh-pub-keys-all:/home/ubuntu/.ssh - ./jenkins-slave-fortify:/home/ubuntu/jenkins-slave - ./fortify/projects_fortify:/fortify/projects - ./license/fortify.license:/opt/Fortify/Fortify_SCA_and_Apps_21.1.1/fortify.license -
Выполните настройку HTTPS-соединения, добавив в docker-compose.yaml следующий раздел.
nginx: image: registry.appsec.global/public/sfs-nginx:latest container_name: nginx networks: - network volumes: - ./nginx:/etc/nginx/conf.d:ro - ./ssl:/etc/ssl/certs/ssl-cert:ro restart: always ports: - 80:80/tcp - 443:443/tcp -
Создайте директории.
sudo mkdir /opt/jenkins/nginx sudo mkdir /opt/jenkins/ssl -
В директории ssl сохраните сертификат в файл fullchain.pem и ключ в файл privkey.pem.
-
В директории nginx создайте конфигурационный файл для reverse-proxy — web.conf и в параметре
server_nameукажите URL Jenkins.server { listen 80; server_name jenkins.company.com; # Укажите URL для доступа к Jenkins. ignore_invalid_headers off; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; client_max_body_size 100m; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://jenkins:8080; } listen 443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; if ($scheme != "https") { return 301 https://$host$request_uri; } } -
Для rootless Docker установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.
echo "net.ipv4.ip_unprivileged_port_start=0" | sudo tee -a /etc/sysctl.conf sudo sysctl -p /etc/sysctl.conf
Запуск
Запуск осуществляется с помощью следующей команды (из директории docker-compose.yaml).
cd /opt/jenkins
sudo docker-compose up -d
После запуска Jenkins будет доступен на порту 8080.
Важно
После запуска даже у анонимного пользователя будут права администратора. После первого запуска добавьте всех необходимых пользователей (Manage Jenkins › Manage Users) и назначьте им права в матричном системе доступа (Manage Jenkins › Configure Global Security › Authentication › Authorization (Matrix-based security)).
Подключение нод
-
Перед добавлением slave node необходимо добавить приватный SSH-ключ в хранилище секретов Jenkins (Manage Jenkins › Manage Credentials).

Перейдите в Jenkins (поле Store) › Global credentials › Add Credentials и добавьте приватный ключ.

-
Добавьте новый узел Manage Jenkins › Manage Nodes and Clouds › New Node, укажите название и нажмите OK.

-
В меню настроек укажите следующие параметры:
Параметр Значение Remote root directory /home/ubuntu/jenkins-slaveLabels all super jenkins-slave-node-all maven mono npm nodejs docker java python pypi cdxgenHost node-allВ выпадающем списке Host Key Verification Strategy выберите Non verifying Verification Strategy и нажмите Save.

-
Укажите для slave node порт
2022(Advanced › Port). -
Укажите переменные окружения.
Переменная Значение LANG en_US.UTF-8PATH ${PATH}:/usr/local/go/bin:/opt/gradle/gradle-8.7.0/binПри добавлении slave ноды Fortify необходимо указать в Jenkins следующую переменную окружения.
Название Значение PATH ${PATH}:/opt/Fortify/Fortify_SCA_and_Apps_21.1.1/bin
При успешном добавлении статус ноды изменится на In Sync.

Важно!
При интеграции AppSec.Hub и Jenkins некоторые сканирования могут заканчиваться неуспешно, если не дать разрешение на исполнение Groovy-скриптам, которые появляются в Jenkins (Manage Jenkins › In-process Script Approval).