Jenkins
Fernando Anselmo
http: // fernandoanselmo. orgfree. com/ wordpress/
Versão 1.0 em 28 de junho de 2020
Resumo
ão é a mais intelectual das espécies que sobrevive; também não é a mais forte; mas
a espécie que sobrevive é a única capaz de se adaptar melhor às mudanças no ambiente
em que se encontra. (C. Megginson, interpretando Charles Darwin). Jenkins é uma
poderosa ferramenta de código aberto destinado a executar Integração Contı́nua criada com
a linguagem Java o que está associada a sua portabilidade para os mais diversos sistemas
operacionais. Permite executar uma lista predefinida de etapas (denominado de pipeline), como
por exemplo baixar o código-fonte de um repositório na Web, compilar conforme comandos da
linguagem e construir um executável a partir das classes resultantes e publicá-la em um servidor
definido. O gatilho para esta execução pode ser baseado em uma hora, um evento ou mesmo
inciado por demanda.
N
1 Entrega Contı́nua
A medida que o número de trabalho a realizar aumenta, torna-se cada vez mais difı́cil para alguém
mantê-los. Especialmente nos casos em que o trabalho é uma simples cópia que foi modificada a
partir de um outro trabalho, acaba-se por tornar crucial manter uma determinada consistência.
A entrega contı́nua (Continuous Delivery ou CD) é a prática de fornecer um software com mais
qualidade e frequência. As práticas de CD podem incluir as seguintes vantagens:
❼ Promoção de código automatizado com qualidade.
❼ Estratégia de ramificação do projeto a ser entregue.
❼ Construções distribuı́das e razoavelmente mantidas.
❼ Teste automatizado, distribuı́do ou paralelo.
❼ Provisionamento de um ambiente completamente atualizado e automatizado.
Sendo que um dos componentes fundamentais da CD é a Integração Contı́nua (Continuous Integration
ou CI) em funcionamento. E é importante possuirmos um modelo de CI amplamente funcional.
Principalmente se podemos considerar os seguintes parâmetros como: pipeline de CI codificáveis,
automação na geração dos executáveis do projeto e ambientes de construção reproduzı́veis com alta
disponibilidade.
Jenkins
1.0
Folha 1
Um pipeline de CI é um conjunto de tarefas sequenciais ou paralelas (às vezes uma combinação de
ambas). São configurados através de uma simples interface visual.
CD/CI é um processo no qual todo o trabalho de desenvolvimento se encontra integrado o mais cedo
possı́vel. Os artefatos resultantes são criados e testados automaticamente. Esse processo permite
identificar erros em um estágio inicial do projeto. O Jenkins[1] é a ferramenta destina a fornecer
toda essa funcionalidade.
Figura 1: Logo do Jenkins
Esta apostila não possui a pretensão de ensinar a usar o Jenkins1 , mas mostrar como usar um
contêiner com o Jenkins e criar alguns pipeline de forma que possamos ter um ambiente totalmente
funcional. Assim sedo podemos usá-la como um ponto de partida para compreendermos e colhermos
os benefı́cios da CD/CI. Todos os comandos foram executados no sistema operacional Ubuntu.
2 Jenkins no Docker
Criar uma pasta que associará o contêiner:
✩ mkdir ✩HOME/jenkins home
Fornecer permissões a pasta de modo que o contêiner possa acessá-la:
✩ chown 1000 ✩HOME/jenkins home
Permitir o uso do arquivo Sock do Docker:
✩ sudo chmod 777 /var/run/docker.sock
Baixar a imagem disponı́vel:
✩ docker pull jenkins/jenkins
Criar o container:
✩ docker run --name meu-jenkins -d -v /var/run/docker.sock:/var/run/docker.sock
-v ✩(which docker):/usr/bin/docker -v ✩HOME/jenkins home:/var/jenkins home
-p 8081:8080 -p 50000:50000 jenkins/jenkins
Para executar abrir um navegador e acessar a URL http://localhost:8081.
2.1
Proceder a Instalação
Na primeira vez que acessamos o Jenkins devemos instalar o ambiente, verificar qual o Token do
Jenkins para instalação:
✩ docker logs meu-jenkins
1
Jenkins é um software em constante evolução. Existem livros que auxiliam na administração do mesmo, aqui
pretendo manter um padrão de simplicidade.
Jenkins
1.0
Folha 2
Localizar a linha:
Jenkins initial setup is required. An admin user has been created
and a password generated.
Please use the following password to proceed to installation:
<<Número do TOKEN>>
Após a criação do contêiner, ao acessar a URL http://localhost:8081/:
Figura 2: Solicitação do Token
Instalar os plugins sugeridos:
Figura 3: Instalação dos plugins
Escolher o usuário e senha, algo bem secreto como admin—admin:
Figura 4: Criação do Usuário e Senha
Jenkins
1.0
Folha 3
Informar a URL do Jenkins e clicar no botão ”Salvar e Finalizar”:
Figura 5: Criação do Usuário e Senha
Parabéns o Jenkins foi instalado com sucesso.
Figura 6: Criação do Usuário e Senha
3 Entrar no Jenkins
Algumas vezes precisamos de algumas informações relacionadas a máquina do Jenkins, então
precisamos acessá-lo, no contêiner podemos fazer isso através do comando: // ✩ docker exec -it
meu-jenkins /bin/bash
E estaremos dentro deste, podemos ver a versão do sistema: ✩ cat /etc/os-release
para sair digitamos o comando: ✩ exit
Este comando lista todos os contêineres que estão ativos: ✩ docker container ls
Observamos que cada contêiner possui um CONTAINER ID, este é usado, por exemplo para
realizar uma inspeção de alguns detalhes deste: ✩ docker container inspect [CONTAINER ID]
3.1
Para atualizar o Jenkins no Docker
Atualizações de plugins no Jenkins podem ser realizadas direto no ”Gerenciador do Jenkins”, porém
quando este informar que existe uma nova versão disponı́vel, não é necessário baixá-la, apenas
copiar o link do arquivo jenkins.war e proceder da seguinte forma:
Entrar no container do Jenkins:
✩ docker exec -u 0 -it meu-jenkins bash
Jenkins
1.0
Folha 4
Baixar a última versão:
✩ wget [link do jenkins.war]
Mover para o local correto:
✩ mv ./jenkins.war /usr/share/jenkins
Mudar a permissão:
✩ chown jenkins:jenkins /usr/share/jenkins/jenkins.war
Sair do bash:
✩ exit
Reiniciar o container:
✩ docker restart jenkins
4 Pipelines
Como já dissemos, um pipeline nada mais é do que uma sequencia de comandos que o Jenkins
executará. A partir da versão 2.0 eles tomaram como base os arquivos script do Groovy. A
documentação completa pode ser encontrada nesta URL https://www.jenkins.io/doc/book/
pipeline/syntax/. Nesta apostila vamos ver alguns passos básicos para iniciarmos sem problemas.
Por padrão possuem a seguinte estrutura:
1
2
3
4
5
6
7
8
9
10
11
pipeline {
agent any
stages {
stage(’Descritivo’) {
steps {
// comandos
}
}
...
}
}
Um script pode possuir vários estágios (stage) para executar e são sincronizados e dependentes, ou
seja, não pode ocorrer erro no antecessor senão todo o processo será interrompido.
4.1
Hello World
Vamos criar um simples script para entendermos como esse conceito funciona. Na tela principal do
Jenkins clicar em ”New Item”.
Na opção Item Name informamos Hello World. E escolhemos o modo Pipeline, e confirmamos
ao clicar em OK.
Se já conhece o Jenkins notará que esta opção é bem simples e basicamente se concentra na seção
Pipeline na qual escrevemos nosso script:
1
2
pipeline {
agent any
Jenkins
1.0
Folha 5
stages {
stage(’Hello’) {
steps {
echo ’Hello World’
}
}
}
3
4
5
6
7
8
9
10
}
Apply pode ser utilizado para verificar se existe qualquer problema na sintaxe. E uma vez terminado
clicar em Save.
Para executar o script clicar em Build Now. Neste momento o Jenkins agenda seu script para
ser executado assim que existir um agente livre. Pense que vários deles podem estar em execução
neste momento, se assim ocorrer, e para não sobrecarregar a máquina, o Jenkins trabalha com
sincronização e destina um serviço. Essa quantidade de serviços rodando simultaneamente pode ser
configurada no Gerenciador.
A seguinte tela será mostrada caso seu script rode corretamente:
Figura 7: Script Hello World executado com sucesso
Ao clicarmos nessa área verde uma opção para visualizar o LOG será mostrada e a nossa mensagem
aparecerá.
4.2
Hello World Docker
Sabemos que o Docker possui uma imagem de teste chamada hello-world e vamos usá-la para
testar se está tudo OK. Proceda os mesmos passos descritos anteriormente para criarmos um novo
pipeline chamado Docker Hello com o seguinte script:
1
2
3
4
5
6
7
8
9
10
pipeline {
agent any
stages {
stage("Baixar Imagem") {
steps {
sh ’docker pull hello-world’
}
}
stage("Executar Hello") {
steps {
Jenkins
1.0
Folha 6
sh ’docker run hello-world’
11
}
12
}
13
}
14
15
}
E assim o Jenkins envia um comando ao Docker da máquina hospedeira (não dentro do contêiner) para
trazer a imagem hello-world do repositório Docker e em seguida criar um contêiner. Observamos
que esses estágios são totalmente dependentes pois se não conseguir trazer a imagem não teria
sentido de criar um contêiner.
Após sua execução vamos dar o seguinte comando na máquina local:
✩ docker images
Perceberemos agora a existência da imagem hello-world e o comando:
✩ docker ps -a
Observamos que agora possuı́mos um novo contêiner já parado. Vamos agora executar o mesmo
processo, porém ao término de mostrar a mensagem eliminar tanto o contêiner quanto a imagem.
Sabemos que para apagar um contêiner devemos dar o comando:
✩ docker rm [Cont^
einer ID]
E para apagarmos a imagem: ✩ docker rmi [Imagem ID]
Apague ambos manualmente para não deixar nenhuma trilha no seu Docker. Lembre-se que o
Jenkins só vai fazer o que pediu, então partimos da premissa que devemos conhecer todos os
comandos que o Jenkins executará. Primeiro passo será conhecer o comando para localizar o ID do
contêiner:
✩ docker ps -a --quiet --filter ancestor=[nome imagem]
Que lista todos os IDs dos contêineres parados ou não (opção -a --quiet) que pertencem a uma
determinada imagem (opção ancestor do filter).
A segunda parte do problema e próximo passo está em localizar o ID da imagem criada, que é
resolvido com o comando: ✩ docker images [nome imagem] --quiet
Que lista apenas o ID (opção --quiet) de uma determinada imagem definida em [nome imagem].
Pronto, agora basta sabermos que no script podemos criar uma variável que armazena os IDs tanto
do contêiner quanto da imagem para logo em seguida eliminá-los:
variável = sh(script: "[comando]", returnStdout: true).trim()
Sendo assim, modificamos nosso script para:
1
2
3
4
5
6
7
8
9
10
pipeline {
agent any
stages {
stage("Baixar Imagem") {
steps {
sh ’docker pull hello-world’
}
}
stage("Executar Hello") {
steps {
Jenkins
1.0
Folha 7
sh ’docker run hello-world’
11
}
12
}
stage("Limpar") {
steps {
script {
containerID = sh(script: "docker ps -a --quiet --filter ancestor=hello-world",
returnStdout: true).trim()
sh "docker rm ✩{containerID}"
imagemID = sh(script: "docker images hello-world --quiet", returnStdout:
true).trim()
sh "docker rmi ✩{imagemID}"
}
}
}
13
14
15
16
17
18
19
20
21
22
23
}
24
25
}
Observamos que ganhamos mais um estágio. Nesse novo as ações devem estar dentro de uma tag
script pois precisamos criar uma variável para conter nossos ID. Esse estágio ”Limpar”poderia ser
dividido em 22 , ou seja, a criação de estágios busca uma melhor organização para seu pipeline e
cabe ao Administrador resolver o resultado mais organizado3 .
4.3
Obter parâmetros
Parâmetros são essenciais para um pipeline, imaginemos que temos 4 ambientes: Desenvolvimento
(DEV), Teste (TST), Homologação (HML) e Produção (PRD). Cada um desses ambientes define
uma porta diferente para o Docker, uma solução seria criar 4 pipelines idênticos mudando somente
o detalhe da porta (ou qualquer outro), porém devemos nos atentar na hora da manutenção e ter
que corrigir erros em quatro pipelines (ao invés de um). Não seria então mais coerente criarmos um
único pipeline e receber como parâmetro o ambiente?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pipeline {
agent any
parameters {
string(name: "COMMIT", defaultValue: "*/development", description: "Informe o
CommitID")
choice(name: "AMBIENTE", choices: ["DEV", "TST", "HML", "PRD"], description:
"Ambiente a executar")
}
stages {
stage("Execuç~
ao") {
steps {
script {
if (params.AMBIENTE.equals("DEV")) {
PORTA = "8080"
}
if (params.AMBIENTE.equals("TST")) {
PORTA = "8081"
}
if (params.AMBIENTE.equals("HML")) {
PORTA = "8082"
2
3
Primeiro remove o Contêiner e em seguida a imagem.
Compreenda que não existe uma receita de bolo.
Jenkins
1.0
Folha 8
}
if (params.AMBIENTE.equals("PRD")) {
PORTA = "8083"
}
19
20
21
22
}
echo "Aqui os dados: ✩{params.COMMIT} e ✩{params.AMBIENTE}"
echo "Pode usar assim: ✩{PORTA}"
echo "Ou assim: " + PORTA
23
24
25
26
}
27
}
28
}
29
30
}
Criamos para este pipeline dois parâmetros, o primeiro obtém o ID do Commit feito no GitHub (o
último pode ser conseguido por ”*/branch”) e o segundo define em qual ambiente será executado.
E se for, por exemplo, escolhido o ambiente de teste clicando na área verde temos:
Figura 8: Saı́da do Pipeline
Como este é um simples exemplo apenas mostramos no estágio o conteúdo dos parâmetros.
Um dado interessante: existe a opção ”This project is parameterized ”e assim que for salvo esta
opção conterá os dois parâmetros aqui descritos. Então qual a vantagem de se colocar no script? É
assim que está definido na documentação, então para não ocorrermos no perigo de em próximas
versões essa opção desaparecer já sabemos como proceder.
4.4
Obter arquivos do Github
Nossos arquivos devem estar em um local aonde o Jenkins poderá buscá-los e proceder os passos
necessários para transformá-los no artefato final. Devemos pensar na seguinte situação:
Figura 9: Ciclo de Desenvolvimento
No passo 1 os desenvolvedores planejam e discutem como será o artefato a ser realizado, no passo
2 sobem os códigos fontes necessários ao projeto para o GitHub, no passo 3 o Jenkins obtém esses
códigos e começar a processar o pipeline que está descrito no passo 4 executando todos os processos
necessários tais como compilação do código, execução do SonarQube para atestar a qualidade do
Jenkins
1.0
Folha 9
que foi disponibilizado está de acordo com as diretrizes da Empresa e ao término, no passo 5 cria a
imagem e publica o contêiner.
Podemos ver que não existe qualquer mágica nesse processo, somente a automatização de modo
que se não tivéssemos o Jenkins para realizá-los seria manual ou através do uso de qualquer outra
ferramenta que trabalhe de modo similar como o Bamboo, Buildbot, Apache Gump ou o Travis CI
que são seus concorrentes mais diretos.
Considerando que já possui uma conta no GitHub de Administrador ativa, devemos informar para
o Jenkins criar uma credencial, para isso, a partir da tela principal devemos acessar Credentials ⊲
System ⊲ Global credentials e selecionar a propriedade Add Credentials.
Em Username informar o usuário administrador do repositório, em Password sua senha e em
Description a que se refere (não preencha o campo ID) e quando pressionarmos o botão OK um
ID será criado para este registro. Salve-o pois o utilizaremos no script para acessar o GitHub.
Figura 10: Credencial criada
Observamos que na imagem a credencial criada para meu usuário. Não tem medo de mostrá-la?
Não, pois só é acessı́vel pelo meu Jenkins que associa este número ao meu usuário e a senha4 . Ou
seja, mesmo que saiba esse número não lhe servirá absolutamente para nada. Por isso o Jenkins
mostra que é uma área não restrita.
5 Criação de um projeto completo
Podemos criar qualquer tipo de projeto e para tentar deixar bem simples aqui faremos um Projeto
JSP que mostrará uma página, como dissemos a mesma ideia pode ser aplicada a qualquer projeto,
então usemos esse somente como um ponto de partida.
5.1
Construção do projeto
Usamos o Spring Tool Suite[2] para criar o projeto. File ⊲ New ⊲ Project..., na janela que se abre
procurar por Web ⊲ Dynamic Web Project. Clicar no botão Next. Informar o nome do projeto (por
Exemplo tstJenkins), não esquecer de modificar a opção ”Use an environment JRE”para a versão
correta da Java Runtime desejada e pressionar o botão Finish. Ao término pedirá para mudar a
perspectiva da janela para a visão J2EE. Se está tudo correto teremos a seguinte situação na aba
Project Explorer :
4
Como podemos perceber está bem escondida, então não se preocupe.
Jenkins
1.0
Folha 10
Figura 11: Projeto Decus criado
No projeto na pasta WebContent vamos criar um arquivo chamado ”index.jsp”com o seguinte
conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<title>Exemplo com Jenkins e Docker</title>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1 style="color:black">JSP publicado com Jenkins</h1>
Essa aplicaç~
ao utiliza o Jenkins para realizar uma publicaç~
ao em 4 fases:
<ul>
<li>Obter os códigos no GitHub</li>
<li>Gerar o arquivo WAR com o Maven</li>
<li>Criar um cont^
einer em enviá-lo para o DockerHub</li>
<li>Executar o cont^
einer da aplicaç~
ao</li>
</ul>
</body>
</html>
Sim, poderia ser também ”index.html”visto que não existe um único código JSP aqui, porém como
dissemos antes, use este para um ponto de partida para qualquer projeto que pode ser desde a
criação de dashboard para Análise de Dados até mesmo algo mais complexo. O objetivo desta
apostila é mostrar os caminhos do Jenkins e não a concepção de projetos.
5.2
Construção da Imagem para a Aplicação
Sabemos que o Docker trabalha com imagens e o Jenkins necessita conhecer como é esse arquivo
para poder gerá-la, na raiz do projeto devemos criar um arquivo chamado Dockerfile5 com o
seguinte conteúdo:
1
2
FROM tomcat:9
COPY target/*.war /usr/local/tomcat/webapps/tstJenkins.war
Como base usaremos a imagem do servidor Apache TomCat 96 e colocamos o arquivo war (Web
Archive) no ponto correto para sua execução.
5
6
Cuidado com as maiúsculas e minúsculas pois o nome deve ser exatamente este.
Ou utilize outra de acordo com a configuração do servidor do seu projeto.
Jenkins
1.0
Folha 11
5.3
Apache Maven
O STS já é totalmente compatı́vel com o Apache Maven[3] que é utilizado para a construção de
todo o código então não precisamos nos preocupar muito com essa parte, porém o Jenkins precisa
conhecer esse endereço, então devemos proceder sua instalação. Para isso basta baixar o arquivo
compactado (apache-maven-3.6.3-bin.zip), descompactá-lo em uma pasta (a partir da raiz) e criar
uma variável de ambiente chamada mvnHome de modo que podemos ter o acesso fácil a essa
pasta.
Outro detalhe que precisamos é transformar o projeto para Maven de modo que o Jenkins possa
realizar a compilação sem problemas. Clicar com o botão direito do mouse no projeto e acessar a
opção: Configure ⊲ Convert to Maven Project. Na janela apenas pressione o botão Finish. Se tudo
está correto observamos que o projeto ganhou uma letra M o que indica agora é um projeto padrão
Maven. Então foi criado um arquivo chamado pom.xml.
Neste arquivo adicionar as seguintes dependências:
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
A primeira informa ao Maven que é um projeto JavaWeb e a segunda que deve ser adicionado o
JUnit para a realização de testes unitários, é ideal que o Desenvolvedor se preocupe em garantir
que todo o código entregue estará testado e funcionando para isso é essencial a implementação dos
testes unitários.
5.4
GitHub
Obviamente precisamos de uma conta no GitHub para compartilhar o projeto (ou outro gerenciador
de código). Clicar com o botão direito do mouse no projeto e acessar a opção: Team ⊲ Share Project.
Marcar a opção Use or create repository in parent folder of project e pressionar o botão Create
Repository. Por fim o botão Finish.
Na perspectiva do Git é possı́vel gerenciar todas as subidas e descidas para o repositório.
5.5
SonarQube
Com esta parte concluı́da podemos partir para a última fase, com o passar do tempo a complexidade
do código tende a crescer, a realização de refatorações são sempre necessárias. Devemos nos
preocupar em resolver os problemas de negócios, porém deixamos passar pequenos erros no código.
Jenkins
1.0
Folha 12
Para resolver problemas como esses devemos utilizar ferramentas que nos auxiliem na análise do
código produzido.
O SonarQube é uma plataforma de código aberto para inspeção contı́nua da qualidade deste, para
executar revisões automáticas com análise estática como forma de encontrar problemas, erros
e vulnerabilidades de segurança que pode ser usado em mais de 20 linguagens de programação.
Lembre-se que para usar essa funcionalidade no Jenkins o plug=in SonarQube Scanner deve
estar instalado corretamente.
Baixar a imagem oficial:
✩ docker pull sonarqube
Criar o contêiner:
✩ docker run -d --name meu-sonar -p 9000:9000 -p 9092:9092 sonarqube
Acessar o SonarQube na URL http:\\localhost:9000 com usuário e senha admin—admin. E
deve ser aberta a seguinte janela:
Figura 12: Janela principal do SonarQube
O botão Create new project. Ao clicar neste a solicitação para a chave do projeto, no qual podemos
colocar o mesmo nome do projeto: tstJenkins. Assim fica mais fácil a sua localização. Em seguida
a geração do Token, informar meuToken7 e clicar no botão Generate e será gerado um código.
Guardamos esse pois será necessário para o Jenkins.
Porém não usaremos tal funcionalidade para o Jenkins pois este exige outras configurações na qual
recomendo consultar a documentação para verificar como proceder. Aqui manteremos as coisas
simples, o STS possui o executor de comandos do Maven. Sendo que a meta completa que usaremos
é a seguinte:
✩ sonar:sonar -Dsonar.host.url=http://localhost:9000
-Dsonar.login=[numero do seu TOKEN] -Dsonar-projectName=tstJenkins
-Dsonar.projectVersion=master
Basta clicar com o botão direito no projeto e executar a Opção Run As...:
7
Esse será salvo na seção do Administrador e pode ser usado por outros projetos - Guarde-o pois esse número
NÃO SERÁ MAIS VISUALIZADO.
Jenkins
1.0
Folha 13
Figura 13: Janela principal do SonarQube
5.6
Pipeline Final
Com tudo posto podemos criar a seguinte pipeline:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
pipeline {
agent any
stages {
stage(’Verificar Credenciais Git’) {
steps {
git credentialsId: ’[credencial]’, url: ’https://github.com/fernandoans/tstJenkins’
}
}
stage(’construir’) {
steps {
script {
def mvnHome = tool name: ’Maven3’, type: ’maven’
def mvnCMD = "✩{mvnHome}/bin/mvn"
sh "✩{mvnCMD} clean package"
}
}
}
stage(’Construir Imagem Docker’) {
steps {
script {
sh ’docker build -t fernandoanselmo/meu-proj:1.0.0 .’
}
}
}
stage(’Subir a Imagem’) {
steps {
script {
withCredentials([string(credentialsId: ’DockerHubPwd’, variable: ’DockerHub’)]) {
sh "docker login -u fernandoanselmo -p ✩{DockerHub}"
}
sh ’docker push fernandoanselmo/meu-proj:1.0.0’
}
}
}
Jenkins
1.0
Folha 14
stage(’Executar Local’) {
steps {
script {
containerID = sh(script: "docker ps --quiet --filter name=meu-proj", returnStdout:
true).trim()
containerID = sh(script: "docker ps -a --quiet --filter name=meu-proj",
returnStdout: true).trim()
if (!containerID.isEmpty()) {
sh ’docker stop meu-proj’
}
if (!containerID.isEmpty()) {
sh ’docker rm meu-proj’
}
sh ’docker run -p 8080:8080 -d --name meu-proj fernandoanselmo/meu-proj:1.0.0’
}
}
}
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
}
}
E como resultado final obtemos a seguinte imagem:
Figura 14: Pipeline Final
E ao acessar o endereço http://localhost:8080/tstJenkins/ teremos uma tela como esta:
Figura 15: Pipeline Final
6 Conclusão
O conceito de CD/CI surgiu para remover os problemas de localizar ocorrências posteriores no
ciclo de vida da construção e que os desenvolvedores que integram o código em um repositório
Jenkins
1.0
Folha 15
compartilhado em intervalos regulares possam ter a garantia que o mesmo estará em produção sem
a interferência de falhas humanas na publicação.
A automação de compilações e testes, melhora drasticamente os ciclos de lançamento de novos
artefatos. À medida que cresce, o setor criou um ciclo contı́nuo para as implantações de produção.
Jenkins permite passar do check-in do código à implantação de uma nova versão do nosso aplicativo
na produção sem causar qualquer estresse uma vez que todo processo foi checado e validado. Assim
os desenvolvedores podem integrar facilmente as alterações de aplicativos com essa ferramenta para
ajudar o usuário a obter uma nova versão.
Jenkins permite que o software seja testado e entregue continuamente com a ajuda de várias
tecnologias de integração e implantação. Seus plugins nos ajudam a fornecer CD/CI em vários
estágios diferentes e podem integrar qualquer ferramenta especı́fica, como Git, Amazon EC2 ou
Maven.
Sou um entusiasta do mundo Open Source e novas tecnologias. Qual a diferença entre Livre
e Open Source? Livre significa que esta apostila é gratuita e pode ser compartilhada a vontade.
Open Source além de livre todos os arquivos que permitem a geração desta (chamados de arquivos
fontes) devem ser disponibilizados para que qualquer pessoa possa modificar ao seu prazer, gerar
novas, complementar ou fazer o que quiser. Os fontes da apostila (que foi produzida com o LaTex)
está disponibilizado no GitHub[7], assim baixar, alterar e usar. Veja ainda outros artigos que publico
sobre tecnologia através do meu Blog Oficial[5].
Referências
[1] Site oficial do Jenkins
https://www.jenkins.io/
[2] Editor Spring Tool Suite para códigos Java
https://spring.io/tools
[3] Apache Maven
https://maven.apache.org/
[4] SonarQube
https://www.sonarqube.org/
[5] Fernando Anselmo - Blog Oficial de Tecnologia
http://www.fernandoanselmo.blogspot.com.br/
[6] Encontre essa e outras publicações em
https://cetrex.academia.edu/FernandoAnselmo
[7] Repositório para os fontes da apostila
https://github.com/fernandoans/publicacoes
Jenkins
1.0
Folha 16