Respostas:
Você não pode executar o script Pipeline localmente, pois seu objetivo é criar scripts para o Jenkins. (Essa é uma das razões pelas quais é melhor manter seu Jenkinsfile
código curto e limitado que realmente lida com os recursos do Jenkins; sua lógica de compilação real deve ser tratada com processos externos ou ferramentas de compilação que você chama por uma linha sh
ou bat
etapa).
Se você quiser testar uma mudança para Jenkinsfile
viver, mas sem enviá- la, use o recurso Replay adicionado em 1.14
O JENKINS-33925 rastreia o desejado para uma estrutura de teste automatizada.
Eu tenho uma solução que funciona bem para mim. Ele consiste em um jenkins local em execução no docker e um gancho da web git para acionar o pipeline no jenkins local em cada consolidação. Você não precisa mais enviar para o seu repositório github ou bitbucket para testar o pipeline.
Isso foi testado apenas em um ambiente Linux.
É bastante simples fazer isso funcionar, embora essa instrução seja um pouco longa. A maioria das etapas está lá.
Crie um arquivo chamado Dockerfile no lugar de sua escolha. Estou colocando em /opt/docker/jenkins/Dockerfile
preenchê-lo com isso:
FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
Construa a imagem local_jenkins
Você precisará fazer isso apenas uma vez ou depois de adicionar algo ao Dockerfile.
$ docker build -t local_jenkins /opt/docker/jenkins/
Iniciar e reiniciar local_jenkins
De tempos em tempos, você deseja iniciar e reiniciar o jenkins facilmente. Por exemplo, após uma reinicialização da sua máquina. Para isso, criei um pseudônimo que coloquei .bash_aliases
na minha pasta pessoal.
$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases # To make it work
Verifique se a /opt/docker/jenkins/jenkins_home
pasta existe e se você possui direitos de leitura e gravação.
Para iniciar ou reiniciar o seu jenkins, digite:
$ localjenkinsrestart
Tudo o que você faz no jenkins local será armazenado na pasta / opt / docker / jenkins / jenkins_home e preservado entre as reinicializações.
Crie uma chave de acesso ssh no docker jenkins
Esta é uma parte muito importante para que isso funcione. Primeiro, iniciamos o contêiner do docker e criamos um shell bash para ele:
$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Agora você entrou no contêiner do docker, isso pode ser visto por algo como jenkins@e7b23bad10aa:/$
no seu terminal. O hash após o @ certamente será diferente.
Crie a chave
jenkins@e7b23bad10aa:/$ ssh-keygen
Pressione enter em todas as perguntas até receber o prompt de volta
Copie a chave para o seu computador. No contêiner do docker, seu computador é 172.17.0.1, você deve se perguntar.
jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1
user = seu nome de usuário e 172.17.0.1 é o endereço IP do seu computador a partir do contêiner do docker.
Você precisará digitar sua senha neste momento.
Agora vamos tentar concluir o loop enviando ssh para o seu computador a partir do contêiner do docker.
jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
Desta vez, você não precisa digitar sua senha. Se o fizer, algo deu errado e você deve tentar novamente.
Agora você estará na pasta inicial do seu computador. Experimente ls
e dê uma olhada.
Não pare por aqui, pois temos uma cadeia de conchas ssh da qual precisamos sair.
$ exit
jenkins@e7b23bad10aa:/$ exit
Certo! Agora estamos de volta e prontos para continuar.
Instale seu Jenkins
Você encontrará o Jenkins local no navegador em http: // localhost: 8787 .
Na primeira vez em que você apontar o navegador para o Jenkins local, você será agraciado com um Assistente de Instalação. Os padrões são bons, mas certifique-se de instalar o plugin do pipeline durante a instalação.
Configure seu jenkins
É muito importante que você ative a segurança baseada em matriz em http: // localhost: 8787 / configureSecurity e conceda todos os direitos adicionando-se à matriz e marque todas as caixas. (Existe um ícone de marcar todas as caixas na extrema direita)
Jenkins’ own user database
como o domínio de segurançaMatrix-based security
na seção AutorizaçãoUser/group to add:
e clique no [ Add ]
botãoPrevent Cross Site Request Forgery exploits
está desmarcada. (Como esse Jenkins só pode ser acessado no seu computador, isso não é um problema)[ Save ]
e saia do Jenkins e faça o login novamente apenas para garantir que funcione.
Caso contrário, é necessário recomeçar do zero e esvaziar a /opt/docker/jenkins/jenkins_home
pasta antes de reiniciarAdicione o usuário git
Precisamos permitir que nosso gancho git faça login no Jenkins local com direitos mínimos. Apenas ver e criar empregos é suficiente. Portanto, criamos um usuário chamado git
com senha login
.
Direcione seu navegador para http: // localhost: 8787 / securityRealm / addUser e adicione git
como nome de usuário e login
senha. Clique em [ Create User ]
.
Adicione os direitos ao usuário git
Vá para a página http: // localhost: 8787 / configureSecurity no seu navegador. Inclua o usuário git na matriz:
git
no campo User/group to add:
e clique em[ Add ]
Agora é hora de marcar as caixas para obter direitos mínimos para o usuário git. Apenas estes são necessários:
Verifique se a Prevent Cross Site Request Forgery exploits
caixa de seleção está desmarcada e clique em[ Save ]
Assumimos que temos o nome de usuário user
e nosso projeto habilitado para git com o qual Jenkinsfile
ele é chamado project
e está localizado em/home/user/projects/project
No seu http: // localhost: 8787 Jenkins, adicione um novo projeto de pipeline. Eu o nomeei hookpipeline para referência.
New Item
menu Jenkinshookpipeline
[ OK ]
Poll SCM
na seção Build Triggers. Deixe o agendamento em branco.Pipeline script from SCM
Repository URL
campo insirauser@172.17.0.1:projects/project/.git
Script Path
campo insiraJenkinsfile
Vá para a /home/user/projects/project/.git/hooks
pasta e crie um arquivo chamado post-commit
que contém este:
#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'
curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"
Torne este arquivo executável:
$ chmod +x /home/user/projects/project/.git/hooks/post-commit
Teste o gancho pós-confirmação:
$ /home/user/projects/project/.git/hooks/post-commit
Faça check-in no Jenkins se o projeto do seu hookpipeline foi acionado.
Finalmente, faça algumas alterações arbitrárias no seu projeto, adicione as alterações e faça uma confirmação. Agora, isso acionará o pipeline em seu Jenkins local.
Dias felizes!
docker build -t local_jenkins /opt/docker/jenkins/Dockerfile
com docker build -t local_jenkins /opt/docker/jenkins
porque Docker reclamou "incapaz de preparar contexto: contexto deve ser um diretório".
$ docker inspect jenkins | grep Gateway
ssh user@docker.for.mac.localhost
vez de usar o endereço IP. Também verifique se você ativou o recurso de login remoto a partir das Preferências MacOS Sistema -> menu de pasta compartilhada
TL; DR
Versão longa
O teste do Jenkins Pipeline se torna cada vez mais doloroso. Diferentemente da abordagem clássica de configuração da tarefa declarativa, em que o usuário estava limitado ao que a interface do usuário expôs o novo Jenkins Pipeline, é uma linguagem de programação completa para o processo de construção, onde você mistura a parte declarativa com seu próprio código. Como bons desenvolvedores, também queremos fazer alguns testes de unidade para esse tipo de código.
Há três etapas que você deve seguir ao desenvolver os pipelines Jenkins. A etapa 1. deve cobrir 80% dos casos de uso.
Exemplos
O repositório pipelineUnit GitHub contém alguns exemplos de Spock sobre como usar a estrutura de teste da Jenkins Pipeline Unit
Jenkins possui um recurso 'Replay', que permite reproduzir rapidamente um trabalho sem atualizar as fontes:
No momento da escrita (final de julho de 2017) com o plug-in Blue Ocean, é possível verificar a sintaxe de um pipeline declarativo diretamente no editor de pipeline visual . O editor funciona a partir da interface do usuário do Blue Ocean quando você clica em "configurar" apenas para projetos do github (este é um problema conhecido e eles estão trabalhando para que também funcionem no git etc.).
Mas, como explicado nesta pergunta, você pode abrir o editor navegando para:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
Em seguida, clique no meio da página e pressione Ctrl+S
, isso abrirá uma área de texto onde você poderá colar um script declarativo de pipeline. Quando você clica em Atualizar , se houver um erro de sintaxe, o editor informará onde está o erro de sintaxe. Como nesta captura de tela:
Se não houver erro de sintaxe, a área de texto será fechada e a página visualizará seu pipeline. Não se preocupe, isso não salvará nada (se for um projeto do github, ele confirmará a alteração do Jenkinsfile).
Eu sou novo no Jenkins e isso é bastante útil, sem isso eu tive que cometer um arquivo Jenkins muitas vezes, até que funcione (muito irritante!). Espero que isto ajude. Felicidades.
Um pouco atrasado para a festa, mas foi por isso que escrevi jenny
, uma pequena reimplementação de algumas etapas principais do arquivo Jenkins. ( https://github.com/bmustiata/jenny )
Tanto quanto eu sei este plugin Pipeline - é o "mecanismo" da nova mecânica do Jenkinsfile, por isso estou certo de que você poderia usá-lo para testar localmente seus scripts.
Não tenho certeza se são necessárias etapas adicionais quando você o copia em um arquivo Jenkins, no entanto, a sintaxe etc. deve ser exatamente a mesma.
Editar: encontrou a referência no "mecanismo", verifique esta descrição do recurso, último parágrafo, primeira entrada.
Na minha configuração de desenvolvimento - faltando um editor Groovy adequado - muitos problemas do Jenkinsfile se originam de simples erros de sintaxe . Para resolver esse problema, você pode validar o arquivo Jenkins contra sua instância do Jenkins (executando em $JENKINS_HTTP_URL
):
curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate
O comando acima é uma versão ligeiramente modificada de https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line
Além do recurso de reprodução que outros já mencionaram (o mesmo se aplica à sua utilidade!), Achei o seguinte útil também:
Coloque sua chave SSH no seu perfil Jenkins e use o linter declarativo da seguinte maneira:
ssh jenkins.hostname.here declarative-linter < Jenkinsfile
Isso fará uma análise estática no seu arquivo Jenkins. No editor de sua escolha, defina um atalho de teclado que execute esse comando automaticamente. No Código do Visual Studio, que é o que eu uso, vá para Tarefas> Configurar Tarefas e use o seguinte JSON para criar um comando Validar Jenkinsfile :
{
"version": "2.0.0",
"tasks": [
{
"label": "Validate Jenkinsfile",
"type": "shell",
"command": "ssh jenkins.hostname declarative-linter < ${file}"
}
]
}
Estou usando o replay futuro, para fazer algumas atualizações e executar rapidamente.
Com algumas limitações e para pipelines com script, eu uso esta solução:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()