Translate

Mostrar mensagens com a etiqueta pipeline. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta pipeline. Mostrar todas as mensagens

sexta-feira, 7 de junho de 2024

CICS REST: O Policial Cibernético das APIs Corporativas

 

Bellacosa Mainframe e o cics rest uma improvavel uniao a ser investigada

☕ Um Café no Bellacosa Mainframe

CICS REST: O Policial Cibernético das APIs Corporativas

Quando um Programador COBOL Descobre que o CICS Pode Patrulhar HTTP, Interrogar JSON e Entregar a COMMAREA Viva ou Morta

Detroit, futuro próximo.

A cidade está mergulhada no caos digital. Aplicativos móveis exigem respostas em milissegundos. Microsserviços atravessam nuvens públicas e privadas. APIs aparecem em cada esquina. Contêineres fogem pelas avenidas do Kubernetes. Mensagens JSON circulam sem documento, sem copybook e, às vezes, sem qualquer respeito pelo contrato de dados.

No subsolo de uma grande corporação financeira, porém, existe uma máquina que nunca dorme.

Ela não usa capa.
Não pilota um Batmóvel.
Não fala em promessas vazias de transformação digital.

Ela executa transações.

Seu nome é CICS Transaction Server.

Durante décadas, ele patrulhou os corredores do processamento corporativo, protegendo contas bancárias, seguradoras, companhias aéreas, governos, cartões de crédito, estoques e sistemas industriais. Agora, diante da invasão das APIs REST, recebeu uma nova diretiva:

Servir o público, proteger a lógica de negócio e fazer o JSON obedecer ao copybook.

Bem-vindo, jovem programador COBOL, ao distrito mais movimentado do IBM Z.

Hoje veremos como um programa COBOL tradicional, acostumado a receber dados por COMMAREA ou CHANNEL, pode ser exposto como uma API REST moderna sem precisar ser completamente reescrito.

Prepare o café. Ajuste o terminal 3270. Verifique o CEMT. O suspeito está chegando pela porta TCP/IP.


Diretiva Primária: compreender o problema

Antes de falarmos sobre recursos CICS, precisamos entender o conflito central.

Um programa COBOL tradicional não conhece naturalmente conceitos como:

  • URL;

  • HTTP;

  • HTTPS;

  • JSON;

  • cabeçalhos;

  • métodos GET, POST, PUT e DELETE;

  • códigos de status como 200, 400, 404 e 500;

  • autenticação por token;

  • chamadas originadas por aplicativos móveis.

O programa COBOL normalmente conhece estruturas fixas de dados.

Por exemplo:

01  WS-CLIENTE-REQUEST.
    05 WS-AGENCIA          PIC 9(4).
    05 WS-CONTA            PIC 9(8).
    05 WS-DIGITO           PIC X.

Ele espera receber bytes em posições previamente definidas.

A agência ocupa quatro posições.
A conta ocupa oito.
O dígito ocupa uma.

Não há chaves, aspas, vírgulas nem nomes de propriedades circulando em tempo de execução.

Já uma aplicação web moderna envia algo parecido com:

{
  "agencia": 1234,
  "conta": 87654321,
  "digito": "9"
}

Para um desenvolvedor JavaScript, isso parece natural.

Para um programa COBOL antigo, esse JSON é praticamente um criminoso não identificado entrando na delegacia sem documento.

Alguém precisa fazer a identificação, separar cada campo, validar formatos, converter números e entregar os dados exatamente na posição esperada.

Esse alguém é o CICS.


A unidade especial de tradução do CICS

O CICS atua como uma camada intermediária inteligente entre o cliente REST e a aplicação tradicional.

O fluxo básico é:

Cliente externo
      ↓
HTTP ou HTTPS
      ↓
TCPIPSERVICE
      ↓
URIMAP
      ↓
PIPELINE
      ↓
JSON Handler
      ↓
COMMAREA ou CHANNEL
      ↓
Programa COBOL

Na resposta, o caminho é invertido:

Programa COBOL
      ↓
COMMAREA ou CHANNEL
      ↓
JSON Handler
      ↓
JSON
      ↓
Resposta HTTP
      ↓
Cliente externo

O ponto fundamental é este:

O programa COBOL não precisa compreender o documento JSON original.

Ele recebe uma estrutura de dados tradicional, preparada pelo CICS.

Assim, a lógica de negócio pode continuar fazendo aquilo que sempre fez:

  • consultar Db2;

  • ler VSAM;

  • calcular juros;

  • validar saldo;

  • verificar limites;

  • emitir autorizações;

  • atualizar cadastros;

  • registrar auditoria;

  • controlar uma unidade lógica de trabalho.

O CICS cuida do protocolo moderno.
O COBOL cuida do negócio.

Essa separação de responsabilidades é uma das maiores virtudes da arquitetura.


Cena 1: o cliente externo chega à cidade

No topo do fluxo temos o consumidor da API.

Ele pode ser:

  • um aplicativo Android;

  • um aplicativo iOS;

  • um portal web;

  • um sistema Java;

  • um serviço Python;

  • um microsserviço no OpenShift;

  • uma aplicação hospedada em AWS, Azure ou IBM Cloud;

  • uma plataforma de integração;

  • o IBM API Connect;

  • outro sistema mainframe;

  • uma ferramenta de testes como Postman ou curl.

O cliente pode enviar uma requisição como:

POST /api/v1/transferencias
Content-Type: application/json

Corpo:

{
  "contaOrigem": 10012345,
  "contaDestino": 20098765,
  "valor": 250.75
}

Do ponto de vista do cliente, ele está chamando uma API REST comum.

Ele não precisa saber:

  • em qual LPAR o CICS está;

  • se o programa foi escrito em COBOL;

  • se os dados estão em Db2 ou VSAM;

  • se a transação utiliza COMMAREA;

  • se existe um programa com 30 anos de produção;

  • se o serviço participa de uma unidade de trabalho protegida por syncpoint.

Essa transparência é valiosa.

Para a aplicação moderna, o mainframe aparece como um provedor de serviços corporativos.


Cena 2: TCPIPSERVICE, o portão blindado

O primeiro recurso CICS relevante é o TCPIPSERVICE.

Pense nele como o portão de entrada do distrito.

Ele define onde o CICS escutará conexões TCP/IP.

Entre suas responsabilidades estão:

  • porta de escuta;

  • protocolo utilizado;

  • suporte a HTTP ou HTTPS;

  • configuração de SSL/TLS;

  • associação com parâmetros de segurança;

  • controle da entrada de conexões.

Exemplo conceitual:

Porta: 8443
Protocolo: HTTP
SSL: habilitado
Status: aberto

Quando o cliente chama:

https://api.empresa.com:8443/api/v1/saldo

a conexão chega ao TCPIPSERVICE correspondente.

Sem TCPIPSERVICE ativo, ninguém entra.

É como tentar apresentar uma denúncia em uma delegacia cujo portão está fechado.

Dica Bellacosa

Quando um serviço não responde, não comece imediatamente alterando o COBOL.

Verifique primeiro:

  1. O TCPIPSERVICE está instalado?

  2. Está habilitado?

  3. Está escutando na porta correta?

  4. Existe firewall bloqueando?

  5. O certificado TLS é válido?

  6. O host e a porta da chamada estão corretos?

Muitos “erros do programa” são, na verdade, problemas anteriores ao programa.

O suspeito sequer chegou à sala de interrogatório.


Cena 3: URIMAP, o reconhecimento facial das URLs

Depois que a requisição entra no CICS, é necessário descobrir qual serviço deve tratá-la.

Essa é uma das funções do URIMAP.

O URIMAP relaciona um padrão de URI a um recurso ou fluxo CICS.

Por exemplo:

/api/v1/clientes/*

ou:

/api/v1/saldos/*

Ele funciona como uma tabela de encaminhamento.

Quando chega:

GET /api/v1/clientes/12345

o CICS verifica qual URIMAP corresponde àquele endereço.

Em termos conceituais:

URI recebida
      ↓
Comparação com URIMAPs
      ↓
Seleção do pipeline ou serviço

O URIMAP também pode ajudar a separar versões:

/api/v1/clientes
/api/v2/clientes

Isso é importante porque APIs evoluem.

Talvez a versão 1 retorne:

{
  "nome": "MURPHY"
}

e a versão 2 retorne:

{
  "nomeCompleto": "ALEX MURPHY",
  "status": "ATIVO"
}

Manter versões evita que uma mudança destrua consumidores antigos.

Curiosidade investigativa

Em arquiteturas web como Spring Boot, rotas podem ser definidas com anotações:

@GetMapping("/clientes/{id}")

No CICS, o conceito de roteamento aparece por meio de recursos como URIMAP, pipelines e handlers.

A tecnologia muda.
A necessidade arquitetural permanece.

Alguém sempre precisa decidir quem atende cada endereço.


Cena 4: PIPELINE, a linha de processamento

O PIPELINE é a linha de montagem que conduz a mensagem pelos componentes necessários.

Imagine uma esteira industrial da Omni Consumer Products, mas sem o protótipo ED-209 disparando contra os programadores durante a reunião.

A requisição passa por estágios:

HTTP
  ↓
Identificação do serviço
  ↓
Tratamento da mensagem
  ↓
Conversão do JSON
  ↓
Chamada da aplicação
  ↓
Conversão da resposta

O pipeline não é apenas uma “seta” no desenho.

Ele representa a infraestrutura que organiza o processamento da mensagem.

Dependendo da configuração, podem existir etapas relacionadas a:

  • transformação de dados;

  • validação;

  • segurança;

  • tratamento de cabeçalhos;

  • seleção de handlers;

  • geração da resposta;

  • registro de erros.

É importante não confundir o pipeline com o programa de negócio.

O pipeline é a rota operacional.
O programa COBOL é o policial que executa a investigação.


Cena 5: o JSON Handler interroga a mensagem

O cliente envia:

{
  "codigoCliente": 4711,
  "valor": 850.25,
  "moeda": "BRL"
}

O programa COBOL espera:

01  WS-REQUEST.
    05 WS-CODIGO-CLIENTE   PIC 9(8).
    05 WS-VALOR            PIC S9(9)V99 COMP-3.
    05 WS-MOEDA            PIC X(3).

Essas representações não são iguais.

O JSON representa números e textos de forma lógica.

O COBOL pode representar números em:

  • display;

  • binário;

  • packed decimal;

  • COMP;

  • COMP-3;

  • campos com sinal;

  • casas decimais implícitas.

O JSON Handler realiza a tradução entre esses formatos.

Exemplo:

"valor": 850.25

pode ser convertido para um campo:

PIC S9(9)V99 COMP-3

O programa recebe o valor na forma adequada para o processamento COBOL.

Na resposta ocorre o contrário.

Se o programa devolver:

WS-SALDO PIC S9(9)V99 COMP-3 VALUE 150075

considerando as casas decimais implícitas, o handler poderá produzir:

{
  "saldo": 1500.75
}

A conversão exige regras.

Essas regras são geradas a partir da definição das estruturas.

E aqui entram os assistentes do CICS.


DFHLS2JS e DFHJS2LS: a reconstrução cibernética dos dados

Dois nomes aparecem frequentemente quando estudamos JSON no CICS:

  • DFHLS2JS

  • DFHJS2LS

À primeira vista, parecem números de série de unidades mecanizadas da polícia de Detroit.

Mas são utilitários fundamentais.

DFHLS2JS

O nome pode ser lido como:

Language Structure to JSON

Ou seja:

Estrutura de linguagem
        ↓
Definição JSON

Você fornece uma estrutura COBOL, PL/I ou outra linguagem suportada.

O utilitário gera artefatos que permitem mapear aquela estrutura para JSON.

Por exemplo, a partir de:

01  CLIENTE-RESPONSE.
    05 CLIENTE-ID          PIC 9(8).
    05 CLIENTE-NOME        PIC X(40).
    05 CLIENTE-SALDO       PIC S9(9)V99 COMP-3.

pode ser criada uma representação lógica equivalente a:

{
  "clienteId": 12345678,
  "clienteNome": "ALEX MURPHY",
  "clienteSaldo": 4900.50
}

DFHJS2LS

O sentido principal é:

JSON to Language Structure

Ele parte de uma definição JSON e gera estruturas ou mapeamentos adequados para a linguagem.

Isso é útil quando o contrato JSON já existe e a aplicação CICS precisa se adaptar a ele.

Portanto, existem dois caminhos de desenvolvimento.

Caminho bottom-up

Você já possui o programa COBOL e o copybook.

Parte da estrutura existente e gera a interface JSON.

Copybook COBOL
       ↓
DFHLS2JS
       ↓
Artefatos JSON e binding

Caminho top-down

Você já possui o contrato JSON ou o desenho da API.

Parte do contrato e gera uma estrutura de linguagem correspondente.

Definição JSON
       ↓
DFHJS2LS
       ↓
Estrutura COBOL e binding

A escolha depende de onde está a fonte da verdade.

Em sistemas legados, muitas vezes o copybook existente é o ponto de partida.

Em projetos API-first, o contrato JSON pode ser definido antes da implementação.


O arquivo de binding: a memória operacional

O web service binding file contém informações de mapeamento necessárias para que o CICS converta a mensagem.

Ele funciona como uma espécie de memória operacional da reconstrução.

Diz ao CICS, em essência:

  • qual campo JSON corresponde a qual campo COBOL;

  • como tratar tipos;

  • como converter representações;

  • como montar a estrutura de entrada;

  • como transformar a estrutura de saída.

Esse arquivo costuma ser armazenado no zFS, o sistema de arquivos UNIX do z/OS.

O CICS acessa os artefatos durante o processamento.

Atenção

O binding não é simplesmente documentação.

Ele participa efetivamente da execução.

Se houver inconsistência entre:

  • o copybook utilizado na geração;

  • o programa compilado;

  • o binding implantado;

o resultado pode ser desastroso.

Campos podem ser interpretados com tamanhos errados.
Valores podem chegar deslocados.
Conversões podem falhar.
O programa pode receber dados aparentemente válidos, mas incorretos.

Essa é uma ocorrência particularmente perigosa porque nem sempre provoca ABEND imediato.

Às vezes, o dado errado passa pela porta usando um crachá aparentemente válido.


COMMAREA ou CHANNEL: escolha seu compartimento

Depois da conversão, o CICS precisa entregar os dados à aplicação.

Dois modelos são comuns:

  • COMMAREA;

  • CHANNEL e CONTAINER.

COMMAREA

A COMMAREA é o método clássico.

Ela consiste em uma área contínua de memória passada entre programas ou transações.

Exemplo conceitual:

01 DFHCOMMAREA.
   05 CA-FUNCAO          PIC X.
   05 CA-CLIENTE         PIC 9(8).
   05 CA-STATUS          PIC X(2).

Vantagens:

  • simples;

  • conhecida por praticamente todos os programadores CICS;

  • amplamente utilizada;

  • adequada para estruturas pequenas e estáveis.

Limitações:

  • tamanho limitado;

  • uma única área linear;

  • maior dificuldade para mensagens complexas;

  • mudanças podem afetar offsets e compatibilidade.

A COMMAREA tradicional possui um limite próximo de 32 KB, associado ao tamanho permitido no modelo clássico de comunicação.

CHANNEL e CONTAINER

O CHANNEL organiza múltiplos containers.

Exemplo:

CHANNEL: API-CHANNEL

CONTAINER: REQUEST
CONTAINER: RESPONSE
CONTAINER: METADATA
CONTAINER: ERROR-INFO

Vantagens:

  • melhor organização;

  • suporte a volumes maiores;

  • separação lógica dos dados;

  • flexibilidade;

  • menor dependência de uma única estrutura monolítica.

Para novos desenhos, CHANNEL e CONTAINER costumam oferecer uma arquitetura mais limpa.

Contudo, não significa que toda COMMAREA deva ser imediatamente substituída.

A regra Bellacosa é:

Não modernize destruindo o que funciona. Modernize criando fronteiras melhores.

Se o programa existente funciona corretamente com COMMAREA, uma camada de exposição pode preservar essa interface.

Se uma nova aplicação estiver sendo criada, CHANNEL e CONTAINER merecem forte consideração.


Cena 6: o programa COBOL entra em ação

Após a conversão, o CICS chama o programa de aplicação.

Ele pode receber:

01  REQUEST-DATA.
    05 REQUEST-CONTA      PIC 9(8).
    05 REQUEST-VALOR      PIC S9(9)V99 COMP-3.

O programa executa sua lógica:

IF REQUEST-VALOR <= SALDO-DISPONIVEL
    MOVE '00' TO RESPONSE-CODE
    SUBTRACT REQUEST-VALOR
        FROM SALDO-ATUAL
ELSE
    MOVE '51' TO RESPONSE-CODE
END-IF

Observe que não há nenhuma instrução para interpretar JSON.

Não existe:

PARSE JSON MANUALMENTE

O código se concentra no domínio do negócio.

Esse é o objetivo.

Contudo, algumas versões modernas do Enterprise COBOL também oferecem recursos próprios para processamento JSON. Isso pode ser útil em certos cenários, mas não elimina necessariamente o valor da infraestrutura CICS de pipelines, assistentes e bindings.

Existem duas filosofias:

Conversão na infraestrutura

CICS converte
Programa recebe estrutura pronta

Conversão na aplicação

Programa recebe JSON
Programa executa JSON PARSE

Para exposição padronizada de serviços CICS, a conversão na infraestrutura costuma reduzir acoplamento e manter o programa focado no negócio.


Cena 7: a resposta sai patrulhando a rede

O programa preenche a estrutura de saída:

01  RESPONSE-DATA.
    05 RESPONSE-CODE      PIC X(2).
    05 RESPONSE-MESSAGE   PIC X(60).
    05 RESPONSE-BALANCE   PIC S9(9)V99 COMP-3.

Exemplo:

RESPONSE-CODE    = 00
RESPONSE-MESSAGE = TRANSFERENCIA APROVADA
RESPONSE-BALANCE = 3250.25

O JSON Handler converte para:

{
  "codigo": "00",
  "mensagem": "TRANSFERENCIA APROVADA",
  "saldo": 3250.25
}

O CICS então envia uma resposta HTTP.

Exemplo:

HTTP/1.1 200 OK
Content-Type: application/json

O cliente recebe a resposta sem saber quantas camadas corporativas participaram do processamento.

Mas aqui existe uma decisão importante:

Um código de negócio não é automaticamente um código HTTP.

Por exemplo:

Código 51 = saldo insuficiente

Isso não significa necessariamente:

HTTP 500

Saldo insuficiente é uma resposta válida da regra de negócio. O serviço funcionou corretamente.

Dependendo do contrato da API, pode ser retornado:

HTTP 422 Unprocessable Content

ou até:

HTTP 200 OK

com:

{
  "aprovado": false,
  "motivo": "SALDO_INSUFICIENTE"
}

A escolha depende do padrão arquitetural da organização.

Regra prática

  • Erro de formato enviado pelo cliente: 400 Bad Request;

  • credencial ausente ou inválida: 401 Unauthorized;

  • acesso proibido: 403 Forbidden;

  • recurso inexistente: 404 Not Found;

  • conflito de estado: 409 Conflict;

  • regra de negócio não processável: frequentemente 422;

  • falha inesperada no servidor: 500 Internal Server Error;

  • serviço temporariamente indisponível: 503 Service Unavailable.

Não transforme todo problema de negócio em erro técnico.

O ED-209 não precisa disparar porque o cliente digitou um código inválido.


Passo a passo de uma modernização controlada

Agora vamos construir um roteiro prático.

Passo 1: escolha uma operação pequena

Não comece expondo o fechamento contábil completo da empresa.

Escolha uma função simples e bem conhecida:

  • consultar cliente;

  • consultar saldo;

  • obter status;

  • listar produtos;

  • validar cadastro.

Operações de consulta são bons primeiros candidatos porque apresentam menor risco transacional.


Passo 2: localize o programa e sua interface

Descubra:

  • nome do programa;

  • transação associada;

  • copybook de entrada;

  • copybook de saída;

  • uso de COMMAREA ou CHANNEL;

  • tamanho dos dados;

  • chamadas a Db2, VSAM, MQ ou outros programas;

  • códigos de retorno;

  • requisitos de segurança.

Documente o contrato atual antes de criar o novo.

Modernização sem inventário é patrulhamento sem mapa.


Passo 3: higienize o copybook

Verifique:

  • campos redefinidos;

  • REDEFINES;

  • OCCURS DEPENDING ON;

  • campos binários;

  • packed decimal;

  • sinais;

  • campos filler;

  • nomes duplicados;

  • estruturas condicionais;

  • caracteres especiais;

  • campos de comprimento variável.

Nem toda estrutura COBOL antiga foi criada pensando em exposição externa.

Pode ser melhor criar um copybook de API separado.

Exemplo:

01 API-SALDO-REQUEST.
   05 API-CONTA          PIC 9(8).

01 API-SALDO-RESPONSE.
   05 API-CODIGO         PIC X(2).
   05 API-SALDO          PIC S9(9)V99 COMP-3.

Essa estrutura pode chamar internamente o programa legado.

Assim, você cria uma fachada estável.


Passo 4: defina o contrato REST

Decida:

GET /api/v1/contas/{conta}/saldo

Resposta:

{
  "conta": 12345678,
  "saldo": 1750.40,
  "moeda": "BRL"
}

Defina também:

  • campos obrigatórios;

  • tamanhos máximos;

  • valores permitidos;

  • formato de datas;

  • precisão decimal;

  • códigos HTTP;

  • mensagens de erro;

  • versão da API.

O copybook não deve ser publicado cegamente como contrato externo.

Um nome interno como:

WS-X9-COD-CLI-BASE

não é um bom nome de propriedade JSON.

Prefira algo compreensível:

"codigoCliente"

Passo 5: gere os artefatos

Use o assistente apropriado:

  • DFHLS2JS para partir da estrutura de linguagem;

  • DFHJS2LS para partir do JSON.

A geração pode produzir:

  • schemas;

  • bindings;

  • estruturas;

  • metadados de conversão;

  • arquivos de configuração.

Em muitos ambientes, o CICS Explorer facilita esse processo.

Um wizard pode criar um CICS Bundle a partir de um programa existente.

Isso reduz a necessidade de preparar manualmente todos os recursos e jobs.

Mas atenção:

Wizard não substitui entendimento.

Ele automatiza passos.
Não decide por você se o contrato da API é bom.


Passo 6: configure os recursos CICS

Você precisará garantir que os elementos estejam corretamente definidos e instalados:

  • TCPIPSERVICE;

  • URIMAP;

  • PIPELINE;

  • WEBSERVICE ou recursos relacionados;

  • diretórios no zFS;

  • bundle;

  • programa;

  • transação, quando aplicável;

  • segurança.

Use o CICS Explorer, definições CSD, bundles ou o método adotado pela organização.


Passo 7: teste com ferramentas externas

Teste primeiro fora da aplicação final.

Exemplo com curl:

curl -X POST \
  https://host.exemplo.com/api/v1/saldos \
  -H "Content-Type: application/json" \
  -d '{"conta":12345678}'

Valide:

  • status HTTP;

  • conteúdo da resposta;

  • headers;

  • tempo de resposta;

  • comportamento com dados inválidos;

  • campos ausentes;

  • números fora da faixa;

  • caracteres especiais;

  • falha do programa;

  • indisponibilidade de banco de dados.

Não teste apenas o caminho feliz.

Todo criminoso digital parece inocente quando recebe apenas dados perfeitos.


CICS como REST Requester: o policial também faz chamadas

Até agora vimos o CICS como service provider.

Ou seja:

Cliente externo chama o CICS

Mas o CICS também pode atuar como solicitante:

Programa CICS chama serviço externo

Imagine um programa COBOL que precise consultar:

  • cotação de moeda;

  • serviço antifraude;

  • validação de endereço;

  • geolocalização;

  • serviço de identidade;

  • API de parceiros;

  • serviço de nuvem;

  • motor de inteligência artificial corporativo.

O fluxo pode ser:

Programa COBOL
      ↓
CICS
      ↓
HTTP
      ↓
API externa
      ↓
Resposta JSON
      ↓
Conversão
      ↓
Estrutura COBOL

O CICS pode usar comandos e recursos de cliente HTTP para construir e enviar requisições.

Em cenários específicos, o programa pode trabalhar com:

  • EXEC CICS WEB OPEN;

  • EXEC CICS WEB CONVERSE;

  • EXEC CICS WEB SEND;

  • EXEC CICS WEB RECEIVE;

  • URIMAP do tipo cliente;

  • conexões TLS;

  • tratamento de headers.

A implementação exata depende da versão do CICS, da arquitetura e da estratégia adotada.

É importante entender que o lado requester não é simplesmente o diagrama provider virado ao contrário.

Os conceitos são simétricos, mas os recursos, comandos e responsabilidades de programação podem mudar.


Segurança: diretiva que não pode ser apagada

Expor um programa COBOL como REST não significa abrir a porta do mainframe para qualquer pessoa.

A API deve considerar:

  • TLS;

  • certificados;

  • autenticação;

  • autorização;

  • RACF;

  • proteção das transações;

  • proteção dos recursos;

  • validação de entrada;

  • limitação de chamadas;

  • auditoria;

  • mascaramento de informações sensíveis;

  • API gateway;

  • tokens;

  • logs seguros.

Uma arquitetura comum pode ser:

Cliente
   ↓
API Gateway
   ↓
Autenticação e políticas
   ↓
CICS
   ↓
Programa COBOL

O IBM API Connect pode atuar como camada de gerenciamento, aplicando:

  • segurança;

  • quotas;

  • analytics;

  • controle de versões;

  • portal para desenvolvedores;

  • políticas de tráfego.

O CICS continua executando a transação, enquanto o gateway controla a exposição externa.

Cuidado com logs

Não grave indiscriminadamente:

  • CPF;

  • senha;

  • token;

  • número completo de cartão;

  • dados bancários;

  • informações médicas;

  • chaves privadas.

Log de diagnóstico não deve virar arquivo de evidências contra a própria empresa.


Curiosidades da delegacia CICS

1. CICS não é apenas uma “tela verde”

Muitos iniciantes associam CICS exclusivamente a mapas BMS e terminais 3270.

Mas o CICS moderno pode atender:

  • aplicações web;

  • APIs;

  • Java;

  • JSON;

  • SOAP;

  • eventos;

  • mensageria;

  • integração com cloud;

  • workloads híbridos.

A tela 3270 é apenas uma das interfaces possíveis.


2. REST não obriga reescrita completa

Modernizar não significa necessariamente transportar toda a lógica para outra plataforma.

Muitas vezes, uma boa modernização consiste em:

Criar uma API estável
        ↓
Preservar a lógica confiável
        ↓
Substituir partes gradualmente

Isso reduz risco.

Reescrever milhões de linhas de COBOL apenas para produzir JSON pode ser economicamente irresponsável.


3. Copybook também é contrato

O copybook descreve mais do que campos.

Ele carrega decisões históricas:

  • tamanho de conta;

  • precisão monetária;

  • códigos;

  • indicadores;

  • datas;

  • flags;

  • estruturas repetitivas.

Ao expor uma API, você está transformando parte desse contrato interno em contrato externo.

Faça isso conscientemente.


4. JSON é flexível; COBOL é preciso

JSON aceita estruturas dinâmicas.

COBOL prefere estruturas rigorosamente definidas.

Isso não é defeito.

É uma diferença filosófica.

Em sistemas financeiros, precisão de posição, tamanho e decimal é uma vantagem.

O CICS cria uma ponte entre a flexibilidade externa e a disciplina interna.


Erros clássicos que o programador deve evitar

Expor diretamente a COMMAREA inteira

Uma COMMAREA pode conter:

  • campos internos;

  • fillers;

  • controles;

  • dados sensíveis;

  • flags técnicas;

  • áreas de trabalho;

  • códigos incompreensíveis para consumidores externos.

Crie uma interface própria para API.


Ignorar versionamento

Alterar um campo pode quebrar dezenas de consumidores.

Use versões e contratos claros.


Misturar erro técnico com erro de negócio

“Cliente não possui saldo” não é necessariamente uma pane no servidor.


Não validar números

Um valor JSON pode ultrapassar a capacidade de um PIC 9(5).

Valide limites antes da lógica de negócio.


Esquecer a codificação de caracteres

O mainframe trabalha frequentemente com EBCDIC; clientes web trabalham geralmente com UTF-8.

Conversões precisam estar corretamente configuradas.

Problemas de encoding podem transformar:

JOÃO

em um relatório digno do arquivo de ocorrências inexplicáveis.


Alterar copybook sem regenerar binding

Se a estrutura mudou, o mapeamento pode precisar ser regenerado e redistribuído.

Binding antigo com programa novo é receita para corrupção silenciosa.


Easter eggs para os veteranos do cinema e do mainframe

Em algum lugar da região CICS, um sysprog observa o painel e murmura:

Eu compraria essa API por um dólar.

Na sala ao lado, um desenvolvedor tenta enviar um JSON com campo numérico maior que o PIC suporta. O handler responde com a firmeza de um policial cibernético:

Dead or alive, you are coming with me.

O JSON, naturalmente, escolhe o 400 Bad Request.

Enquanto isso, uma reunião executiva promete substituir todo o mainframe em seis meses. No fundo da sala, o veterano do CICS apenas olha para o relatório de disponibilidade, toma um café e aguarda o próximo episódio.

Ele já viu esse filme antes.

Talvez mais de uma vez.


Conclusão: a quarta diretiva do CICS

O CICS Transaction Server não sobreviveu por permanecer parado.

Ele sobreviveu porque evoluiu sem abandonar seus fundamentos:

  • integridade;

  • desempenho;

  • segurança;

  • controle transacional;

  • escalabilidade;

  • compatibilidade;

  • proteção da lógica de negócio.

Ao fornecer suporte a REST e JSON, o CICS não obrigou o COBOL a fingir que é JavaScript.

Ele criou uma camada especializada de tradução.

O cliente envia HTTP e JSON.
O TCPIPSERVICE recebe a conexão.
O URIMAP identifica o caminho.
O PIPELINE conduz o processamento.
O JSON Handler converte a mensagem.
A COMMAREA ou o CHANNEL entrega os dados.
O programa COBOL executa a regra de negócio.
A resposta percorre o caminho inverso.

Tudo isso permite que um aplicativo moderno converse com uma aplicação escrita décadas atrás como se estivesse chamando qualquer outro serviço contemporâneo.

Essa é a verdadeira modernização pragmática.

Não é destruir o passado.
É colocar uma interface moderna diante dele.

Não é substituir um sistema confiável apenas porque sua linguagem é antiga.
É permitir que ele participe de arquiteturas atuais.

Não é esconder o mainframe por vergonha.
É transformá-lo em um provedor de serviços corporativos.

O jovem programador COBOL entra na sala pensando que encontrará apenas COMMAREA, BMS e terminal 3270.

Sai de lá compreendendo URIs, pipelines, bindings, JSON, TLS, APIs e integração híbrida.

No visor do CICS aparece a mensagem final:

SERVICE STATUS: ENABLED
PIPELINE STATUS: ACTIVE
PROGRAM STATUS: AVAILABLE
HTTP RESPONSE: 200 OK

A cidade digital pode continuar operando.

O JSON foi processado.
O COBOL permaneceu intacto.
A transação foi concluída.

E, em algum lugar do z/OS, a verdadeira quarta diretiva continua protegida:

Nunca interromper o processamento de produção.

domingo, 20 de novembro de 2022

Laboratório CI/CD para Coboleiros Padawans

 

Bellacosa Mainframe e o laboratorio pratico em CI/CD para mainframers

☕ Um Café no Bellacosa Mainframe

Laboratório CI/CD para Coboleiros Padawans

Bem-vindo ao laboratório CI/CD para Coboleiros Padawans, uma jornada prática criada para mostrar que Continuous Integration e Continuous Delivery não são conceitos exclusivos do mundo distribuído, mas práticas cada vez mais presentes no ecossistema IBM Z. O objetivo deste treinamento é capacitar o desenvolvedor COBOL Jr a compreender como Git, pipelines, automação, testes, Docker, Jenkins, Zowe e ferramentas modernas trabalham em conjunto para entregar aplicações com mais qualidade, velocidade e segurança.

A metodologia é baseada em aprendizado progressivo (Learning by Doing). Cada laboratório apresenta um desafio prático, seguido de sua solução comentada e de uma explicação relacionando os conceitos modernos ao cotidiano do desenvolvedor mainframe. A cada etapa, o aluno evolui do entendimento dos fundamentos de versionamento até a construção de pipelines completos semelhantes aos utilizados em bancos, seguradoras e grandes corporações.

Durante os exercícios, o participante será incentivado a experimentar, cometer erros, interpretar logs, analisar falhas de compilação, resolver conflitos de merge e compreender o impacto das alterações em programas COBOL, COPYBOOKs, JCLs e ambientes de desenvolvimento. Afinal, falhas fazem parte do processo de aprendizado e representam oportunidades para desenvolver habilidades de diagnóstico e resolução de problemas.

Como ponto de atenção, este laboratório não pretende substituir os processos específicos adotados por cada empresa. Cada organização possui suas próprias ferramentas, políticas de aprovação, padrões de desenvolvimento e modelos de implantação. O foco está em desenvolver uma mentalidade DevOps aplicada ao Mainframe, permitindo que o aluno compreenda os princípios por trás das ferramentas e consiga adaptar esse conhecimento a qualquer ambiente IBM Z moderno. O objetivo final é formar profissionais capazes de integrar a tradição e a robustez do COBOL com as práticas contemporâneas de engenharia de software.

20 Labs para levar um Desenvolvedor COBOL Jr do "DISPLAY 'HELLO'" até um Pipeline Enterprise IBM Z

"Ninguém aprende CI/CD lendo slides. Aprende quebrando pipelines, corrigindo builds e descobrindo por que um simples COPYBOOK pode parar uma esteira inteira."

Este laboratório foi pensado para quem conhece COBOL, JCL e o mundo IBM Z, mas nunca trabalhou com DevOps, Git, Docker ou CI/CD. A ideia é evoluir passo a passo, sempre fazendo analogias com o ambiente mainframe.


Filosofia

Cada laboratório possui:

  • 🎯 Objetivo

  • 📚 Conceitos

  • 🔨 Exercício

  • ✅ Solução

  • ⭐ Nível

Ao final dos 20 laboratórios o aluno terá contato com praticamente todo o ciclo moderno de desenvolvimento envolvendo aplicações COBOL.


LAB 01 — O que é um Pipeline?

Nível

Objetivo

Entender visualmente um Pipeline.

Exercício

Desenhe um fluxo para um programa COBOL.

Fonte COBOL

↓

Compilação

↓

LinkEdit

↓

Testes

↓

Homologação

↓

Produção

Solução

O aluno percebe que um Pipeline nada mais é que uma sequência automatizada de etapas.


LAB 02 — Git é o novo PDS

Objetivo

Entender Git usando conceitos de Mainframe.

Exercício

Compare:

PDS

Git Repository
Membro

Arquivo
Backup

Commit

Solução

O aluno entende que Git é um versionador e não um diretório de arquivos.


LAB 03 — Primeiro Commit

Criar um repositório.

git init

Adicionar

HELLO.CBL

Executar

git add .
git commit

Solução

Criado o primeiro histórico.


LAB 04 — Branch é igual ambiente paralelo

⭐⭐

Criar

feature/cartao

Modificar o programa.

Fazer Merge.

Solução

Entender desenvolvimento paralelo.


LAB 05 — Conflito de COPYBOOK

⭐⭐

Dois alunos alteram

CLIENTE.CPY

Realizar Merge.

Resolver conflito.

Solução

Aprender Merge Conflict.


LAB 06 — O Build Manual

⭐⭐

Criar um fluxo.

Compila

↓

Link

↓

Executa

↓

Testa

Executar manualmente.

Solução

Perceber quanto trabalho existe.


LAB 07 — Automatizando o Build

⭐⭐

Criar um script.

build.sh

que execute todas as etapas.

Solução

Primeira automação.


LAB 08 — Docker para Coboleiros

⭐⭐

Criar um container Ubuntu.

Entrar.

Instalar Git.

Executar scripts.

Solução

Entender Container.

Easter Egg:

Container lembra JOB Batch.


LAB 09 — Criando uma Docker Image

⭐⭐⭐

Criar

Dockerfile

Adicionar

Git

Java

Python

Construir.

Solução

Image pronta para Pipeline.


LAB 10 — Jenkins faz o JCL Moderno

⭐⭐⭐

Criar um Job.

Sempre que ocorrer

git push

executar

build.sh

Solução

Primeiro Pipeline.


LAB 11 — Pipeline com Erro

⭐⭐⭐

Inserir erro proposital.

DISPLAY "OI"

remover ponto.

Pipeline deve falhar.

Solução

Aprender Build Failed.


LAB 12 — Quality Gate

⭐⭐⭐

Executar análise estática.

Encontrar

  • variáveis mortas

  • código duplicado

  • GO TO desnecessário

Solução

Entender qualidade.


LAB 13 — Testes Automatizados

⭐⭐⭐⭐

Criar casos.

Entrada

100

Saída

Juros

Executar automaticamente.

Solução

Pipeline não depende do usuário.


LAB 14 — Integração com Banco

⭐⭐⭐⭐

Criar ambiente.

Docker

↓

Db2 Simulado

↓

Programa

Executar testes.

Solução

Primeiro teste integrado.


LAB 15 — Deploy Automatizado

⭐⭐⭐⭐

Pipeline publica automaticamente.

DEV

↓

QA

Solução

Entrega contínua.


LAB 16 — Rollback

⭐⭐⭐⭐

Deploy gera erro.

Voltar versão anterior.

Solução

Rollback automático.


LAB 17 — Pipeline Enterprise IBM Z

⭐⭐⭐⭐⭐

Adicionar

Git

↓

Jenkins

↓

DBB

↓

Compile

↓

Link

↓

Bind

↓

Deploy

Solução

Pipeline semelhante ao de grandes bancos.


LAB 18 — Pipeline Híbrido

⭐⭐⭐⭐⭐

Frontend

Docker

API

MQ

COBOL

Db2

Solução

Mostrar que o Mainframe faz parte do Pipeline.

Não está isolado.


LAB 19 — Pipeline Completo

⭐⭐⭐⭐⭐

Fluxo

Git Push

↓

Build

↓

Docker

↓

Sonar

↓

Testes

↓

Artifact

↓

Deploy DEV

↓

Deploy QA

↓

Aprovação

↓

Produção

Solução

Pipeline Enterprise.


LAB 20 — Missão Final

⭐⭐⭐⭐⭐

Criar um Pipeline completo.

Projeto:

Sistema Bancário.

Alterar

CLIENTE.CBL

Executar

  • Build

  • Testes

  • Merge

  • Docker

  • Jenkins

  • Publicação

  • Rollback

Documentar tudo.

Solução

O aluno entrega um Pipeline funcional semelhante ao utilizado em grandes instituições financeiras.


🏆 Desafio Bônus 1 — O Pipeline Quebrado

O instrutor entrega um pipeline com cinco falhas escondidas:

  • branch incorreta;

  • variável de ambiente ausente;

  • caminho inválido para um COPYBOOK;

  • etapa de testes desabilitada;

  • deploy apontando para o ambiente errado.

O objetivo é investigar logs, identificar a causa e restaurar a execução.

Competências desenvolvidas: leitura de logs, troubleshooting e análise de causa raiz.


🏆 Desafio Bônus 2 — O Detetive do COPYBOOK

Um único COPYBOOK foi alterado.

O aluno deve identificar:

  • quais programas precisam ser recompilados;

  • quais JCLs podem ser impactados;

  • quais testes devem ser executados.

Competências desenvolvidas: análise de dependências e impacto.


🏆 Desafio Bônus 3 — Pipeline Seguro

Adicionar ao pipeline:

  • aprovação obrigatória antes da produção;

  • Quality Gate mínimo (ex.: 80%);

  • bloqueio de merge se houver falha nos testes;

  • geração automática de relatório.

O objetivo é entender que CI/CD também envolve governança.


🎓 Projeto Final — O Banco Bellacosa

Ao final do curso, o aluno recebe uma aplicação COBOL composta por:

  • 12 programas COBOL;

  • 8 COPYBOOKs;

  • 6 JCLs;

  • 2 tabelas Db2;

  • 1 transação CICS;

  • repositório Git inicial.

A missão é modernizar o processo de entrega criando um pipeline completo que:

  • utilize Git com branches (main, develop e feature/*);

  • automatize build e testes;

  • execute análise de qualidade;

  • gere artefatos versionados;

  • promova automaticamente para DEV e QA;

  • exija aprovação para produção;

  • implemente rollback para a última versão estável;

  • documente toda a esteira.

Ao concluir esse projeto, o COBOL Jr terá percorrido uma jornada que começa com um simples git init e termina entendendo como grandes bancos entregam software crítico no IBM Z. Mais importante do que decorar comandos, ele terá desenvolvido a mentalidade de engenharia de software moderna, percebendo que, no universo Bellacosa Mainframe, o programa COBOL é apenas uma peça de uma engrenagem muito maior: uma esteira automatizada que garante qualidade, rastreabilidade e segurança do primeiro commit até a produção.


sábado, 19 de novembro de 2022

Continuous Integration e Continuous Delivery (CI/CD): O Pipeline Invisível que Transformou o Mainframe sem Pedir Permissão ao COBOL

 

Bellacosa Mainframe apresenta CI/CD na Stack Mainframe

☕ Um Café no Bellacosa Mainframe

Continuous Integration e Continuous Delivery (CI/CD): O Pipeline Invisível que Transformou o Mainframe sem Pedir Permissão ao COBOL

"Você pode passar vinte anos escrevendo COBOL sem nunca criar um pipeline CI/CD. Mas dificilmente trabalhará em uma empresa moderna sem que algum pipeline execute o seu programa diversas vezes antes de chegar à produção."

Existe uma cena que acontece diariamente em centenas de bancos, seguradoras e grandes empresas.

O programador termina um programa COBOL.

Compila.

Resolve alguns erros.

Faz o BIND.

Executa testes.

Entrega para homologação.

Dias depois alguém pergunta:

— "Já passou pelo pipeline?"

O programador COBOL mais experiente responde naturalmente.

O padawan pergunta:

"Pipeline? Eu só alterei três linhas..."

E aí começa a descoberta de um dos maiores conceitos da engenharia de software moderna.


O que é CI/CD?

CI/CD significa:

  • Continuous Integration

  • Continuous Delivery (ou Continuous Deployment)

Não é uma ferramenta.

Não é Docker.

Não é Jenkins.

Não é Git.

Não é GitHub.

Não é Azure DevOps.

CI/CD é uma filosofia de trabalho.

É uma maneira de entregar software continuamente com segurança.

Se antigamente uma equipe entregava uma versão a cada seis meses, hoje algumas empresas fazem dezenas ou centenas de implantações por dia.

E sim...

Isso também acontece em ambientes IBM Z.


O problema antigo

Imagine um banco em 1998.

Existem:

  • 600 programas COBOL

  • 180 JCLs

  • 90 CICS

  • dezenas de COPYBOOKS

  • centenas de PROC

  • milhares de datasets

João altera um COPYBOOK.

Maria altera um programa.

Carlos modifica outro programa.

Pedro altera um JCL.

Na sexta-feira tudo é colocado em produção.

Ninguém sabe exatamente:

  • quem alterou o quê

  • qual versão entrou

  • quem compilou

  • qual compilador foi usado

  • quais módulos dependem daquele COPYBOOK

Resultado?

ABEND.


A integração contínua nasceu para resolver isso

A ideia é simples.

Sempre que alguém altera código...

o sistema automaticamente:

  • baixa o código

  • compila

  • executa testes

  • verifica qualidade

  • mede cobertura

  • procura vulnerabilidades

  • gera relatórios

  • cria pacotes

  • disponibiliza para homologação

Sem intervenção humana.


Pense como um Batch

O coboleiro entende isso rapidamente.

Imagine um JOB.

STEP010 - COMPILA

↓

STEP020 - LINKEDIT

↓

STEP030 - BIND

↓

STEP040 - TESTES

↓

STEP050 - GERA PACOTE

↓

STEP060 - ENVIA QA

↓

STEP070 - AGUARDA APROVAÇÃO

↓

STEP080 - PRODUÇÃO

Isso...

é praticamente um pipeline CI/CD.

A diferença é que hoje tudo pode ser disparado automaticamente por um simples:

git push

Continuous Integration

O nome já explica.

Toda alteração feita pelos desenvolvedores é integrada continuamente ao projeto principal.

Ao invés de esperar um mês...

integra-se várias vezes ao dia.

Isso reduz conflitos gigantes.


O maior inimigo do COBOL não é o compilador

É isto.

Dois programadores alterando o mesmo COPYBOOK.

Imagine:

CLIENTE.cpy

José altera:

01 CLIENTE.
   05 CPF.

Maria altera:

01 CLIENTE.
   05 EMAIL.

Carlos altera:

01 CLIENTE.
   05 SCORE.

Quem vence?

Antes...

quem compilava por último.

Hoje...

Git resolve conflitos.

Pipeline verifica impacto.

Testes garantem funcionamento.


Continuous Delivery

Depois que tudo foi integrado...

vem a entrega.

O software fica pronto para produção.

Observe a diferença.

Continuous Integration

Integra constantemente.

Continuous Delivery

Entrega constantemente.

Continuous Deployment

Entrega automaticamente em produção.

Nem todo banco permite Deployment automático.

Mas Delivery...

cada vez mais.


O pipeline invisível

Imagine uma esteira.

Programador

↓

Git

↓

Pipeline

↓

Compilação

↓

Testes

↓

Qualidade

↓

Empacotamento

↓

Homologação

↓

Produção

O desenvolvedor apenas envia código.

Todo o resto acontece sozinho.


Onde entra o Docker?

Aqui existe um mito enorme.

Muitos imaginam:

"Mainframe usa Docker."

Na maioria dos casos...

não.

O IBM Z executa z/OS.

Docker normalmente roda em Linux.

Mas isso não significa que eles não trabalhem juntos.

Na verdade...

trabalham diariamente.


O Docker do Coboleiro

Imagine que você possui uma aplicação composta por:

Frontend React

↓

API Java

↓

Kafka

↓

Redis

↓

PostgreSQL

↓

Mainframe

Toda essa parte distribuída pode rodar em Docker.

Enquanto isso...

o COBOL continua rodando no z/OS.


O pipeline moderno

Git

↓

Docker

↓

Compila Java

↓

Executa Testes

↓

Sobe Banco

↓

Executa APIs

↓

Integra com Mainframe

↓

Executa Testes End-to-End

↓

Entrega

O COBOL faz parte da cadeia.

Mesmo sem estar dentro do container.


Easter Egg para Coboleiros

Docker lembra muito...

JCL PROC.

Pense nisso.

Uma PROC define um ambiente reutilizável.

Docker Image também.

PROC:

IEFBR14

SORT

IDCAMS

IKJEFT01

Docker Image:

Ubuntu

Python

Java

Node

Maven

Nos dois casos...

alguém preparou um ambiente padrão.

Você apenas reutiliza.


Outro Easter Egg

Um Container é quase como um JOB temporário.

Ele nasce.

Executa.

Produz resultado.

Morre.

Exatamente como milhares de jobs batch.


E mais um...

Imagem Docker lembra LOADLIB.

Você cria uma imagem.

Depois apenas executa.

Muito parecido com um módulo compilado.


Como um coboleiro trabalha hoje?

Imagine o dia.

8:00

Atualiza Git.

git pull

8:15

Altera COBOL.


9:10

Executa testes locais.


9:20

Commit.

git commit

9:21

Push.

git push

Nesse instante...

o pipeline começa.

Sem perguntar nada.


O pipeline executa

  • checkout

  • download

  • compilação

  • COBOL Check

  • SonarQube

  • testes

  • ZUnit

  • quality gate

  • geração de pacote

  • upload

Tudo automático.


Enquanto isso...

O desenvolvedor toma café.


Ambientes

Uma empresa normalmente possui:

DEV

↓

SIT

↓

QA

↓

UAT

↓

PRE-PROD

↓

PROD

Cada ambiente possui:

  • Db2

  • CICS

  • MQ

  • datasets

  • usuários

  • certificados

  • APIs

  • filas

Tudo diferente.

O pipeline controla isso.


O maior erro dos iniciantes

Achar que DEV é igual PROD.

Nunca é.

Produção possui:

  • volume

  • segurança

  • criptografia

  • RACF

  • WLM

  • políticas

  • auditoria

  • SMF

  • monitoramento


O pipeline reduz erros humanos

Antes alguém precisava:

  • copiar módulos

  • alterar datasets

  • trocar parâmetros

  • executar binds

  • atualizar packages

Hoje...

scripts fazem isso.

Muito menos erro.


Como identificar que sua empresa precisa evoluir?

Existem alguns sinais.

Compilação manual

Ainda existe alguém clicando em dezenas de telas.

Pode automatizar.


Testes manuais

Tudo depende de pessoas.

Pode automatizar.


Deploy manual

Alguém copia LOADLIB.

Pode automatizar.


Sem Git

Problema sério.


Sem versionamento

Outro problema.


Sem rollback

Problema gravíssimo.


Como evoluir?

Não tente implantar tudo.

Comece pequeno.

Primeiro:

Git.

Depois:

Build automático.

Depois:

Testes.

Depois:

Qualidade.

Depois:

Deploy.

Depois:

Observabilidade.


Ferramentas comuns

No mundo distribuído:

  • GitHub

  • GitLab

  • Jenkins

  • Azure DevOps

  • GitHub Actions

  • Bamboo

  • TeamCity

No mundo IBM Z:

  • IBM Dependency Based Build (DBB)

  • UrbanCode Deploy

  • IBM Developer for z/OS

  • Zowe CLI

  • z/OSMF

  • IBM Wazi

  • IBM Test Accelerator

  • IBM Application Delivery Foundation

Cada uma resolve uma parte do quebra-cabeça.


Docker no dia a dia do coboleiro

Mesmo que você nunca execute um container...

provavelmente usa algo que foi criado por ele.

Exemplos:

VS Code Dev Container.

SonarQube.

Jenkins.

Nexus.

Artifactory.

Mongo.

Redis.

RabbitMQ.

Kafka.

Prometheus.

Grafana.

Tudo frequentemente hospedado em containers.


O pipeline conversa com o Mainframe

Hoje isso acontece usando:

  • SSH

  • FTP seguro

  • SFTP

  • Zowe CLI

  • REST APIs

  • z/OSMF

  • MQ

  • Connect:Direct

  • Ansible

Ou seja...

o pipeline não precisa morar no z/OS.

Ele apenas conversa com ele.


Os perigos

Automação ruim acelera erros.

Existe uma frase famosa.

"Se você automatizar um processo ruim, apenas conseguirá errar muito mais rápido."

Um pipeline mal configurado pode:

  • apagar datasets

  • publicar versão errada

  • executar BIND incorreto

  • substituir módulos

  • gerar indisponibilidade

Automação exige governança.


Fraquezas

CI/CD não resolve:

má arquitetura.

código ruim.

COPYBOOK gigante.

programa de 70 mil linhas.

GOTO infinito.

IF aninhado em vinte níveis.

Tudo isso continua existindo.

Apenas chega mais rápido à homologação.


As vantagens

São enormes.

Menos erro humano.

Mais rastreabilidade.

Rollback simples.

Auditoria.

Histórico.

Segurança.

Qualidade.

Velocidade.

Repetibilidade.

Padronização.

Confiança.


Curiosidades

Os bancos mais modernos executam milhares de pipelines por dia.

Alguns pipelines levam poucos minutos.

Outros...

compilam milhares de programas COBOL.

Há pipelines que analisam impacto em centenas de COPYBOOKS antes mesmo da compilação.

Outros verificam automaticamente se um programa alterou SQL estático e disparam o BIND apenas quando necessário.

Em muitas instituições, uma alteração em um COPYBOOK crítico dispara uma análise de dependências para descobrir todos os programas afetados, permitindo recompilar somente o necessário em vez de reconstruir toda a aplicação.

Também é comum que o pipeline consulte políticas de segurança: se um desenvolvedor tentar promover um módulo diretamente para produção sem as aprovações exigidas, a entrega é bloqueada automaticamente.


CI/CD e a mentalidade do Padawan

O maior aprendizado para quem está começando não é decorar nomes de ferramentas.

É entender que o código deixou de ser um arquivo isolado. Ele faz parte de um ecossistema.

Quando você altera uma linha em um programa COBOL, essa mudança pode disparar:

  • validação de sintaxe;

  • análise de qualidade;

  • execução de testes unitários;

  • testes de integração;

  • análise de impacto em COPYBOOKs;

  • geração de métricas;

  • publicação de artefatos;

  • implantação em ambientes de teste.

Você continua escrevendo COBOL, mas agora trabalha em uma cadeia de entrega muito maior.


Uma analogia para nunca esquecer

Imagine uma fábrica de automóveis.

O programador COBOL fabrica uma peça do motor.

O CI/CD é a esteira de montagem.

Ele verifica se a peça está correta, mede suas dimensões, confirma a compatibilidade com as demais peças, registra quem a produziu, armazena o histórico e só então permite que ela siga para a próxima etapa.

Sem essa esteira, cada carro dependeria de verificações totalmente manuais.

Com ela, a produção ganha velocidade, qualidade e previsibilidade.

No mundo IBM Z acontece exatamente a mesma coisa.

O COBOL continua sendo o coração do processamento de negócios. O JCL continua orquestrando cargas batch. O CICS continua atendendo milhões de transações. O Db2 continua armazenando dados críticos. O que mudou foi a forma de construir, validar e entregar essas aplicações.

No fim das contas, o CI/CD não substitui o conhecimento do coboleiro. Pelo contrário: ele amplia seu alcance. O profissional que entende Git, pipelines, testes automatizados, Docker (mesmo que apenas como parte da infraestrutura), Zowe, automação de builds e integração entre ambientes torna-se capaz de participar de projetos modernos sem abandonar a robustez do mainframe.

E talvez esse seja o maior segredo do IBM Z em 2026: o mainframe não ficou preso ao passado. Ele incorporou práticas modernas de engenharia de software e continua evoluindo. O padawan que aprende essa mentalidade deixa de ser apenas um programador COBOL e passa a enxergar toda a jornada do software — desde o primeiro git push até o momento em que um módulo é promovido para produção com segurança, rastreabilidade e confiança. Afinal, no universo Bellacosa Mainframe, escrever código é apenas o começo; entregar software de forma consistente é o verdadeiro diferencial.

segunda-feira, 23 de maio de 2022

CI/CD: DevOps sem Mistérios para Programadores COBOL

 

Bellacosa Mainframe ci cd em devops sem misterios



☕ Um Café no Bellacosa Mainframe

DevOps sem Mistérios para Programadores COBOL

Como entender CI/CD, Containers, Kubernetes, IaC e DevOps usando exemplos do IBM Z

"Um programador COBOL experiente descobre rapidamente que DevOps não substitui o Mainframe. Ele apenas automatiza aquilo que os grandes bancos já faziam há muitos anos."


Antes de tudo...

Imagine um banco.

Todos os dias existem milhares de programas COBOL sendo alterados.

Imagine fazer isso manualmente.

Editar.

Compilar.

Gerar Load Module.

Fazer BIND.

Atualizar CICS.

Liberar produção.

Executar testes.

Se cada desenvolvedor fizesse isso do seu jeito...

...o banco pararia em poucas horas.

Foi exatamente para resolver esse problema que nasceu o DevOps.

Não para Cloud.

Não para Containers.

Mas para organizar o desenvolvimento.


1 — CI/CD

A imagem mostra:

Código

↓

Build

↓

Testes

↓

Deploy

Parece moderno.

Mas vamos traduzir.

No Mainframe seria algo parecido com:

Editar COBOL

↓

Compile

↓

Link Edit

↓

BIND DB2

↓

Newcopy CICS

↓

Testes

↓

Produção

Percebe?

É praticamente igual.

A diferença é que hoje tudo isso acontece automaticamente.


O que significa CI?

Continuous Integration.

Integração Contínua.

Na prática:

Em vez de esperar um mês para juntar alterações...

...cada alteração é integrada imediatamente.

Imagine cinco programadores.

Cada um altera um programa.

Antigamente:

João altera.

Maria altera.

José altera.

Carlos altera.

Tudo junta sexta-feira.

Sexta-feira...

Nada compila.

Ninguém sabe quem quebrou.

Hoje:

Commit

↓

Compile automático

↓

Teste automático

↓

Se falhar...

ninguém faz Merge.

Muito mais seguro.


No Mainframe

Imagine ISPW.

Imagine Endevor.

Imagine Changeman.

Quando você promove um componente...

Já existe uma pipeline.

Hoje ela apenas ficou mais inteligente.


2 — Container

Essa talvez seja a palavra mais mal compreendida.

Todo mundo fala:

"Container."

Mas...

O que é?

Imagine que você escreveu um programa COBOL.

Ele precisa:

  • Enterprise COBOL

  • LE Runtime

  • Db2 Client

  • MQ

  • Bibliotecas

  • Configuração

  • Certificados

Se você copiar apenas o executável...

Não funciona.

O Container resolve exatamente isso.

Ele empacota tudo.

Programa

+

Bibliotecas

+

Dependências

+

Configuração

+

Runtime

Tudo vira um único pacote.


Analogia Mainframe

Imagine um LOADLIB completo.

Ou uma STEPLIB preparada.

Você leva exatamente o ambiente necessário.

O Container faz isso para Linux.


Por que isso é importante?

Porque elimina:

"Na minha máquina funciona."

Essa frase praticamente desaparece.


3 — Kubernetes

A imagem chama Kubernetes de controlador de tráfego.

Gostei dessa definição.

Imagine um banco.

Existem:

Servidor A

Servidor B

Servidor C

Servidor D

Se um servidor morrer?

Quem percebe?

Quem cria outro?

Quem redistribui usuários?

Quem balanceia carga?

No mundo Cloud:

Kubernetes.


No Mainframe...

Quem faz isso?

Vários componentes.

WLM.

Sysplex.

Coupling Facility.

Dynamic Routing do CICS.

VIPA.

Parallel Sysplex.

Na prática...

IBM resolveu isso muito antes.

Só usou outros nomes.


O Kubernetes faz:

  • escala

  • reinicia

  • monitora

  • distribui

  • atualiza

Tudo sozinho.


4 — Infrastructure as Code (IaC)

Essa talvez seja a maior revolução.

Imagine instalar um servidor manualmente.

Clique.

Clique.

Clique.

Próximo.

Avançar.

OK.

Agora imagine repetir isso cem vezes.

Impossível.

Então surgiu:

Infrastructure as Code.

Em vez de clicar...

Você escreve.

Exemplo simplificado:

Servidor:

Linux

8 CPUs

32 GB

Porta 443

Firewall ativo

Rede privada

Pronto.

Um script cria tudo.


No mundo IBM Z

Isso lembra muito:

JCL.

Pense nisso.

JCL descreve infraestrutura.

Quero executar

este programa

com esta memória

este dataset

esta região

estas bibliotecas

Na essência...

JCL já era Infrastructure as Code.

Décadas antes do termo existir.


5 — Pipeline

Pipeline é uma linha de produção.

Literalmente.

A imagem mostra:

Código

Build

Teste

Scan

Deploy


No banco isso pode virar:

Developer

↓

Git

↓

Compile COBOL

↓

Compile Copybooks

↓

SQL Precompiler

↓

DBRM

↓

Bind

↓

Unit Test

↓

SonarQube

↓

Deploy QA

↓

Deploy Homologação

↓

Deploy Produção

Tudo automático.


Ferramentas comuns

GitHub Actions

GitLab CI

Azure DevOps

Jenkins

Tekton

ArgoCD

UrbanCode Deploy

ISPW

Endevor


6 — Monitoring

Depois que o sistema entra em produção...

Acabou?

Muito pelo contrário.

Começa o trabalho.

Monitoramento significa responder perguntas como:

CPU está alta?

Memória?

Tempo de resposta?

Fila MQ?

Db2?

CICS?

VSAM?

JES2?

SMF?


No IBM Z

Você já conhece muitos monitores.

RMF

OMEGAMON

SMF

SDSF

NetView

Tivoli

Z APM

Instana

Todos fazem exatamente isso.


Sem monitoramento...

Você só descobre o problema quando o cliente liga.


7 — Configuration Management

Esse conceito nasceu porque administradores faziam mudanças manualmente.

Servidor 1:

Java 17

Servidor 2:

Java 11

Servidor 3:

Java 21

Resultado?

Caos.

Ferramentas como:

Ansible

Chef

Puppet

SaltStack

garantem que todos fiquem iguais.


Analogia Mainframe

Pense em PROCLIB.

PARMLIB.

IEASYSxx.

JES2PARM.

RACF.

Tudo precisa permanecer consistente.

A diferença é que hoje isso é automatizado.


8 — CI/CD novamente

A oitava imagem aprofunda o assunto.

Vale destacar uma diferença importante.

Continuous Integration

Sempre compila.

Sempre testa.

Sempre valida.

Mas nem sempre publica.


Continuous Delivery

Tudo pronto.

Apenas alguém aperta:

Deploy.


Continuous Deployment

Nem isso.

Terminou os testes?

Produção automaticamente.


Bancos normalmente fazem:

CI

+

Continuous Delivery

Poucos usam Continuous Deployment completo.

Por razões regulatórias.


9 — IaC novamente

Agora aparecem ferramentas.

Terraform.

CloudFormation.

Pulumi.

Ansible.


Para um programador COBOL

A ideia é simples.

Você não administra servidores.

Você administra código que administra servidores.

É um novo nível de abstração.


10 — DevOps Culture

Essa é provavelmente a imagem mais importante.

Porque DevOps NÃO é ferramenta.

É cultura.

Imagine:

Desenvolvimento culpa Infraestrutura.

Infraestrutura culpa Banco.

Banco culpa Segurança.

Segurança culpa Rede.

Rede culpa Middleware.

Middleware culpa COBOL.

COBOL culpa CICS.

CICS culpa Db2.

Resultado?

Ninguém resolve.

DevOps diz:

Todos são responsáveis.


O objetivo

Eliminar silos.

Criar colaboração.

Automatizar tarefas repetitivas.

Aprender continuamente.

Compartilhar conhecimento.


O que muda para um Programador COBOL Padawan?

Antigamente bastava dominar:

  • COBOL

  • JCL

  • CICS

  • DB2

  • VSAM

Hoje isso continua essencial, mas não é suficiente em muitos projetos de modernização. Um profissional de IBM Z passa a ganhar vantagem competitiva quando também compreende:

  • Git e GitHub

  • GitFlow e Pull Requests

  • Jenkins, GitHub Actions ou Azure DevOps

  • UrbanCode Deploy ou ISPW Pipelines

  • SonarQube para análise estática

  • Docker e conceitos de Containers (mesmo que não execute COBOL dentro deles)

  • Kubernetes e OpenShift para entender onde vivem as APIs modernas

  • Ansible para automação de tarefas no z/OS

  • APIs REST e JSON

  • z/OS Connect Enterprise Edition

  • Observabilidade com Instana, OMEGAMON e OpenTelemetry

  • Segurança integrada com RACF, certificados digitais, OAuth2, JWT e TLS

  • Integração contínua de aplicações COBOL com pipelines automatizadas


A Grande Lição do Mestre

Quando um Padawan olha para CI/CD, Kubernetes, Infrastructure as Code ou DevOps, pode parecer que tudo isso pertence apenas ao mundo Linux e à Cloud. Mas um profissional experiente de IBM Z percebe algo diferente: esses conceitos representam uma evolução natural de princípios que o ecossistema mainframe já aplicava há décadas — padronização, automação, controle de mudanças, alta disponibilidade, rastreabilidade e confiabilidade.

A grande transformação não está em abandonar o COBOL. Está em conectá-lo a um ecossistema moderno de desenvolvimento contínuo, APIs, automação e observabilidade. O futuro do programador COBOL não é escolher entre "mainframe" ou "DevOps"; é dominar ambos e entender como fazer o IBM Z conversar com o restante da arquitetura corporativa.

No fim das contas, DevOps não substitui o conhecimento de um programador COBOL. Ele amplia esse conhecimento, permitindo que aplicações críticas continuem evoluindo com velocidade, segurança e qualidade — exatamente o que os maiores bancos do mundo esperam de seus sistemas mais importantes.





terça-feira, 12 de abril de 2022

Jenkins: O JES2 da Era DevOps que Todo Padawan COBOL Precisa Entender

 

Bellacosa Mainframe apresenta o jenkins para mainframers

☕ Um Café no Bellacosa Mainframe

Jenkins: O JES2 da Era DevOps que Todo Padawan COBOL Precisa Entender

"Se você já submeteu um JOB no JES2 esperando que tudo desse certo, então já conhece metade da filosofia do Jenkins. A diferença é que, no mundo moderno, quem dispara os jobs não é mais apenas um operador. É um robô extremamente paciente que nunca esquece um passo da esteira."

Existe uma pergunta que praticamente todo programador COBOL faz quando começa a conversar com equipes DevOps:

"Mas afinal... o que exatamente é esse tal de Jenkins?"

A resposta mais simples seria:

Jenkins é um servidor de automação.

Mas essa resposta é tão incompleta quanto dizer que o JES2 "serve apenas para executar jobs".

Na prática, Jenkins é muito mais do que isso.

Para quem vem do universo IBM Z, entender Jenkins fica extremamente fácil quando fazemos as analogias corretas.

Hoje vamos tomar mais um café e descobrir que talvez você já trabalhe com algo muito parecido há décadas...


Antes de existir DevOps...

Durante muito tempo o desenvolvimento Mainframe seguia uma sequência bastante conhecida.

O programador fazia alterações.

Compilava.

Testava.

Gerava Load Module.

Alguém promovia.

Outro aprovava.

Outro copiava bibliotecas.

Outro atualizava o pacote.

Outro executava testes.

Outro validava produção.

Era um processo enorme.

Muito humano.

Muito sujeito a erros.

E principalmente...

Muito lento.

Foi justamente daí que nasceu o conceito de automação de pipelines.


Imagine um operador que nunca dorme

Imagine existir um operador que:

  • nunca esquece um passo

  • nunca pula uma etapa

  • nunca executa fora de ordem

  • nunca chega atrasado

  • trabalha 24 horas

  • registra tudo

  • avisa quando algo falha

  • envia e-mails

  • chama APIs

  • dispara testes

  • gera documentação

  • cria containers

  • publica versões

Esse operador existe.

Seu nome é Jenkins.


A analogia perfeita para um coboleiro

Pense no seguinte fluxo clássico.

Editar COBOL

↓

Compilar

↓

Link Edit

↓

Executar Teste

↓

Validar RC

↓

Gerar pacote

↓

Mover Load

↓

Atualizar ambiente

↓

Notificar equipe

Agora imagine alguém executando tudo isso automaticamente.

Isso é Jenkins.


O Jenkins é um grande Scheduler?

Sim.

Mas com superpoderes.

Ele lembra um pouco:

  • JES2

  • Control-M

  • CA-7

  • ESP

  • IZWS

  • OPC

  • TWS

Só que em vez de apenas disparar JOBs...

Ele coordena toda a cadeia de desenvolvimento.


O pipeline é o novo JCL

Para quem programa COBOL existe uma analogia maravilhosa.

Pipeline é praticamente um JCL moderno.

Veja.

No JCL:

STEP010 EXEC PGM=IGYCRCTL

STEP020 EXEC PGM=IEWL

STEP030 EXEC PGM=TESTE

STEP040 EXEC PGM=IEFBR14

Cada STEP possui dependências.

Cada RC determina o próximo passo.

Pipeline faz exatamente isso.

Stage Build

↓

Stage Test

↓

Stage Package

↓

Stage Deploy

↓

Stage Validation

É a mesma filosofia.


Jenkinsfile é praticamente um PROC moderno

Todo pipeline costuma ficar armazenado em um arquivo chamado

Jenkinsfile

Para um padawan...

Pense nele como um PROC extremamente inteligente.

Nele existe:

  • condições

  • loops

  • paralelismo

  • variáveis

  • chamadas externas

  • scripts

Tudo automatizado.


O Build

Uma palavra muito usada.

Build.

O que significa?

No Mainframe:

Compilar

+

Link Edit

+

Gerar Executável

No mundo distribuído:

Build significa exatamente isso.

Produzir algo executável.


O Jenkins compila COBOL?

Sim.

E isso surpreende muita gente.

Hoje é comum encontrar pipelines como:

Git

↓

Jenkins

↓

IBM Dependency Based Build

↓

Compilador Enterprise COBOL

↓

DB2 Bind

↓

Package

↓

Deploy

↓

Testes

↓

Produção

Tudo automático.

Sem intervenção humana.


IBM Dependency Based Build

Conhecido como

DBB.

Ele virou praticamente o "make" oficial do Mainframe.

Com ele o Jenkins entende:

  • quais programas mudaram

  • quais COPYBOOKs foram alterados

  • quais programas dependem deles

  • quais precisam recompilar

Antes disso...

Era comum recompilar milhares de programas.

Hoje recompila apenas o necessário.


O Git virou a nova PDS?

Não exatamente.

Mas quase.

Antigamente:

PDS

↓

Membro

↓

ISPF Edit

Hoje:

Git Repository

↓

Branch

↓

Commit

↓

Merge

O conceito mudou.

Mas o objetivo continua igual.

Controlar código-fonte.


Onde entra o Docker?

Aqui aparece uma dúvida enorme.

"Mas Docker roda no Mainframe?"

Sim.

E não.

Depende.


Docker não substitui o z/OS

Jamais.

Docker não executa CICS.

Não executa JES2.

Não executa DB2 z/OS.

Não executa IMS.

Não executa RACF.

Então para que serve?


Docker é o laboratório portátil

Imagine um desenvolvedor Java.

Ele precisa:

  • Maven

  • Java

  • Node

  • Python

  • Git

  • Curl

  • SDKs

  • Ferramentas IBM

Ao invés de instalar tudo...

Ele usa um Container.


O coboleiro também usa Docker

Aqui vem um dos maiores Easter Eggs do mundo Mainframe.

Muitos desenvolvedores COBOL usam Docker diariamente...

Sem perceber.

Exemplo.

Dentro do container ficam:

  • Zowe CLI

  • Git

  • Groovy

  • Python

  • DBB

  • Ferramentas de Build

  • utilitários Unix

  • scripts

O COBOL continua no Mainframe.

Mas todo o ambiente DevOps roda dentro do Container.


Outro Easter Egg

Existe quem imagine:

"Docker executa COBOL."

Na prática...

O que normalmente acontece é:

Docker

↓

Zowe CLI

↓

SSH

↓

z/OSMF

↓

JES

↓

Compilador COBOL

↓

Mainframe

Ou seja...

Docker apenas prepara o ambiente.

Quem executa continua sendo o IBM Z.


Mais um Easter Egg

Muitas empresas possuem dezenas de Jenkins.

Cada um com uma função.

Jenkins DEV

↓

Jenkins QA

↓

Jenkins Produção

↓

Jenkins Infra

Eles conversam entre si.


Jenkins conversa com o Mainframe?

Muito.

Hoje existem plugins para:

  • z/OSMF

  • Zowe

  • SSH

  • FTP

  • SFTP

  • MQ

  • REST APIs

Tudo integrado.


Pipeline típico COBOL

Imagine um Commit.

Git Push

Automaticamente.

↓

Jenkins detecta alteração

↓

Baixa código

↓

Analisa dependências

↓

Compila COBOL

↓

Executa DBB

↓

Executa testes

↓

Executa SonarQube

↓

Publica resultados

↓

Gera artefatos

↓

Promove ambiente

↓

Notifica Teams

↓

Notifica Slack

↓

Fecha Change

Tudo isso pode levar poucos minutos.


E quando algo falha?

O pipeline para.

Exatamente como um STEP retornando:

RC=12

ABEND S0C7

SQLCODE -904

O Jenkins registra tudo.

Logs.

Tempo.

Erro.

Quem fez.

Qual Commit.

Qual Branch.

Tudo.


A importância dos Logs

Um bom coboleiro aprende cedo:

Nunca ignore o SYSPRINT.

No Jenkins vale exatamente a mesma regra.

Nunca ignore:

Console Output

Ali está praticamente tudo.


Como identificar pipelines ruins?

Alguns sintomas.

Build demora horas

Normalmente existe:

  • recompilação desnecessária

  • testes redundantes

  • scripts lentos


Pipeline enorme

Às vezes um pipeline possui:

5000 linhas

Ninguém entende.

Ninguém mantém.

É igual um JCL gigantesco.


Sem versionamento

Pipeline criado diretamente pela interface.

Erro clássico.

Sempre use:

Jenkinsfile

Versionado no Git.


Sem testes

Pipeline apenas compila.

Não testa.

É praticamente entregar COBOL sem executar.


Como evoluir?

Primeiro passo.

Automatizar.

Depois.

Padronizar.

Depois.

Medir.

Depois.

Melhorar continuamente.


Métricas importantes

Tempo de Build.

Tempo de Deploy.

Quantidade de falhas.

Rollback.

Lead Time.

Change Failure Rate.

São indicadores extremamente importantes.


O Pipeline perfeito existe?

Não.

Porque software muda.

Infra muda.

Ferramentas mudam.

Negócio muda.

Pipeline também precisa evoluir.


Integração entre ambientes

Uma boa esteira normalmente possui.

Developer

↓

Sandbox

↓

Integração

↓

Homologação

↓

Pré-Produção

↓

Produção

Cada ambiente possui regras diferentes.


O Jenkins respeita aprovações?

Sim.

É muito comum existir.

Build

↓

Testes

↓

Aguardando aprovação

↓

Deploy QA

↓

Aguardando CAB

↓

Deploy Produção

Nada acontece sozinho.


Segurança

Aqui mora um perigo enorme.

Nunca coloque:

  • senhas

  • tokens

  • passwords

  • certificados

Dentro do Jenkinsfile.

Use:

Credentials.

Vault.

Secrets.


O maior erro dos iniciantes

Criar um pipeline que funciona...

Somente na máquina dele.

Isso quebra um dos princípios do DevOps.

Tudo deve ser reproduzível.


Outra armadilha

Scripts gigantes.

Exemplo.

Shell Script

800 linhas

Ninguém mantém isso.

Divida responsabilidades.


Jenkins não faz milagres

Se o processo manual é ruim...

Automatizar apenas cria um desastre mais rápido.

Primeiro melhore o processo.

Depois automatize.


Como um Padawan COBOL deve estudar?

Uma boa sequência seria.

Git

Aprenda commits.

Branches.

Merge.

Pull Request.


Linux básico

Mesmo trabalhando no z/OS.

Você verá muito:

grep

awk

sed

chmod

curl

tar

gzip

Docker

Não precisa virar especialista.

Mas saiba:

  • criar imagem

  • executar container

  • montar volume

  • entrar no bash


Jenkins

Aprenda:

Pipeline

Stages

Agents

Workspace

Artifacts

Credentials


Groovy

Não precisa dominar.

Mas entender a sintaxe ajuda muito.


Curiosidades

Uma empresa pode executar milhares de pipelines por dia.

Algumas executam dezenas por minuto.

Há pipelines que duram:

20 segundos.

Outros:

8 horas.

Tudo depende da aplicação.


Curiosidade Mainframe

Muitas empresas possuem aplicações COBOL com mais de:

40 milhões de linhas.

Sem automação seria impossível manter tudo isso.


Curiosidade interessante

Um COPYBOOK alterado pode obrigar centenas de programas a recompilar.

É justamente aí que o DBB faz enorme diferença.


Curiosidade divertida

Muitos programadores COBOL nunca abriram a interface do Jenkins.

Eles apenas fazem:

git push

E alguns minutos depois...

Recebem um e-mail dizendo:

✔ Build Success

O lado psicológico

Uma boa esteira reduz ansiedade.

Você não fica imaginando:

"Será que esqueceram de promover?"

"Será que copiaram o Load?"

"Será que executaram o Bind?"

O Jenkins lembra.

Sempre.


Fraquezas do Jenkins

Embora seja extremamente poderoso, o Jenkins também apresenta desafios que um programador Mainframe precisa conhecer.

A primeira fraqueza é a manutenção. Quanto mais pipelines personalizados uma empresa cria, maior se torna o esforço para mantê-los. Um Jenkins mal administrado acaba se transformando em uma coleção de scripts difíceis de entender, semelhante àquela PROC antiga que apenas um analista aposentado sabia alterar.

Outra limitação é a dependência de plugins. O ecossistema do Jenkins é gigantesco, mas isso significa que plugins podem ficar desatualizados, incompatíveis entre si ou apresentar vulnerabilidades de segurança. É fundamental manter uma política de atualização e testes antes de promover novas versões para ambientes produtivos.

Também existe a questão da escalabilidade. Um único servidor Jenkins executando centenas de builds simultâneos pode tornar-se um gargalo. Por isso, grandes organizações costumam distribuir a carga utilizando Agents, que funcionam como "executores remotos" capazes de processar builds em paralelo.


Vantagens para quem trabalha com IBM Z

Para o universo Mainframe, o Jenkins traz benefícios que vão muito além da simples automação:

  • Elimina tarefas repetitivas.

  • Reduz erros humanos durante promoções.

  • Padroniza o processo de compilação.

  • Garante que todos utilizem as mesmas ferramentas.

  • Facilita auditorias e conformidade.

  • Integra facilmente Git, Zowe, DBB, SonarQube e plataformas de colaboração como Teams e Slack.

  • Produz histórico completo de todas as alterações realizadas.

Isso significa menos tempo resolvendo problemas operacionais e mais tempo escrevendo código COBOL de qualidade.


O futuro do Padawan COBOL

Há alguns anos era comum imaginar que um programador Mainframe viveria apenas dentro do ISPF.

Hoje a realidade é diferente.

O profissional moderno alterna naturalmente entre:

  • VS Code

  • Git

  • Jenkins

  • Docker

  • Zowe CLI

  • APIs REST

  • Enterprise COBOL

  • JCL

  • CICS

  • DB2

  • z/OS

Ele continua sendo um especialista em Mainframe, mas agora também compreende como sua aplicação percorre toda a esteira DevOps até chegar à produção.


Conclusão

Existe uma frase bastante conhecida no mundo DevOps:

"Se um processo precisa ser executado duas vezes, ele provavelmente deveria ser automatizado."

No universo IBM Z essa ideia faz ainda mais sentido. Sistemas críticos processam milhões de transações diariamente e não podem depender da memória de uma pessoa para lembrar cada etapa de compilação, teste e implantação.

O Jenkins não substitui o conhecimento do programador COBOL. Ele não escreve regras de negócio, não resolve um S0C7 e não otimiza um SQL ruim. O que ele faz é garantir que todo o caminho entre o commit e a produção seja repetível, rastreável e confiável.

Para o Padawan COBOL, aprender Jenkins é como aprender JCL décadas atrás: no começo parece apenas mais uma ferramenta, mas logo se percebe que ela se torna parte do trabalho diário. E quanto antes você entender como Git, Docker, Zowe, DBB e Jenkins trabalham em conjunto, mais preparado estará para atuar nos ambientes IBM Z modernos.

No fim das contas, o Jenkins é o JES2 da era DevOps: recebe solicitações, organiza a execução, controla dependências, registra tudo o que aconteceu e garante que cada etapa aconteça na ordem correta. A diferença é que, agora, a esteira começa muito antes do JOB chegar ao z/OS e termina muito depois da compilação do COBOL, conectando desenvolvimento, testes, segurança, observabilidade e entrega contínua em um único fluxo automatizado.

E esse é talvez o maior easter egg de todos: muitos dos conceitos considerados "modernos" no DevOps sempre existiram no Mainframe. Apenas ganharam novas ferramentas, novos nomes e uma interface muito mais amigável. O espírito continua o mesmo: processos confiáveis, automação inteligente e qualidade acima de tudo.


domingo, 20 de fevereiro de 2022

Ferramentas para Implementar CI/CD no Mainframe

 

Bellacosa Mainframe apresenta ferramentas ci/cd para mainframers

☕ Um Café no Bellacosa Mainframe

Ferramentas para Implementar CI/CD no Mainframe

Do Git ao IBM Z: Construindo uma Esteira Moderna para Aplicações COBOL

"O maior erro de um programador COBOL é imaginar que CI/CD significa apenas instalar Jenkins. O verdadeiro pipeline começa muito antes da primeira ferramenta e termina muito depois do deploy."

Durante muitos anos existiu um mito dentro das equipes de desenvolvimento IBM Z.

O mito dizia que DevOps era coisa de aplicações Java.

Que Docker era para Linux.

Que Git era para desenvolvedores Web.

Que CI/CD não fazia sentido para COBOL.

Enquanto isso, silenciosamente, bancos, seguradoras, bolsas de valores, empresas aéreas e grandes instituições financeiras começaram a automatizar praticamente todo o ciclo de desenvolvimento de aplicações Mainframe.

Hoje, um programa COBOL raramente percorre o caminho entre desenvolvimento e produção apenas pelas mãos de um operador. Em vez disso, ele passa por uma esteira automatizada composta por dezenas de ferramentas responsáveis por versionamento, compilação, análise de qualidade, testes, empacotamento, implantação, monitoramento e auditoria.

Se antigamente o programador entregava apenas um fonte COBOL, hoje ele entrega um conjunto de artefatos que precisam passar por um pipeline inteligente.

Neste café vamos conhecer as principais ferramentas que compõem esse ecossistema moderno.


O quebra-cabeça do CI/CD

Antes de falar de ferramentas, precisamos entender uma verdade importante.

Não existe uma ferramenta chamada CI/CD.

CI/CD é um conjunto de práticas.

Cada ferramenta resolve apenas uma parte do problema.

Imagine uma linha de montagem de automóveis.

Uma máquina solda.

Outra pinta.

Outra instala o motor.

Outra testa os freios.

Nenhuma delas constrói o carro sozinha.

No mundo DevOps acontece exatamente a mesma coisa.


O pipeline moderno

Um pipeline corporativo normalmente possui etapas como:

Git

↓

Merge

↓

Build

↓

Compile

↓

Static Analysis

↓

Unit Test

↓

Integration Test

↓

Artifact

↓

Deploy DEV

↓

Deploy QA

↓

Approval

↓

Deploy Production

↓

Monitoring

Cada etapa pode utilizar uma ferramenta diferente.


Git — O novo PDS do Coboleiro

A primeira ferramenta que todo desenvolvedor precisa conhecer é o Git.

Não importa se você trabalha com COBOL, PL/I, Assembler ou Java.

Sem controle de versões não existe CI/CD.

Git permite:

  • histórico completo;

  • rollback;

  • branches;

  • merge;

  • auditoria;

  • colaboração entre equipes.

Para quem vem do mundo IBM Z, uma boa analogia é pensar que o Git é um grande PDS inteligente que registra todas as alterações feitas em cada membro, preservando versões e identificando exatamente quem modificou cada linha de código.


GitHub, GitLab e Bitbucket

O Git controla versões localmente.

Já GitHub, GitLab e Bitbucket hospedam os repositórios e adicionam funcionalidades colaborativas.

Essas plataformas oferecem:

  • Pull Requests;

  • Code Review;

  • gestão de branches;

  • integração com pipelines;

  • controle de permissões;

  • rastreabilidade.

No dia a dia, um programador COBOL pode alterar um programa, abrir um Pull Request e aguardar a aprovação do líder técnico antes que o código seja integrado à branch principal.


Jenkins — O Maestro da Orquestra

Se o Git armazena o código, quem coordena a esteira?

Uma das respostas mais comuns é o Jenkins.

O Jenkins é um servidor de automação.

Sua função é executar tarefas automaticamente sempre que algum evento ocorre.

Por exemplo:

git push

↓

Executar Build

↓

Compilar

↓

Executar testes

↓

Publicar relatório

↓

Enviar e-mail

↓

Implantar

Para um coboleiro, o Jenkins lembra bastante um agendador de JOBs.

A diferença é que, em vez de executar apenas batchs, ele orquestra toda a cadeia de desenvolvimento.


GitHub Actions

Nos últimos anos, GitHub Actions tornou-se uma excelente alternativa ao Jenkins.

O pipeline fica descrito em arquivos YAML dentro do próprio repositório.

Exemplo simplificado:

Push

↓

Checkout

↓

Build

↓

Test

↓

Deploy

Toda alteração no código pode disparar automaticamente essa sequência.


GitLab CI

Quem utiliza GitLab encontra uma solução semelhante.

O arquivo .gitlab-ci.yml define as etapas do pipeline.

Cada etapa executa scripts específicos.

É uma excelente opção para organizações que desejam manter todo o ciclo DevOps em uma única plataforma.


Docker — O Ambiente que Viaja Junto

Talvez esta seja a ferramenta mais mal compreendida pelos desenvolvedores Mainframe.

Docker normalmente não executa aplicações z/OS.

Ele executa aplicações Linux.

Mas isso não significa que ele esteja distante do IBM Z.

Muito pelo contrário.

Imagine uma aplicação composta por:

  • Front-end React;

  • API Java;

  • Redis;

  • Kafka;

  • PostgreSQL;

  • COBOL no Mainframe.

Durante os testes, Docker pode subir automaticamente todos os componentes distribuídos, permitindo que apenas o Mainframe permaneça como ambiente externo.

Assim, o pipeline consegue validar toda a aplicação antes da entrega.


Easter Egg Bellacosa

Uma Docker Image lembra muito uma PROC catalogada.

Alguém preparou um ambiente padronizado.

Os demais apenas reutilizam.

Da mesma forma que uma PROC encapsula passos JCL reutilizáveis, uma imagem Docker encapsula bibliotecas, ferramentas e configurações.


IBM Dependency Based Build (DBB)

Agora entramos nas ferramentas específicas do mundo IBM Z.

O IBM Dependency Based Build foi criado para automatizar builds de aplicações Mainframe.

Seu grande diferencial é entender dependências entre:

  • programas COBOL;

  • COPYBOOKs;

  • JCLs;

  • BMS;

  • PL/I;

  • Assembler.

Imagine alterar um COPYBOOK.

Em vez de recompilar milhares de programas, o DBB identifica exatamente quais módulos dependem daquele componente.

Isso reduz drasticamente o tempo de build.


IBM Developer for z/OS (IDz)

Durante muitos anos o ISPF foi praticamente o único ambiente de desenvolvimento utilizado por programadores COBOL.

Hoje o IBM Developer for z/OS oferece recursos modernos:

  • edição inteligente;

  • autocomplete;

  • refatoração;

  • integração com Git;

  • depuração;

  • integração com pipelines.

Ele aproxima a experiência do desenvolvedor Mainframe daquela encontrada em IDEs modernas.


Zowe CLI

Poucas ferramentas revolucionaram tanto a integração entre Mainframe e DevOps quanto o Zowe.

O Zowe CLI permite executar comandos z/OS diretamente da linha de comando.

É possível:

  • enviar arquivos;

  • submeter JOBs;

  • consultar JES;

  • baixar datasets;

  • acessar USS;

  • manipular perfis.

Isso transforma o Mainframe em um participante natural dos pipelines modernos.

Um Jenkins pode executar comandos Zowe da mesma forma que executa comandos Linux.


z/OSMF

O z/OS Management Facility disponibiliza serviços REST para administração do ambiente.

Essas APIs permitem:

  • submeter JOBs;

  • consultar status;

  • manipular datasets;

  • automatizar operações.

Isso reduz a necessidade de scripts específicos e facilita a integração com ferramentas DevOps.


IBM UrbanCode Deploy

Quando falamos em implantação controlada, uma ferramenta bastante conhecida é o UrbanCode Deploy.

Ela oferece:

  • versionamento de pacotes;

  • promoção entre ambientes;

  • rollback;

  • aprovações;

  • auditoria;

  • histórico de deploys.

Em bancos, normalmente um pacote percorre DEV → QA → UAT → Produção obedecendo regras rígidas de governança.


SonarQube

Compilar não significa produzir código de qualidade.

É aí que entra o SonarQube.

Ele realiza análise estática identificando:

  • duplicação de código;

  • complexidade excessiva;

  • vulnerabilidades;

  • más práticas;

  • código morto.

No universo COBOL, também ajuda a localizar programas com manutenção difícil, excesso de GO TO ou baixa legibilidade.


Testes Automatizados

CI/CD sem testes automatizados é apenas automação de compilação.

Ferramentas como ZUnit permitem validar programas COBOL automaticamente.

Cada alteração dispara dezenas ou centenas de testes sem intervenção humana.

Isso reduz regressões e aumenta a confiança nas entregas.


Nexus e Artifactory

Após o build surge outra pergunta.

Onde armazenar os artefatos?

Ferramentas como Nexus Repository e JFrog Artifactory centralizam:

  • pacotes;

  • bibliotecas;

  • versões;

  • dependências.

Mesmo quando o artefato final é um LOAD Module, o pipeline pode armazenar documentação, scripts, relatórios e componentes auxiliares.


Ansible

Cada vez mais utilizado em ambientes híbridos.

Permite automatizar:

  • configuração;

  • implantação;

  • execução de comandos;

  • integração entre servidores Linux e Mainframe.

Com coleções específicas para IBM Z, torna-se possível executar tarefas administrativas repetitivas de forma padronizada.


OpenShift

Embora aplicações COBOL normalmente permaneçam no z/OS, muitos componentes modernos são executados em OpenShift.

APIs.

Microsserviços.

Monitoramento.

Dashboards.

Ferramentas de apoio ao pipeline.

Tudo isso pode coexistir com o Mainframe.


Monitoramento

Depois do deploy o trabalho não termina.

Ferramentas como:

  • Grafana;

  • Prometheus;

  • Elastic;

  • Splunk;

  • Dynatrace;

  • Instana.

permitem acompanhar métricas, logs e desempenho.

No IBM Z elas complementam informações provenientes de RMF, SMF e outras soluções tradicionais.


Segurança

Pipelines modernos também verificam:

  • credenciais;

  • certificados;

  • assinaturas;

  • vulnerabilidades;

  • conformidade.

O objetivo é impedir que software inseguro alcance produção.


Como tudo conversa?

Imagine o seguinte fluxo.

Git

↓

GitHub

↓

GitHub Actions

↓

Docker

↓

DBB

↓

Compile COBOL

↓

ZUnit

↓

SonarQube

↓

Artifact

↓

UrbanCode

↓

Produção IBM Z

Cada ferramenta executa apenas sua especialidade.

Juntas, constroem uma esteira extremamente confiável.


O erro mais comum

Muitas empresas acreditam que basta instalar Jenkins.

Não basta.

Sem:

  • versionamento;

  • testes;

  • padronização;

  • documentação;

  • governança;

o pipeline apenas automatiza problemas antigos.

Existe uma frase famosa no mundo DevOps:

"Automatizar um processo ruim apenas faz com que ele falhe mais rápido."


Como escolher as ferramentas?

Não existe resposta única.

Uma empresa pequena pode começar apenas com:

  • Git;

  • GitHub;

  • GitHub Actions;

  • Zowe.

Uma organização maior pode utilizar:

  • GitLab;

  • Jenkins;

  • DBB;

  • SonarQube;

  • UrbanCode;

  • ZUnit;

  • Artifactory;

  • OpenShift;

  • Ansible.

Tudo depende da maturidade do ambiente.


A jornada do Coboleiro Moderno

O desenvolvedor COBOL do futuro continuará escrevendo PROCEDURE DIVISION.

Continuará criando JCL.

Continuará utilizando Db2.

Continuará desenvolvendo CICS.

Mas também precisará compreender conceitos como:

  • Git;

  • Pull Request;

  • Merge;

  • Pipeline;

  • Docker;

  • YAML;

  • Testes Automatizados;

  • Quality Gates;

  • DevSecOps;

  • Observabilidade.

Isso não significa abandonar o Mainframe.

Significa ampliar suas competências.


Conclusão

Durante décadas, o IBM Z foi visto como uma ilha tecnológica, separado do restante da engenharia de software. Hoje essa visão já não corresponde à realidade. As ferramentas modernas de CI/CD demonstram que é possível integrar aplicações COBOL aos mesmos processos de automação, qualidade e governança utilizados no desenvolvimento distribuído, preservando toda a confiabilidade que tornou o Mainframe indispensável para os negócios.

O segredo não está em substituir tecnologias tradicionais, mas em conectá-las de forma inteligente. Git não elimina o conhecimento sobre bibliotecas PDS; Docker não substitui o z/OS; Jenkins não toma o lugar do JES2; Zowe não elimina o ISPF. Cada ferramenta complementa o ambiente e amplia a capacidade de entrega das equipes.

Para o COBOL Jr, dominar esse ecossistema representa uma enorme vantagem competitiva. Ele deixa de ser apenas um programador que compila programas e passa a compreender toda a jornada do software, desde o primeiro commit até o monitoramento da aplicação em produção. Essa visão sistêmica é cada vez mais valorizada em bancos, seguradoras e empresas que executam milhares de transações por segundo no IBM Z.

No universo Bellacosa Mainframe, a mensagem é simples: o COBOL continua sendo o motor dos negócios, mas o CI/CD é a esteira invisível que mantém esse motor evoluindo com velocidade, qualidade e segurança. O profissional que aprender a combinar a robustez do Mainframe com as práticas modernas de DevOps estará preparado para construir a próxima geração de aplicações críticas, onde tradição e inovação caminham lado a lado.


Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...