Agendando um trabalho no Jenkins

Agendando um trabalho no Jenkins

1. Introdução

Neste artigo, cobriremos várias maneiras de agendar jobs no Jenkins.

Começaremos com o agendamento de um trabalho simples que executa algo tão simples como imprimir uma mensagem de texto simples. E vamos evoluir o exemplo para agendar um trabalho que é acionado automaticamente por alterações em um repositório SCM, como GitHub, Bitbucket, etc.

2. Configuração inicial

Assumimos queJDK and Maven have been installed in Global Tool Configuration with names as JDK9.0.1 and Maven3.5.2, respectivamente, no servidor Jenkins.

Ele também assume quewe’ve got access to an SCM repository, como Bitbucket com um projeto Maven configurado corretamente.

3. Agendamento de um trabalho simples

Na página de configuração do trabalho, vamos rolar direto para a seçãoBuild Triggers. Uma vez que pretendemos criar um trabalho simples, vamos selecionar a caixa de seleção marcadaBuild periodically. Assim que selecionamos esta caixa de seleção, uma caixa de texto é exibida com o rótuloSchedule.

We have to provide value in a Cron-compliant format. Existem muitas informações disponíveis na página se clicarmos no ponto de interrogação ao lado da caixa.

Vamos digitar*/2 * * * * aqui, que representa um intervalo de dois minutos:

image

 

Ao sair da caixa de texto, podemos ver as informações logo abaixo da caixa. Ele nos diz sobre quando o trabalho será executado em seguida.

Vamos salvar o trabalho - em cerca de dois minutos, devemos ver o status da primeira execução do trabalho:

image

Como configuramos o trabalho para ser executado a cada dois minutos, devemos ver vários números de compilação quando voltarmos para o painel de trabalho depois de esperar algum tempo.

4. Criando um trabalho que pesquisa SCM

Vamos dar um passo à frente e criar um trabalho que extrai o código-fonte do repositório SCM, como o Bitbucket, e executa uma compilação.

Vamos criar um novo trabalho conforme explicado na seção anterior, com algumas modificações.

Na seçãoBuild Triggers,instead of selecting Build Periodically, let’s select Poll SCM. Assim que fizermos isso, devemos ver uma caixa de texto com LabelSchedule.

Vamos digitar*/5 * * * * nesta caixa, o que significa que queremos agendar o trabalho para ser executado a cada 5 minutos:

image

Vamos rolar até a seçãoSource Code Management. Ao selecionar o botão de opção próximo aGit, uma nova seção aparece rotulada comoRepositories.

This is where we need to configure details of our SCM repository. Vamos digitar a URL do repositório SCM no campo de textoRepository URL:

image

Também precisamos fornecer credenciais de usuário para que Jenkins possa acessar o repositório.

Vamos clicar no botãoAdd próximo a Credenciais, que exibirá uma tela pop-up para criar as credenciais do usuário.

Vamos selecionarKind comoUsername with Password. Teremos que digitar o nome de usuário e a senha nos campos de texto designados:

image

Ao clicar no botãoAdd, somos levados de volta à seçãoSource Code Management.

Vamos selecionar esta credencial de usuário na lista suspensa ao lado deCredentials:

image

Agora, a última coisa que precisamos fazer é configurar o script de construção.

Vamos rolar para baixo até a seçãoBuild, clique emAdd build stepe selecioneExecute Shell. Como estamos trabalhando em um projeto Maven no repositório SCM,we need to type mvn clean install, which will perform a Maven build.

Vamos tentar entender o que fizemos aqui.

Nós criamos um trabalho que está programado para ser executado a cada 5 minutos. The job’s been configured to pull source code from the master branch of the given Bitbucket repository.

Ele usará as credenciais de usuário fornecidas para efetuar login no Bitbucket.

Depois de extrair o código-fonte, o trabalho executará o script contendo um comando Maven fornecido.

Agora, se salvarmos e esperarmos aproximadamente cinco minutos, devemos ver a execução da compilação na seçãoBuild History no painel de trabalho.

OConsole Output deve mostrar a saída da construção Maven. Podemos ver na saída do console que o código-fonte foi extraído do Bitbucket e o comandomvn clean install foi executado:

image

Como é uma construção Maven,the console output might be very long depending on the number of Maven dependencies that are downloaded.

Mas no final da saída, devemos ver a mensagemBUILD SUCCESS.

5. Criação de um trabalho que usa pipeline como script

Até agora, vimos como criar jobs que são executados no horário programado predefinido.

Agora, vamos criar um trabalho que não esteja vinculado a nenhum cronograma específico. Em vez disso, vamos configurá-lo para disparar automaticamente sempre que houver um novo commit no repositório SCM.

Voltando ao painel do Jenkins, vamos clicar emNew Item. Desta vez, em vez deFreestyle project, selecionaremosPipeline. Vamos chamar este trabalho dePipelineAsScriptJob.

Ao clicar no botão OK, seremos direcionados para a página de configuração do pipeline. Esta página possui várias seções, como “General”,“Build Triggers”, “Advanced Project Options” e“Pipeline”.

Vamos rolar para baixo até a seção “Build Triggers” e selecionar a caixa de seleção ao lado deBuild when a change is pushed to Bitbucket. This option will be available only if we’ve installed the Bitbucket Plugin:

image

Vamos rolar para baixo até a seçãoPipeline. Precisamos selecionarPipeline Script no menu suspenso próximo aDefinition.

A caixa de texto logo abaixo desse menu suspenso aguarda a inserção do script. Existem duas maneiras de fazer isso.

Podemos digitar o script inteiro ouwe can make use of a utility provided by Jenkins, which is known as Pipeline Syntax.

Vamos escolher a segunda opção:

image

Ao clicar emPipeline Syntax, conforme destacado no diagrama acima, uma nova guia é aberta no navegador. Este é um utilitário útil onde podemos especificar a operação que desejamos realizar ethe tool will generate the script in Groovy para nós. Podemos então copiar o script e colá-lo na configuração do pipeline.

Vamos selecionarcheckout: General SCM na lista suspensaSample Step. Depois de fornecer o URL do Repo SCM e as credenciais do usuário, precisamos clicar no botãoGenerate Pipeline Script.

Isso gera o script na caixa de texto:

image

Vamos copiar este script e salvá-lo em algum lugar para uso posterior.

Na mesma página, vamos rolar para cima e selecionarwithMaven: Provide Maven environment no menu suspensoSample Step. Deve-se notar aqui, quethis option will be available only if Pipeline Maven Integration Plugin is installed.

Precisamos selecionar os nomes das instalações Maven e JDK ao lado dos menus suspensos correspondentes. Precisamos clicar no botãoGenerate Pipeline Script.

Isso gera o script na caixa de texto:

image

Vamos salvar o script.

Ainda existem mais alguns scripts que precisamos gerar. Vamos selecionarnode: Allocate node na lista suspensaSample Step, digitemaster no campo de textoLabel e clique emGenerate Pipeline Script:

image

Vamos salvar o script.

E último.

Vamos selecionarstage: Stage na lista suspensaSample Step, digitescm no campo de textoStage Name e clique emGenerate Pipeline Script:

image

Vamos salvar.

É hora de agrupar todos os scripts gerados até agora e costurá-los juntos:

node('master') {
    stage('scm') {
        checkout([$class: 'GitSCM',
          branches: [[name: '*/master']],
          doGenerateSubmoduleConfigurations: false,
          extensions: [],
          submoduleCfg: [],
          userRemoteConfigs: [[credentialsId: 'e50f564f-fbb7-4660-9c95-52dc93fa26f7',
          url: 'https://[email protected]/projects/springpocrepo.git']]])
    }

    stage('build') {
        withMaven(jdk: 'JDK9.0.1', maven: 'Maven3.5.2') {
            sh 'mvn clean install'
        }
    }
}

A primeira instrução,node(‘master') no script acima,indicates that the job will be executed on a node named master, que é o nó padrão no servidor Jenkins.

Vamos copiar o script acima para a caixa de texto na seçãoPipeline:

image

Vamos salvar esta configuração.

Agora, há apenas uma coisa que foi deixada de fora. Precisamos configurar um Webhook no Bitbucket. The Webhook is responsible for sending out a push notification to Jenkins server, whenever a particular event takes place in Bitbucket.

Vamos dar uma olhada em como configurá-lo.

Vamos fazer login no Bitbucket e selecionar um repositório. Devemos ver uma opçãoSettings na coluna do lado esquerdo. Vamos clicar nele e devemos ver uma opçãoWebhooks na seçãoWORKFLOW. Vamos criar um novo Webhook.

Precisamos fornecer algum nome para este webhook no campoTitle. Também precisamos fornecer um URL para o webhook no campoURL. Essa URL precisa apontar para um determinado ponto de extremidade da API REST fornecido pelo Jenkins, e esse ponto de extremidade ébitbucket-hook.

It must be noted that the URL MUST end with a trailing slash:

image

 

Ao configurar o Webhook acima, selecionamos a opçãoRepository push. This means Bitbucket will send a notification to Jenkins server whenever a push happens.

Esse comportamento pode ser modificado; existem várias opções diferentes para você escolher.

Por enquanto, vamos com a opção padrão, ou seja,Repository Push.

We can setup webhook in Github, too; here algumas informações úteis sobre como configurar isso.

Resumindo: criamos um script de pipeline na linguagem Groovy -that should pull the source code from the master branch do repositório SCM fornecido (usando as credenciais de usuário fornecidas),whenever there’s a push in the repositoryeexecute mvn clean install command on the Jenkins server.

Deve-se notar que este trabalho não será executado em nenhum momento específico. Em vez disso, ele vai esperar até que haja um push no branch master do repositório SCM.

Assim que houver um novo evento push, veremos uma nova execução na seção“Build History” no painel de trabalho do Jenkins.

Devemos ver uma nova construção sendo iniciada com um statuspending próximo a ela.

Em alguns segundos, esta compilação deve iniciar a execução, e poderemos ver o log completo emConsole Output.

The first statement in the console output says “Started by Bitbucket push by..” – isso significa que a construção foi acionada automaticamente quando um push ocorreu no Bitbucket:

image

 

Se tudo correr bem, a compilação deve ser concluída com êxito.

6. Crie um trabalho que use Jenkinsfile

É possível NÃO escrever nenhum script no pipeline do Jenkins e ainda conseguir a execução da compilação sendo acionada pelo Bitbucket Webhook.

Para fazer isso,we have to create a new file in Bitbucket and name it as Jenkinsfile. O script de pipeline precisa ser transferido para esse arquivo Jenkins com uma pequena modificação. Vamos ver exatamente como fazer isso.

Vamos criar um novo pipeline no Jenkins e chamá-lo dePipelineWithJenkinsfile.

Na página de configuração do pipeline, selecionaremosPipeline script from SCM próximo aDefinition na seçãoPipeline. Veremos um menu suspenso com diferentes opções ao lado deSCM. Vamos escolherGit no menu suspenso.

Em seguida, precisamos fornecer a URL do repositório do Bitbucket e credenciais do usuário. Vamos garantir quethe text field next to Script Path contains the default value,i.e., Jenkinsfile:

image

 

No que diz respeito ao Jenkins, isso é tudo que precisamos configurar.

No entanto, temos que criar o Jenkinsfile no repositório; então, vamos criar um novo arquivo de texto, nomeá-lo como Jenkinsfile e usar este script simples e groovy:

node('master') {
    stage('scm') {
        checkout scm
    }
    stage('build') {
        withMaven(jdk: 'JDK9.0.1', maven: 'Maven3.5.2') {
            sh 'mvn clean install'
        }
    }
}

Esse script é quase o mesmo que o script de pipeline que criamos na seção anterior, com apenas uma modificação. A instrução emstage(‘scm') não precisa das informações de URL e credenciais do usuário. Em vez disso, tudo o que precisa écheckout scm.

E é isso. The moment we commit this file into Bitbucket, it’ll trigger the build in Jenkins - e devemos ver a compilação sendo disparada emBuild History.

A única diferença entre esta seção e a anterior é quewe defined the pipeline script in the Bitbucket repository.

Portanto,the build script is part of the source code of the project that needs to be built. Não estamos mantendo o script no próprio Jenkins.

Em vez disso, Jenkins tem conhecimento dos detalhes do repositório SCM e do arquivo de script. Whenever there is a push to this repository, the script in Jenkinsfile gets executed on the Jenkins server.

7. Conclusão

Neste tutorial, vimos como as tarefas podem ser configuradas e agendadas no Jenkins usando várias estratégias.

Também vimos como configurar um trabalho no Jenkins para que seja acionado automaticamente, com base em certas ações realizadas no repositório SCM, como o Bitbucket.