Jenkins

Teoria e prática

Resumo em construção
Voltar

Conceito

Sistema de automatização de tarefas (build, test e deploy) via Pipelines (similar ao GitHub Actions), utilizado para CI/CD, desenvolvido em Java, com inúmeros plugins e integrações. Criado via arquivo WAR ou executado em webserver. Possui GUI web e via APIs de conexão, além de suporte a arquivo declarativo (Jenkinsfile). Além disso, pode-se gerar relatórios (output) dos passos (jobs) executados, CRON (tasks automatizadas) para criar jobs automatizados via triggers e com timers (independente de pipeline), criar novas máquinas nodes slaves, e configurar instâncias clouds para provisionar agents. Pipeline é trilha ou passo a passo de etapas (stages) de execução de tarefas (steps). Pode ser criada via Jenkinsfile. Na representação GUI dos job do Jenkins, linhas são stages e colunas são pipelines.






Infraestrutura

Máquinas Master Server, realiza controle de pipelines e agendamento de builds. Máquinas Agents/Minions/Slaves performam os builds. Exemplo, Master realiza pipeline de commit do projeto ao Github, Agent seleciona configurações da pipeline e a executa. Agents podem ser permanentes (servidores dedicados para executar jobs, como Debian GNU/Linux e Windows Server) ou cloud (dinâmicos, sob demanda, como AWS, Docker e Kubernetes). Diretório padrão do Jenkins no GNU/Linux é '/var/lib/jenkins' ou '/var/jenkins_home'.

  • /var/jenkins_home/builds: builds, contém builds de jobs (cada build possui subdiretório próprio), logs, etc;
  • /var/jenkins_home/caches: caches, contém arquivos de caches de execução (dependências de libraries ou artefatos temporários), etc;
  • /var/jenkins_home/config.xml: configuração do Jenkins, arquivo de configuração do Jenkins (ex: nº máximo de builds em fila e permissões), etc;
  • /var/jenkins_home/fingerprints: fingerprints, contém arquivos de impressões digitais e compartilhados de builds (identificação de builds), etc;
  • /var/jenkins_home/jobs: jobs, contém configurações de jobs em arquivo de configuração 'config.xml', logs, etc;
  • /var/jenkins_home/logs: logs, contém arquivos de logs de execução, etc;
  • /var/jenkins_home/nodes: configuração das máquinas (nodes agents/slaves), onde cada agent possui próprio subdiretório;
  • /var/jenkins_home/plugins: plugins, contém plugins instalados (arquivos .jpi ou .hpi), etc;
  • /var/jenkins_home/queue: fila de execução de builds e jobs, etc;
  • /var/jenkins_home/secrets: senhas, contém senhas de acesso (master.key e hudson.util.Secret), etc;
  • /var/jenkins_home/updates: atualizações, contém arquivos de atualizações de plugins e Jenkins, etc;
  • /var/jenkins_home/users: usuários, contém configurações de usuários (cada usuário possui subdiretório e configurações de tokens de APIs), etc;
  • /var/jenkins_home/workspace: workspace, contém arquivos de jobs (cada job possui subdiretório próprio), logs, etc.

Tipos de builds

  • Freestyle build: forma simples e aberta de criar builds, geralmente composto de comandos shell script;
  • Pipeline: usa sintaxe Groovy, composto de stages (e steps) para separar componentes do build.

Instalação

Instalação do Jenkins via Docker (necessário Docker):

  • Comando Docker container Jenkins:
    
    "docker run -u root -d --name jenkins -p 8080:8080 -p 50000:50000 -v "C:\Users\NOME_USUARIO\Desktop\jenkins_home:/var/jenkins_home" jenkins/jenkins"
    
  • (opcional) Localizar senha 1º acesso:
    "docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword"
  • Acessar Jenkins GUI no navegador: http://localhost:8080
  • No Jenkins GUI, informar senha 1º acesso, selecionar Instalar extensões sugeridas
  • Informe credeciais de usuário admin, de sua preferência

  • Outros comandos:
  • Acessar container Jenkins: "docker exec -it jenkins bash"
  • (opcional) Ver logs do container: "docker logs jenkins"

Exemplo prático

Criar job de automatização de projeto Django.

  1. No Jenkins GUI (http://localhost:8080), 'Nova Tarefa (job)', informar nome do job (ex: 'teste_django_ubsocial'), selecionar tipo 'Pipeline', e confirmar. A Pipeline abaixo baixará (clone) projeto de API REST Django do Github, instalará pacotes na máquina do projeto, acessará API REST Django e a executará, criará testes (via curl) de acessos a API REST via métodos POST (inserir música) e GET (listar músicas) e, por fim, mostrará feedback de concluído.
  2. Em Pipeline, informar Pipeline script, e confirmar:
    
    pipeline {
        agent any
    
        environment {
            PROJECT_NAME = 'music_project'
        }
    
        stages {
            stage('git_clone') {
                steps {
                    echo 'Clonando repositório'
                    sh 'git clone https://github.com/mateusschwede/music_django_api_rest.git'
                }
            }
    
            stage('install_dependencies') {
                steps {
                    echo 'Atualizando repositórios e instalando PIP'
                    sh '''
                        apt update
                        apt install -y python3-pip
                        pip3 install django djangorestframework --break-system-packages
                    '''
                }
            }
    
            stage('access_project') {
                steps {
                    echo 'Acessando projeto Django'
                    sh '''
                        cd music_django_api_rest/${PROJECT_NAME}
                        python3 manage.py makemigrations
                        python3 manage.py migrate
                        python3 manage.py runserver &
                    '''
                }
            }
    
            stage('access_server') {
                steps {
                    echo 'Acessando servidor'
                    echo 'Adicionar música'
                    sh '''
                        curl -X POST http://localhost:8000/api/musics/ \
                        -H "Content-Type: application/json" \
                        -d '{
                            "title": "Imagine",
                            "artist": "John Lennon",
                            "album": "Imagine album",
                            "release_date": "1971-09-09"
                        }'
                    '''
                    echo 'Visualizar músicas'
                    sh '''
                        curl -X GET http://localhost:8000/api/musics/
                    '''
                    echo 'Funcionalidades concluídas'
                }
            }
        }
    
        post {
            always {
                echo 'Pipeline concluído!'
            }
        }
    }
    
  3. Realizar build da Pipeline, clicar em Construir Agora

Agents Cloud

Em breve.


Triggers Em construção

Criar inicialização automatizada de job. Exemplo abaixo, execução de pipeline a cada 5 minutos após construção..

    Construir pipeline:
    1. Em breve.

    Configurar triggers:
  1. Acessar job, configure
  2. Nas configurações, seção Build Triggers, habilitar Construir periodicamente, e preencher Schedule:
    
    H/1 * * * *
    
  3. Confirmar salvamento