Jenkins - HTML Publisher Plugin - Nenhum CSS é exibido quando o relatório é visualizado no servidor Jenkins


95

Tenho um problema estranho com o plugin Jenkins HTML Publisher, em que todo o CSS sofisticado que adicionei ao relatório é removido quando visualizado no Jenkins. Se eu baixar o relatório para o local, poderei ver a formatação CSS. Existe uma configuração no Jenkins que permite que o CSS seja visualizado?

Minhas configurações de editor HTML no Jenkins:

insira a descrição da imagem aqui

Minha página de relatório quando exibida no Jenkins:

insira a descrição da imagem aqui

Minha página de relatório quando exibida em Local:

insira a descrição da imagem aqui



2
Todo mundo está dizendo que você "conserta" desabilitando a Política de Segurança de Conteúdo, sem se preocupar com o motivo de sua existência. Qualquer pessoa que puder afetar as mudanças a serem construídas poderá sequestrar as credenciais do administrador e obter acesso a todo o cluster Jenkins. Embora css inline seja mais seguro se você for cuidadoso, permitir scripts é um desastre.
OrangeDog

Respostas:


179

Descobri o problema. Compartilhando aqui para outros usuários.

CSS é eliminado devido à Política de Segurança de Conteúdo do Jenkins. ( https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy )

A regra padrão é definida para:

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

Este conjunto de regras resulta no seguinte:

  • Nenhum JavaScript permitido
  • Nenhum plug-in (objeto / incorporação) permitido
  • CSS inline ou CSS de outros sites não são permitidos
  • Não são permitidas imagens de outros sites
  • Sem frames permitidos
  • Nenhuma fonte da web é permitida
  • Não é permitido XHR / AJAX, etc.

Para relaxar esta regra, vá para

  1. Gerenciar Jenkins->
  2. Gerenciar nós->
  3. Clique em configurações (ícone de engrenagem) ->
  4. clique em Console de script à esquerda e digite o seguinte comando:

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

e pressione Executar. Se você vir a saída como 'Resultado:' abaixo do cabeçalho "Resultado", a proteção está desativada. Execute novamente sua construção e você verá que os novos arquivos HTML arquivados terão o CSS ativado.


1
Obrigado!!! Isso realmente me ajudou a resolver esse problema de css que tive com Jenkins.
Eyal Sooliman

1
@Steerpike Eu me perguntei o que você quis dizer e depois descobri que o css foi bloqueado ao reiniciar o Jenkins. Portanto, criei um trabalho do Jenkins que executa o comando a cada 12 horas. Parece funcionar.
Aeropher

@Aeropher obrigado - eu sou um novato no Jenkins - como faço para configurar esse trabalho? Configurar um trabalho geral com uma etapa de compilação de Executar comando em lote do Windows?
Steerpike

3
@Steerpike Isso mesmo, exceto que é um comando excelente, então você precisa executá-lo em uma etapa de compilação "Executar script do sistema Groovy". E então, na seção "Build Triggers", selecionei "Build Periodically" com este valor: H 12 * * *
Aeropher

Na verdade, você nem precisa executar novamente sua construção. Simplesmente recarregue o HTML gerado do Jenkins e ele terá o efeito da mudança de política.
hshib

24

Em CentOs , para habilitar imagens em relatório html

  • sudo vi /etc/sysconfig/jenkins
  • definir seguindo em 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:;\""

Isso funcionará mesmo depois de reiniciar o servidor jenkins.


Diretriz

default-src : o default-src é a política padrão para carregar conteúdo como JavaScript, Imagens, CSS, Fontes, solicitações AJAX, Frames, Mídia HTML5

img-src: Define fontes válidas de imagens.

Valor da Fonte

'self' - Permite carregar recursos da mesma origem (mesmo esquema, host e porta).

Uso: default-src 'self'

'unsafe-inline' - Permite o uso de elementos de origem embutidos, como atributo de estilo, onclick ou corpos de tag de script (depende do contexto da fonte à qual é aplicado) e javascript: URIs.

Uso: default-src 'unsafe-inline'

'unsafe-eval' - Permite avaliação de código dinâmico não seguro, como eval JavaScript ()

Uso: default-src 'unsafe-eval'

dados: - Permite carregar recursos através do esquema de dados (por exemplo, imagens codificadas em Base64).

Uso: img-src 'self' data:

Consulte mais sobre a política de segurança de conteúdo aqui


1
você só deve habilitar css embutido, e não todas essas outras coisas não seguras
OrangeDog

Se você usar algum svg em objeto em parte de dados como este <object type="image/svg+xml" data="imgs/lifecycle-diagram.svg"><span class="alt">lifecycleDiagram</span></object>(resultado da documentação interativa asciidoctor spring-rest para diagrama plantuml embutido), você precisaria definir object-src para self. Aviso escapando:JENKINS_JAVA_OPTIONS='-Djava.awt.headless=true -Dhudson.security.HudsonPrivateSecurityRealm.ID_REGEX="^[a-zA-Z0-9_.-]+$" -Dhudson.model.DirectoryBrowserSupport.CSP="sandbox; default-src '\''none'\''; img-src '\''self'\''; style-src '\''self'\''; object-src '\''self'\'';"'
Lubo

1
ótimo! pode ser usado para docker também com --env JAVA_OPTS = "..."
smelm

1
Para a minha instalação do Ubuntu eu usei vi /etc/default/jenkinscom a variávelJAVA_ARGS
mRyan

15

Vá para “Gerenciar Jenkins” -> “Console de script” e execute o comando abaixo:

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

3
Depois de modificar o segundo parâmetro para os valores mencionados por kithinkmatthew, isso funcionou para mim, ou sejaSystem.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' 'unsafe-inline' data:;")
Andrew Mackrodt

@AndrewMackrodt o que você sugeriu é a única solução que funcionou para mim (estou executando o Jenkins no CentOS)
lax1089

13

(A solução a seguir é para Windows.)

Uma correção permanente é mudar uma linha em [Jenkins directory]\jenkins.xml(para mim é em C:\Jenkins\jenkins.xml)

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

Adicione o seguinte argumento à lista de argumentos separados por espaços em branco:

-Dhudson.model.DirectoryBrowserSupport.CSP=

Em seguida, reinicie o serviço Jenkins para pegar a mudança.


1
essa é a única resposta que funciona para mim, também acrescentei -Dfile.encoding=UTF-8aos argumentos
Sasha Bond

9

Você pode corrigir isso usando o comando groovy conforme especificado na resposta de Vall .

O efeito permanece até que o Jenkins seja reiniciado e, depois, você terá que fazer isso novamente.

Uma solução para resolver este problema é configurar um trabalho que fará isso para você sempre que o jenkins for inicializado.

Você pode fazer isso usando o plugin Startup Trigger .

Depois de instalá-lo, crie um novo trabalho e você terá uma nova caixa de seleção na seção Build Triggers que deverá ser verificada.

Em seguida, adicione uma etapa de compilação Execute system Groovy script com o comando:

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

Salve e tudo deve funcionar.


Com esse método, você também precisa instalar o plug-in Groovy, se ainda não o fez. Caso contrário, a etapa de compilação Executar script do Groovy do sistema não será exibida entre as opções de compilação.
Bálint Pap

5

Para a versão Ubuntu 14, os plug-ins especiais foram úteis:

https://wiki.jenkins-ci.org/display/JENKINS/Startup+Trigger - para iniciar o trabalho na inicialização do jenkins

https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin - para executar o script System Groovy

E eu fiz um trabalho, que começa no Jenkins restart e define os parâmetros.

definido para iniciar a construção depois que o Jenkins for executado

E adicionado script do sistema Groovy para definir parâmetros. Execute o script System Groovy System.setProperty ("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; img-src 'self';")


Embora a execução da tarefa seja concluída com êxito, ela não ativa a exibição de CSS para meus relatórios. Eu executei exatamente o mesmo script bacana no "Console de scripts" e funcionou bem. O que mais eu posso fazer? O script bacana deste trabalho não está mudando a propriedade do Jenkin pai real.
frakman1

@ frakman1 neste momento meu script Groovy se parece com isto - System.setProperty ("hudson.model.DirectoryBrowserSupport.CSP", "") Mas isso é tudo e tudo funciona. Talvez você não tenha um usuário administrador?
abiab

Obrigado pela resposta. Eu finalmente consegui fazer funcionar. Tive de usar este script em vez disso:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox allow-same-origin allow-scripts; default-src 'self'; script-src * 'unsafe-eval'; img-src *; style-src * 'unsafe-inline'; font-src *")
frakman1

2

Vamos para

Gerenciar Jenkins -> console de script

e digite o seguinte comando:

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

em seguida, pressione Executar. se você obtiver a saída como 'Resultado', execute novamente a verificação do formato do relatório HTML


1

Para configurar permanentemente, crie um arquivo de script Groovy $ JENKINS_HOME / init.groovy ou qualquer arquivo .groovy no diretório $ JENKINS_HOME / init.groovy.d / com o seguinte conteúdo:

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

systemctl restart jenkins

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


1

Abra o arquivo jenkins.xml e copie os argumentos conforme abaixo. ele será corrigido permanentemente. Assim que terminar, reinicie sua máquina.

<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

1

No CentOS , a solução abaixo (que foi sugerida nos comentários de outra resposta) é a única que funcionou para mim:

  1. Vá para: Gerenciar Jenkins> Gerenciar nós e nuvens
  2. Clique no ícone de engrenagem no lado direito do nó (por padrão, haverá apenas um nó chamado Mestre)
  3. Clique em 'Script Console' à esquerda
  4. Digite o seguinte na janela do console: System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' 'unsafe-inline' data:;")
  5. Clique em Executar
  6. Você deve ver alguma saída na seção Resultado, semelhante à captura de tela abaixo:

Resultado do console de script

Meu problema específico era a falta de imagens / css nos relatórios do Serenity BDD. Depois de executar essas etapas, meus relatórios do Serenity tiveram todas as imagens / css renderizadas corretamente, incluindo relatórios de compilações que foram executadas antes dessa mudança. Esta solução também funcionará para qualquer relatório baseado em html publicado.


0

É tarde demais para responder, mas pensei em compartilhar.

Eu estava lutando com o Jenkins implantado no Tomcat, tentei executar o script, isso ajuda, mas vai embora se o tomcat for reiniciado.

Fez a correção permanente definindo a propriedade em catalina.properties no tomcat.

Arquivo de propriedades: tomcat_installation_dir / conf / catalina.properties Basta copiar e colar a linha abaixo em catalina.properties no último (você pode defini-lo em qualquer lugar apenas para não mexer com as propriedades existentes)

-Dhudson.model.DirectoryBrowserSupport.CSP = ""


0

Tive os mesmos problemas depois de adicionar HTTPS ao meu Jenkins. Caso você esteja tendo o mesmo problema, a solução é fácil - defina seu url do Jenkins para usar o protocolo HTTPS em vez de HTTP. Pode ser configurado via configuração jenkins -> url jenkins


0

Para definir a propriedade do sistema permanentemente, se estiver usando Jenkins-X , crie o arquivo myvalues.yamlno diretório atual, com o seguinte conteúdo:

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

Em seguida, reinicie a plataforma jenkins-x, o que pode ser feito atualizando-a:

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

Para evitar realmente atualizar a plataforma, basta atualizá-la à força para a mesma versão:

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

0

Para aqueles que estão usando o asciidoctor-maven-pluginplug-in para produzir um documento HTML a partir do arquivo asciidoc para publicá-lo posteriormente no Jenkins, atualize a configuração do plug-in e adicione o linkcssatributo:

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

-1

No Debian / Ubuntu , nas instalações do aptitude :

  • sudo vi /etc/default/jenkins
  • Adicione -Dhudson.model.DirectoryBrowserSupport.CSP=ao JAVA_ARGS(por exemploJAVA_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=" )
  • Reinicie Jenkins - service jenkins restart

Isso foi o suficiente para mim, mas para a lista completa de parâmetros veja esta resposta .


Por que isso foi rejeitado?
George Pligoropoulos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.