Introdução

Neste tutorial, vamos explorar o mundo do DevOps e como podemos integrar Jenkins e Docker para implementar práticas de CI/CD, otimizando o ciclo de vida do desenvolvimento de software. A integração de Jenkins, uma ferramenta amplamente utilizada para automação de builds e integração contínua, com Docker, que permite a criação de contêineres para suas aplicações, pode melhorar significativamente a agilidade e a eficiência das equipes de desenvolvimento. Vamos começar configurando um projeto simples em Java com Spring Boot e, em seguida, configuraremos o Jenkins para automatizar builds, testes e a implantação usando contêineres Docker. Este tutorial é destinado a desenvolvedores que buscam aprender a aplicar a cultura DevOps em seus projetos e a usar ferramentas modernas para alcançar eficiência no desenvolvimento.

Etapas

  1. Configuração do Ambiente de Desenvolvimento

    Verifique se você possui o JDK (Java Development Kit), Maven e Docker instalados em sua máquina. Para o Jenkins, ele será executado em um contêiner Docker. Utilize os comandos a seguir para verificar as instalações.

    commands
    # Verificar Java e Maven
    java -version
    mvn -version
    # Verificar Docker
    docker --version

  2. Criação do Projeto Spring Boot

    Utilize o Spring Initializr para gerar um novo projeto Spring Boot com as dependências necessárias. Configure o projeto com as opções: **Project**: Maven, **Language**: Java, **Spring Boot**: última versão estável, **Packaging**: Jar, **Java**: 11 ou superior. Adicione as dependências ‘Spring Web’ e ‘Spring Boot DevTools’ e faça o download do projeto.

    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example</groupId>
      <artifactId>docker-demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>docker-demo</name>
      <description>Demo com Docker e Jenkins</description>
      <properties>
        <java.version>11</java.version>
      </properties>
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
          <scope>runtime</scope>
          <optional>true</optional>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
    </project>

  3. Implementação de uma Classe Controladora

    Crie uma classe controladora simples para gerenciar uma lista de produtos. Vamos expor endpoints para criar e listar produtos usando o Spring Web.

    ProdutoController.java
    package com.example.dockerdemo.controller;
    
    import org.springframework.web.bind.annotation.*;
    import java.util.Arrays;
    import java.util.List;
    
    @RestController
    @RequestMapping("/api/produtos")
    public class ProdutoController {
        @GetMapping
        public List<String> listProdutos() {
            return Arrays.asList("Produto 1", "Produto 2");
        }
    
        @PostMapping
        public String createProduto(@RequestBody String produto) {
            return "Produto " + produto + " criado com sucesso!";
        }
    }

  4. Criação do Dockerfile

    Crie um arquivo Dockerfile para containerizar sua aplicação Spring Boot. Certifique-se de que ele está na raiz do seu projeto.

    Dockerfile
    FROM openjdk:11-jre-slim
    VOLUME /tmp
    COPY target/docker-demo-0.0.1-SNAPSHOT.jar app.jar
    ENTRYPOINT ["java", "-jar", "app.jar"]

  5. Construindo a Imagem Docker

    Use o Docker para construir a imagem da sua aplicação. Execute o comando no terminal na raiz do seu projeto onde está o Dockerfile.

    commands
    # Construir a imagem Docker
    mvn clean package
    docker build -t docker-demo .

  6. Executando o Contêiner Docker

    Agora que você tem a imagem, execute o contêiner Docker. Certifique-se de que a porta 8080 esteja exposta para acessar a API.

    commands
    # Executar o contêiner Docker
    docker run -p 8080:8080 docker-demo

  7. Configurando Jenkins com Docker

    Execute o Jenkins em um contêiner Docker. O seguinte comando executará o Jenkins na porta 8081.

    commands
    # Baixar e executar o contêiner Jenkins
    docker run -d -p 8081:8080 jenkins/jenkins:lts

  8. Criando um Pipeline no Jenkins

    Acesse o Jenkins na porta 8081, crie um novo pipeline e configure-o para executar os seguintes passos: construir o projeto, criar a imagem Docker e executar o contêiner. Use o seguinte código do pipeline como exemplo.

    Jenkinsfile
    pipeline {
        agent any
        stages {
            stage('Build') {
                steps {
                    sh 'mvn clean package'
                }
            }
            stage('Docker Build') {
                steps {
                    sh 'docker build -t docker-demo .'
                }
            }
            stage('Run Docker') {
                steps {
                    sh 'docker run -d -p 8080:8080 docker-demo'
                }
            }
        }
    }

  9. Testando a Integração

    Os testes podem ser realizados através do Postman ou cURL. Teste os endpoints da API que você criou anteriormente para verificar se tudo funciona corretamente.

    curl_examples
    # Listar produtos
    curl -X GET http://localhost:8080/api/produtos
    # Criar um novo produto
    curl -X POST -H "Content-Type: application/json" -d '"Produto 3"' http://localhost:8080/api/produtos

Conclusão

Neste tutorial, exploramos como integrar DevOps usando Jenkins e Docker para otimizar o ciclo de vida do desenvolvimento de software. Abrangemos desde a configuração do ambiente, criação do projeto Spring Boot, até a configuração do Jenkins para automação do CI/CD. Com a construção e execução de contêineres Docker, conseguimos simplificar e agilizar os processos de build e implantação. Este é apenas o começo! Você pode expandir essa configuração para ter um fluxo de trabalho mais robusto à medida que ganha confiança e experiência.

Hashtags

#DevOps #Jenkins #Docker #CICD #SpringBoot #Automação