Este repositório é um template de referência para automação completa de projetos C++. Ele foi projetado para ser 100% dinâmico: ao clonar este template para um novo repositório, o pipeline detecta automaticamente o nome da pasta e configura o Build, a Imagem Docker e o Deploy no Kubernetes sem necessidade de alterações manuais nos scripts.
- Linguagem: C++17
- Gestão de Dependências: Conan
- Sistema de Build: CMake
- Orquestração CI/CD: Jenkins (Declarative Pipeline)
- Containerização: Docker
- Orquestração de Containers: Kubernetes
- Repositório de Artefatos: Nexus (Docker Registry)
- Nomeação Dinâmica: O
Jenkinsfilee oCMakeLists.txttrabalham em conjunto para extrair o nome do projeto do diretório de trabalho, limpando sufixos de branch (ex:_master) e convertendo caracteres para o padrão RFC 1123 exigido pelo Kubernetes. - Build Otimizado: Uso de
.dockerignoreestratégico para garantir que apenas o binário de Release seja enviado para a imagem final, reduzindo drasticamente o tempo de build e o tamanho da imagem. - Gestão de Dependências Moderna: Integração total entre Conan e CMake via
CMakeToolchain, garantindo que bibliotecas comofmtespdlogsejam vinculadas corretamente. - Deploy Automatizado: Atualização dinâmica de imagens no Kubernetes através de substituição de tags via
sedem tempo de execução.
Clique em "Use this template" no GitHub para criar seu novo projeto baseado nesta estrutura.
Crie um novo job do tipo Pipeline (ou Multibranch Pipeline) apontando para o seu novo repositório. Certifique-se de que seu Agent Jenkins possui:
- GCC/G++ (suporte a C++17)
- Conan instalado e configurado
- Docker e Kubectl configurados
No Jenkinsfile, ajuste as variáveis no bloco environment se o seu ambiente for diferente:
REGISTRY: Endereço do seu Docker Registry.PATH: Caminho para os binários do Conan/CMake no seu Agent.
.
├── src/ # Código fonte (.cpp)
├── tests/ # Testes unitários (GTest)
├── cmake/ # Módulos auxiliares do CMake
├── CMakeLists.txt # Configuração de Build dinâmica
├── conanfile.txt # Dependências do projeto
├── Dockerfile # Receita da imagem Docker
├── Jenkinsfile # Definição do Pipeline CI/CD
└── deployment.yaml # Manifesto Kubernetes (Template)
O pipeline executa automaticamente as seguintes etapas a cada git push:
Checkout: Download do código.
Conan Install: Resolução de dependências.
CMake Build: Compilação do binário e dos testes.
Unit Tests: Execução do CTest.
Docker Build: Criação da imagem com o nome dinâmico do projeto.
Para que este template funcione no seu ambiente específico, você deve ajustar os seguintes pontos:
No Jenkinsfile (Variáveis de Ambiente) Localize o bloco environment e altere os valores de acordo com o seu servidor:
PATH: Certifique-se de que o caminho aponta para onde o conan e o cmake estão instalados no seu Agent Jenkins.
REGISTRY: Altere host.docker.internal:5001 para o endereço do seu Nexus, Docker Hub ou Harbor.
agent { label 'seu-node' }: Altere 'cpp-agent' para a etiqueta (label) que você configurou no seu nó do Jenkins.
No deployment.yaml (Recursos de Rede) containerPort: Se o seu projeto C++ rodar em uma porta diferente da 8080, ajuste este valor.
Service (Opcional): Se você quiser acessar o app de fora do cluster, lembre-se de adicionar um manifesto de Service do tipo NodePort ou LoadBalancer apontando para o seu Deployment.
No conanfile.txt (Bibliotecas) Se o seu projeto precisar de outras bibliotecas (como OpenSSL, Boost ou nlohmann_json), basta adicioná-las na seção [requires]. O CMake e o Docker já estão preparados para incluí-las automaticamente no próximo build.
No CMakeLists.txt (Padrão C++) Se você precisar de funcionalidades do C++20 ou C++23, altere a linha set(CMAKE_CXX_STANDARD 17) para a versão desejada.
Erro conan: not found: Verifique se o binário do Conan está no PATH definido no Jenkinsfile. No Linux, geralmente fica em ~/.local/bin.
Erro 403 Forbidden no Git: Isso ocorre se o seu Jenkins tentar atualizar o status do commit no GitHub sem um Token com permissão de escrita. Você pode ignorar esse erro ou fornecer um Personal Access Token (PAT) com permissões de repo:status.
Erro Invalid RFC 1123 subdomain no K8s: Certifique-se de que o nome da sua pasta no GitHub não contém caracteres especiais além de hífens e números. Nosso script já trata underscores, mas evite pontos ou espaços.
Push: Envio para o Registry local.
K8s Deploy: Deploy/Atualização no cluster. teste final