Jenkins - плагин HTML Publisher - CSS не отображается при просмотре отчета на сервере Jenkins

У меня странная проблема с плагином Jenkins HTML Publisher, когда весь модный CSS, добавленный в отчет, удаляется при просмотре в Jenkins. Если я загружаю отчет на локальный компьютер, я вижу форматирование CSS. Есть ли в Jenkins параметр, позволяющий просматривать CSS?

Мои настройки HTML-издателя в Jenkins:

введите описание изображения здесь

Моя страница отчета при отображении в Jenkins:

введите описание изображения здесь

Страница моего отчета при локальном отображении:

введите описание изображения здесь

19 ответов

Разобрался с проблемой. Поделиться здесь для других пользователей.

CSS удален из-за политики безопасности контента в Jenkins. ( https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy)

Правило по умолчанию установлено на:

sandbox; default-src 'none'; img-src 'self'; style-src 'self';

Этот набор правил приводит к следующему:

  • JavaScript вообще не допускается
  • Не допускаются плагины (объект / встраивание)
  • Не допускается использование встроенного CSS или CSS с других сайтов.
  • Изображения с других сайтов запрещены
  • Кадры не допускаются
  • Веб-шрифты не разрешены
  • Не допускается XHR/AJAX и т. Д.

Чтобы ослабить это правило, перейдите в консоль Manage Jenkins->Script и введите следующую команду:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

и нажмите Выполнить. Если вы видите результат как "Результат:" ниже заголовка "Результат", защита отключается. Перезапустите сборку, и вы увидите, что в новых архивированных HTML-файлах будет включен CSS.

В CentOs включить изображения в html отчете

  • sudo vi /etc/sysconfig/jenkins
  • установить следующее в JENKINS_JAVA_OPTION

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' 'unsafe-inline' data:;\""

Это будет работать даже после перезапуска сервера jenkin.

директива

default-src: default-src - это политика по умолчанию для загрузки контента, такого как JavaScript, изображения, CSS, шрифты, запросы AJAX, фреймы, HTML5-медиа

img-src: Определяет действительные источники изображений.

Значение источника

' self ' - позволяет загружать ресурсы из одного источника (одна и та же схема, хост и порт).

Использование: default-src 'self'

"unsafe-inline" - позволяет использовать встроенные элементы источника, такие как атрибут style, onclick или тела тегов скрипта (зависит от контекста источника, к которому он применяется) и javascript: URI.

Использование: default-src 'unsafe-inline'

"unsafe-eval" - разрешает небезопасную динамическую оценку кода, например JavaScript eval()

Использование: default-src 'unsafe-eval'

данные: - Позволяет загружать ресурсы через схему данных (например, закодированные изображения Base64).

Использование: img-src 'self' data:

Пожалуйста, ознакомьтесь больше с политикой безопасности контента здесь

Перейдите в "Управление Jenkins" -> "Консоль сценариев" и выполните команду ниже:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

В CentOS решение ниже (которое было предложено в комментариях к другому ответу) - единственное, которое сработало для меня:

  1. Перейдите к: Управление Jenkins> Управление узлами и облаками
  2. Щелкните значок шестеренки справа от узла (по умолчанию будет только один узел с именем Master).
  3. Нажмите "Консоль сценариев" слева.
  4. Введите в окно консоли следующее: System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' 'unsafe-inline' data:;")
  5. Нажмите "Выполнить"
  6. Вы должны увидеть результат в разделе результатов, как на скриншоте ниже:

Моя конкретная проблема заключалась в отсутствии изображений / css в отчетах Serenity BDD. После выполнения этих шагов в моих отчетах Serenity были все изображения / CSS-рендеринг должным образом, включая отчеты о сборках, которые были выполнены до этого изменения. Это решение также будет работать для любого опубликованного отчета на основе HTML.

Вы можете исправить это, используя команду groovy, как указано в ответе Vall.

Эффект сохраняется до тех пор, пока Дженкинс не перезапустится, а после этого вам придется делать это снова.

Решение этой проблемы состоит в том, чтобы настроить работу, которая будет делать это для вас каждый раз при запуске jenkins.

Вы можете сделать это с помощью плагина Startup Trigger.

После установки создайте новое задание, и у вас будет новый флажок в разделе " Построение триггеров ", который вам нужно будет проверить.

Затем добавьте шаг сборки скрипта Groovy для выполнения системы с помощью команды:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")

Сохранить и все должно работать.

(Следующее решение для Windows.)

Постоянное исправление заключается в изменении строки в [Jenkins directory]\jenkins.xml (для меня это в C:\Jenkins\jenkins.xml)

<executable>java.exe</executable>
<arguments>[arguments are here]</arguments>

Добавьте следующий аргумент в список аргументов, разделенных пробелами:

-Dhudson.model.DirectoryBrowserSupport.CSP=

Затем перезапустите сервис Jenkins, чтобы получить изменения.

Для версии Ubuntu 14 полезными были специальные плагины:

https://wiki.jenkins-ci.org/display/JENKINS/Startup+Trigger - чтобы начать работу при запуске jenkins

https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin - для запуска скрипта System Groovy

И я выполнил задание, которое запускается при перезапуске Jenkins и устанавливает параметр.

собирается начать сборку после запуска Дженкинса

И добавил системный скрипт Groovy для настройки параметров. Запустить системный скрипт Groovy System.setProperty ("hudson.model.DirectoryBrowserSupport.CSP", "песочница; img-src 'self';")

Идти к

Управление Jenkins -> Консоль скриптов

и введите следующую команду:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

затем нажмите Run. если вы получите результат как "Результат", то повторно запустите сборку, проверьте формат отчета HTML

Хотя это старый пост и на него дан ответ, я почувствовал желание указать на новый материал, чтобы улучшить ответ. Итак, извините за неприятную ситуацию, но в конце концов это лучшая поисковая находка по этой теме.

Во всех предыдущих ответах, которые я видел, предлагалось так или иначе установить общедоступную политику безопасности контента по умолчанию. Учитывая тот факт, что контент может быть изменен любым, кто запускает сборку вашего конвейера Jenkins, это несет в себе определенный риск. В конце концов, это допустимая настройка, которая позволяет минимизировать риск межсайтового выполнения сценариев. На это указывалось в нескольких комментариях, которые я прочитал даже в этой теме.

Для дальнейшего обучения я нашел несколько хороших ресурсов.

https://www.jenkins.io/doc/book/security/configuring-content-security-policy/

https://content-security-policy.com/

Следующее позволило включить красивые отчеты о покрытии HTML на моем управляемом экземпляре Jenkins. В документации Jenkins указано, что установка URL-адреса ресурса является несколько предпочтительным решением, но в моем случае это было невозможно:

  1. В веб-интерфейсе Jenkins перейдите к консоли сценариев.
  2. ТипSystem.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self' ")и нажмите «Выполнить».
  3. Настройка вступает в силу немедленно, поэтому проверьте результаты, перезагрузив «испорченный» контент, который вы пытаетесь отобразить.(например, отчет об освещении ваших вакансий в формате HTML)
  4. Возврат к типу по умолчаниюSystem.clearProperty("hudson.model.DirectoryBrowserSupport.CSP")в консоли сценариев.

Предоставленный заголовок CSP является так называемой стартовой политикой из второй ссылки, приведенной выше.

Эта политика разрешает изображения, сценарии, AJAX, действия форм и CSS из одного и того же источника и не допускает загрузку каких-либо других ресурсов (например, объекта, фрейма, мультимедиа и т. д.). Это хорошая отправная точка для многих сайтов.

В случае отчетов о покрытии HTML в защищенном от доступа экземпляре Jenkins я нашел это приемлемым и работающим.

Для постоянной настройки создайте файл сценария Groovy $JENKINS_HOME/init.groovy или любой файл .groovy в каталоге $JENKINS_HOME/init.groovy.d/ со следующим содержимым:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox allow-scripts; default-src 'self'; img-src *; style-src 'self' 'unsafe-inline'; script-src * 'unsafe-inline';")

systemctl перезапустить Дженкинс

https://wiki.jenkins.io/display/JENKINS/Post-initialization+script

Откройте файл jenkins.xml и скопируйте аргументы, как показано ниже. это будет исправлено навсегда. Как только это будет сделано, перезагрузите компьютер.

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dhudson.model.DirectoryBrowserSupport.CSP="sandbox allow-scripts; default-src 'self'; style-src 'self' 'unsafe-inline';" -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments

Для тех, кто использует asciidoctor-maven-plugin плагин для создания HTML-документа из файла asciidoc для дальнейшей публикации в Jenkins, обновите конфигурацию плагина, добавьте linkcss атрибут:

<configuration>
    <attributes>
        <linkcss>true</linkcss>
    </attributes>
    <backend>html5</backend>
    <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
</configuration>

Я знаю, что это старо, но это отлично сработало для меня, и это то, что, кажется, рекомендуется в документах Дженкинса. Я просто установил для корня ресурса другой URL-адрес, обслуживаемый из того же места.

«Настоятельно рекомендуется настроить URL-адрес корня ресурса вместо настройки Content-Security-Policy. Большая часть приведенной ниже документации была написана, когда Content-Security-Policy впервые была представлена, и сохраняется для использования администраторами, которые не могут настроить Jenkins для обслуживать пользовательский контент из другого домена».

To set the system property permanently if using Jenkins-X, then create the file myvalues.yaml in the current directory, with the following content:

jenkins:
  Master:
    JavaOpts: >
      -Dhudson.model.DirectoryBrowserSupport.CSP=

Then restart the jenkins-x platform, which can be done by upgrading it:

$ jx upgrade platform --always-upgrade
# Presumably jx.exe is used if on Windows (not tested)

To avoid actually upgrading the platform, just forcibly upgrade it to the same version:

$ version=$(jx version --no-version-check\
            | grep 'jenkins x platform' | sed -e 's/^jenkins.\+ //')
$ jx upgrade platform --version ${version} --always-upgrade

У нас есть гораздо более простое решение проблемы. Если вы действительно не настаиваете на наличии отчетов в формате HTML, вы можете просто использовать плагин Warnings NG (что в любом случае является хорошей идеей):

https://github.com/jenkinsci/warnings-ng-plugin/blob/master/SUPPORTED-FORMATS.md

Мы используем это для CodeNarc (Groovy), но также для Checkstyle, PMD, SpotBugs и предупреждений Java (Java).

  1. В MacOS Jenkins запускает службу, которая должна создать скрипт groovy внутри $JENKINS_HOME/init.groovy.d.
  2. Позвоните в startup-properties.groovy и введите код:
          import jenkins.model.Jenkins
    import java.util.logging.LogManager 
    /* Jenkins home directory */
    def jenkinsHome = Jenkins.instance.getRootDir().absolutePath
    def logger = LogManager.getLogManager().getLogger("")
    /* Replace the Key and value with the values you want to set.*/
    /* System.setProperty(key, value) */
    System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
    logger.info("Jenkins Startup Script: Successfully updated the system properties value for hudson.model.DirectoryBrowserSupport.CSP . Script location : ${jenkinsHome}/init.groovy.d")
  1. Перезапустите службу Jenkins: службы варки перезапускают jenkins-lts

Повторно создайте задание и проверьте HTML-отчет в сборке.

https://stackru.com/images/fc561f6f07351b5d76b4979964472356ca8255fe.png

Слишком поздно, чтобы ответить, но думал, чтобы поделиться.

Я боролся с Jenkins, развернутым на Tomcat, пытался выполнить скрипт, это помогает, но уходит, если перезагрузить tomcat.

Сделано постоянное исправление, установив свойство в catalina.properties в tomcat.

Файл свойств: tomcat_installation_dir/conf/catalina.properties Просто скопируйте и вставьте строку ниже в последний раз в catalina.properties (вы можете установить его где угодно, только чтобы не связываться с существующими свойствами)

-Dhudson.model.DirectoryBrowserSupport.CSP = ""

У меня были те же проблемы после добавления HTTPS к моим Jenenkins. В случае, если у вас возникла та же проблема, решение простое - установите свой URL-адрес Jenkins на использование протокола HTTPS вместо HTTP. Это можно настроить через конфигурацию jenkins -> url jenkins

В Debian / Ubuntu, в установках aptitude:

  • sudo vi /etc/default/jenkins
  • добавлять -Dhudson.model.DirectoryBrowserSupport.CSP= к JAVA_ARGS(например JAVA_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=")
  • Перезагрузите Дженкинс - service jenkins restart

Этого мне было достаточно, но полный список параметров см. В этом ответе.

Другие вопросы по тегам