Translate

Mostrar mensagens com a etiqueta CI/CD. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta CI/CD. Mostrar todas as mensagens

segunda-feira, 20 de julho de 2026

CI/CD : Quando Batman, Robin, GitHub Actions e Tekton Descobriram que um JOB JCL Também Pode Vestir uma Capa

 

Bellacosa Mainframe e o ci/cd para iniciantes, uma santa charada

☕ Um Café no Bellacosa Mainframe

CI/CD sem Mistérios para Programadores COBOL

Quando Batman, Robin, GitHub Actions e Tekton Descobriram que um JOB JCL Também Pode Vestir uma Capa

"POW!"
"BAM!"
"ZAP!"

Imagine que você entrou em um Data Center da IBM em 1978.

De repente, a porta explode.

Surge Batman correndo pelos corredores do CPD.

Robin grita:

"Santo Pipeline, Batman! Alguém fez um deploy direto em produção!"

Batman olha para o console 3270.

Na tela aparece:

ABEND=S0C7

Batman suspira.

— Robin... alguém ignorou o CI.

Robin responde:

— E também esqueceu o CD...

Batman abaixa a cabeça.

— Chamem o Comissário Gordon.

Só que o Comissário Gordon, em 2026, atende pelo nome de GitHub Actions.


O verdadeiro vilão nunca foi o Git

Durante anos muitos programadores COBOL acreditaram que aprender Git era o grande desafio.

Depois vieram Docker.

Depois Kubernetes.

Depois YAML.

Depois Tekton.

Depois GitHub Actions.

Até que descobriram uma verdade curiosa.

Nenhuma dessas ferramentas é realmente difícil.

O difícil é entender como elas conversam entre si.

É exatamente isso que aprendemos ao longo do curso de Continuous Integration and Continuous Delivery (CI/CD).

E curiosamente...

Tudo faz muito sentido para quem já viveu dentro de um mainframe.


CI é apenas um JCL moderno

Essa frase costuma assustar desenvolvedores web.

Mas para quem programa COBOL...

Ela faz todo sentido.

Imagine um JOB.

STEP001
STEP002
STEP003
STEP004

Cada STEP depende do anterior.

Se um falha...

O JOB termina.

Agora troque:

STEP001 → Checkout

STEP002 → Compile

STEP003 → Teste

STEP004 → Deploy

Parabéns.

Você acabou de entender um Pipeline.


GitHub Actions é o novo JES2

No curso inteiro existe uma ferramenta protagonista.

GitHub Actions.

Ela observa o repositório.

Sempre que alguém faz:

git push

Ela acorda.

Como o JES2 recebendo um JOB.

Ela pega um arquivo chamado:

.github/workflows/workflow.yml

E executa exatamente o que está escrito ali.

Não pensa.

Não interpreta.

Não improvisa.

Ela apenas executa.

Como qualquer bom scheduler.


O Workflow

No curso aprendemos que todo Workflow precisa de quatro partes.

Evento

push

ou

pull_request

É o equivalente ao operador apertando ENTER.


Runner

ubuntu-latest

É a máquina onde tudo acontece.

Pense nela como um LPAR temporário.


Steps

Cada Step é um mini programa.

Exemplo:

Checkout

↓

Setup Node

↓

npm install

↓

ESLint

↓

Jest

No mainframe seria quase:

IEFBR14

↓

COBOL

↓

LINKEDIT

↓

TESTE

↓

EXECUÇÃO

O primeiro inimigo

Durante nosso projeto apareceu um erro curioso.

Recebemos nota zero.

Mas...

O CI estava verde.

Como isso era possível?

Batman chamou Alfred.

Alfred olhou cuidadosamente.

E respondeu:

"Mestre Bruce...

o problema não era o código.

Era o link."

Exatamente isso.

O Coursera esperava:

.github/workflows/workflow.yml

Nós enviamos:

workflow/

Resultado:

Zero.

Moral da história?

No mundo DevOps...

Caminhos importam.

Muito.


O AI Grader é como um compilador COBOL

Essa foi provavelmente a maior descoberta.

O avaliador automático não "entende" intenção.

Ele faz matching.

Se procura:

SERVICERUNNING

e você escreveu:

SERVICE RUNNING

Você perde ponto.

Mesmo estando correto.

Lembra bastante um compilador COBOL.

MOVE ZERO TO WS-TOTAL

é diferente de

MOVE ZEROS TO WS-TOTAL

Um detalhe muda tudo.


A importância dos Logs

Outro erro clássico.

Mandamos o log do GitHub Actions.

Mas a questão queria:

oc logs

Ou seja...

Logs da aplicação.

Não do pipeline.

Batman diria:

"Robin...

não investigue o Batmóvel quando o crime aconteceu dentro do Banco de Gotham."


O mistério do PVC

Durante o laboratório apareceu outro personagem.

pipeline-pvc

Muita gente acha que é apenas um volume.

Mas ele é muito mais.

É o HD temporário do Pipeline.

Imagine um SORT usando um dataset intermediário.

Sem ele...

O STEP seguinte não encontra nada.

No Tekton acontece igual.

Cada Task compartilha arquivos usando Workspaces.

E quem sustenta isso?

O PVC.


Tekton

Se GitHub Actions faz CI...

Tekton faz CD.

Ele possui três personagens.

Task

Uma única ação.

Como:

Lint

ou

Test

Pipeline

O roteiro completo.

Cleanup

↓

Git Clone

↓

ESLint

↓

Jest

↓

Buildah

↓

Deploy

PipelineRun

A execução.

Pense nela como:

SUBMIT JOB

Buildah

Muitos imaginam que Buildah é parecido com Docker.

Na prática...

Ele fabrica imagens OCI.

No curso ele aparece depois do Jest.

Porque primeiro validamos.

Depois construímos.

Nunca o contrário.


Deploy

A última etapa.

oc set image

troca a imagem do Deployment.

É o equivalente moderno do:

NEW LOAD MODULE

no mainframe.


Plano de Estudos para um Programador COBOL Júnior

Semana 1 — Git e GitHub

Objetivo:

  • Repositórios

  • Branches

  • Commits

  • Pull Requests

Prática:

  • Criar um repositório de exemplo.

  • Fazer commits pequenos e descritivos.

  • Aprender a resolver conflitos simples.


Semana 2 — GitHub Actions

Objetivo:

  • Workflow

  • Runner

  • Jobs

  • Steps

Exercício:

Criar um Workflow que execute:

npm install

↓

npm run lint

↓

npm test

Analogia mainframe:

  • Cada Step é como um EXEC em um JOB JCL.


Semana 3 — Testes Automatizados

Objetivo:

  • Jest

  • Cobertura

  • Qualidade

Prática:

  • Escrever testes para funções simples.

  • Corrigir falhas até obter pipeline verde.


Semana 4 — YAML

Objetivo:

  • Sintaxe

  • Indentação

  • Estruturas

Dica:

YAML não perdoa espaços errados.

Assim como JCL não perdoa colunas erradas.


Semana 5 — OpenShift

Objetivo:

  • Projetos (Namespaces)

  • Pods

  • Deployments

  • Services

  • Routes

Prática:

  • Implantar uma aplicação simples.

  • Consultar logs com oc logs.

  • Explorar recursos com oc get e oc describe.


Semana 6 — Tekton

Criar:

✔ Task

✔ Pipeline

✔ PipelineRun

Depois:

Cleanup

↓

Clone

↓

Lint

↓

Test

↓

Build

↓

Deploy

Semana 7 — Observabilidade

Aprender:

oc logs

oc describe

oc get pods

oc get pvc

oc get pipelineruns

Um bom DevOps passa mais tempo lendo logs do que escrevendo YAML.


Semana 8 — Projeto Final

Monte seu próprio pipeline.

Colete evidências.

Revise links.

Valide nomes de arquivos.

Simule a submissão.

E só então envie.


Dicas de Ouro

  • Faça commits pequenos e frequentes.

  • Nunca envie um pipeline sem executá-lo.

  • Leia cuidadosamente o texto das questões: muitas reprovações acontecem por responder com um link quando era pedido um log, ou vice-versa.

  • Use nomes consistentes para arquivos e Tasks.

  • Guarde capturas de tela e saídas de terminal conforme o laboratório exige.


Easter Eggs Bellacosa Mainframe

  • Bat-Sinal = GitHub Actions: quando há um push, o sinal acende e o pipeline entra em ação.

  • Robin = Jest: sempre conferindo se Batman não esqueceu de testar.

  • Alfred = ESLint: discreto, elegante e sempre apontando os pequenos defeitos antes que virem um desastre.

  • Comissário Gordon = OpenShift Console: mostra a situação da cidade (ou do cluster) em tempo real.

  • Batmóvel = PipelineRun: é ele que coloca toda a operação em movimento.

  • Caverna do Batman = Data Center: cheia de equipamentos, monitores e automação.

  • Coringa = Deploy direto em produção sem testes: divertido por alguns segundos... até tudo explodir.



A Grande Lição

O curso de CI/CD ensina ferramentas, mas a verdadeira habilidade adquirida é pensar em automação, repetibilidade e qualidade.

Para um programador COBOL, isso não é um mundo totalmente novo. É uma evolução natural de conceitos que já existem há décadas em ambientes corporativos: execução em etapas, validações, logs, artefatos, controle de versões e disciplina operacional.

Quando você percebe isso, GitHub Actions deixa de ser uma novidade assustadora. Tekton deixa de parecer um enigma. YAML deixa de ser apenas uma linguagem cheia de espaços.

Você passa a enxergar que, por trás das tecnologias modernas, continuam existindo os mesmos princípios que fizeram o mainframe sobreviver por mais de sessenta anos: planejamento, confiabilidade, automação e controle.

E talvez seja esse o maior "POW!", "BAM!" e "ZAP!" desta aventura: descobrir que o herói nunca foi a ferramenta. O verdadeiro herói sempre foi o profissional que entende o processo inteiro e faz com que ele funcione de forma previsível, segura e elegante — seja em um terminal 3270, em um pipeline do GitHub Actions ou em um cluster OpenShift.


sexta-feira, 10 de julho de 2026

Kubernetes sem Mistérios : Os 50 Erros que Derrubam Clusters em Produção (e que um Profissional IBM Z já Aprendeu a Evitar Há Décadas)

Bellacosa Mainframe apresenta kubernetes sem misterios



☕ Um Café no Bellacosa Mainframe

Kubernetes sem Mistérios 

Os 50 Erros que Derrubam Clusters em Produção (e que um Profissional IBM Z já Aprendeu a Evitar Há Décadas)

Existe uma curiosidade interessante.

Muitos profissionais enxergam Kubernetes como uma tecnologia revolucionária.

Ela realmente é.

Mas existe outra forma de enxergá-la.

Para quem trabalhou anos em Mainframe, Kubernetes parece muito mais uma redescoberta de conceitos que IBM já aplicava há décadas.

Disponibilidade.

Balanceamento.

Isolamento.

Escalonamento.

Segurança.

Observabilidade.

Recuperação.

Controle de acesso.

Versionamento.

Rollback.

Tudo isso sempre existiu.

A diferença é que hoje esses conceitos aparecem usando containers, pods e YAML.

No IBM Z eles aparecem como:

  • JES2

  • WLM

  • RACF

  • Sysplex

  • CICS

  • Db2

  • GDG

  • VSAM

  • SMF

  • RMF

O objetivo continua exatamente o mesmo:

Fazer sistemas críticos permanecerem funcionando.


O grande problema

Criar um cluster Kubernetes é extremamente fácil.

Rodar um cluster durante cinco anos, sem interrupções relevantes, é extremamente difícil.

Quase todos os grandes incidentes em produção acontecem por pequenas decisões aparentemente inocentes.

É exatamente isso que o infográfico demonstra.


BLOCO 1

Cluster & Infrastructure

Erro 1

Um único Worker Node

Imagine um banco inteiro rodando em apenas um IBM Z.

Parece absurdo.

No Kubernetes isso acontece o tempo inteiro.

Node A

APP1
APP2
APP3
APP4

Se esse servidor falhar...

Tudo cai.


No Mainframe isso seria equivalente a:

  • um único CPC

  • sem Parallel Sysplex

  • sem GDPS

  • sem redundância

Alta disponibilidade simplesmente deixa de existir.


Erro 2

Não proteger o Control Plane

O Control Plane é o cérebro.

Ele contém:

  • API Server

  • Scheduler

  • Controller Manager

  • ETCD

Sem ele...

O cluster fica "cego".

Os containers podem continuar rodando por algum tempo.

Mas nada novo consegue ser criado.

É parecido com perder o JES2 Master.


Erro 3

Não fazer backup do ETCD

O ETCD guarda praticamente todo o estado do cluster.

É equivalente ao:

  • catálogo do sistema

  • SYS1

  • repositórios de configuração

Sem ETCD...

Você perdeu:

  • Deployments

  • Services

  • Secrets

  • ConfigMaps

  • RBAC

  • Namespaces

Ou seja...

Perdeu o cluster.


Erro 4

Misturar Desenvolvimento e Produção

Esse é um erro clássico.

Imagine colocar:

PIX
Internet Banking
Folha de Pagamento

junto com

Sistema de Testes

No mesmo cluster.

Um teste mal executado pode consumir:

CPU

Memória

IO

Rede

e afetar produção.


Mainframe resolveu isso há décadas.

LPARs.

WLM.

Classes de serviço.

Ambientes isolados.


BLOCO 2

Resource Management

Aqui aparece um dos assuntos mais importantes.

Recursos.

No Kubernetes nada funciona "no automático".


Requests

Requests significam:

"O mínimo que preciso."

Exemplo

CPU: 500m

Memory: 1GB

O Scheduler utiliza isso para decidir onde colocar o Pod.

Sem requests...

Ele simplesmente chuta.


É semelhante ao WLM tentando distribuir workload sem conhecer prioridades.


Limits

Agora vem outra história.

Limits representam o máximo permitido.

CPU

2 cores

RAM

4GB

Se ultrapassar...

O processo sofre throttling.

Ou pode ser encerrado.


OOMKilled

Talvez o erro mais famoso.

Quando um container usa mais memória que o permitido.

O Kernel Linux faz:

OOM Killer

e encerra o processo.

No Mainframe seria parecido com:

Storage exhaustion

ou

S878


HPA

Horizontal Pod Autoscaler.

Ele aumenta o número de Pods.

Mas cuidado.

Escalar uma aplicação ruim apenas cria mais instâncias lentas.

É parecido com colocar mais CICS Regions para um programa que possui SQL ruim.

O gargalo continua existindo.


BLOCO 3

Deployment

Aqui surgem alguns erros extremamente comuns.


Nunca usar latest

Jamais.

image: latest

Parece prático.

Mas amanhã...

"latest"

é outra versão.

Você perdeu reprodutibilidade.


Sempre utilize

1.2.7

2.1.0

5.8.12

ou melhor ainda

Digest SHA256.


Isso lembra muito o mundo Mainframe.

Nunca executamos:

PROD.COBOL

Sabemos exatamente qual Load Module foi promovido.


Readiness Probe

O Pod iniciou.

Mas será que ele está pronto?

Não necessariamente.

Uma aplicação Java pode precisar:

30 segundos.

Sem Readiness.

O Kubernetes envia tráfego imediatamente.

Resultado:

Erro.


Liveness Probe

Verifica se o processo continua vivo.

Se travar...

O Kubernetes reinicia.

É semelhante ao Automation do SA z/OS detectando um address space congelado.


Startup Probe

Ideal para aplicações pesadas.

Sem ela...

O Kubernetes mata a aplicação antes dela terminar de iniciar.


Rolling Update

Jamais atualizar todos os Pods simultaneamente.

Sempre:

1
2
3
4

Nunca:

100%

de uma vez

É exatamente o conceito de deploy gradual utilizado por bancos.


BLOCO 4

Networking

Aqui muitos iniciantes sofrem.


Network Policies

Sem elas...

Todo Pod conversa com qualquer Pod.

Isso é perigosíssimo.

Imagine um malware chegando.

Ele consegue acessar praticamente tudo.


É equivalente a um RACF onde todos possuem ALTER em todos os datasets.

Impensável.


DNS

Muitos problemas parecem ser de aplicação.

Na verdade são DNS.

service

↓

CoreDNS

↓

IP

Uma falha aqui afeta milhares de Pods.


NodePort

Expor NodePort diretamente para Internet.

Nunca.

Use:

Ingress

Load Balancer

API Gateway

WAF


TLS

Sem TLS.

Todo tráfego pode ser interceptado.

No Mainframe isso seria equivalente a utilizar TN3270 sem criptografia.


BLOCO 5

Storage & Security

Aqui aparecem erros gravíssimos.


Rodar como Root

Nunca.

Um container comprometido ganha acesso privilegiado.

Use:

runAsNonRoot

readOnlyRootFilesystem

drop capabilities

Secrets em ConfigMaps

Erro extremamente comum.

ConfigMap não criptografa.

Secrets devem permanecer em:

Secret

Vault

KMS

External Secrets


RBAC

Sem RBAC.

Todos administram tudo.

Imagine um operador podendo:

Excluir produção.

Criar usuários.

Modificar políticas.

É por isso que RACF existe.

RBAC é o RACF do Kubernetes.


BLOCO 6

Observabilidade

Talvez o capítulo mais importante.


Sem logs...

Não existe troubleshooting.


Sem métricas...

Não existe capacity planning.


Sem tracing...

Não existe análise distribuída.


Sem dashboards...

Não existe visão operacional.


Ferramentas normalmente utilizadas

Logs

  • ELK

  • OpenSearch

  • Loki

Métricas

  • Prometheus

Dashboards

  • Grafana

Tracing

  • Jaeger

  • Tempo

  • Zipkin

Alertas

  • Alertmanager


Isso lembra muito:

RMF

SMF

OMEGAMON

NetView

Tivoli

Z APM Connect


BLOCO 7

Operação

Aqui aparecem erros humanos.

E a maioria dos grandes incidentes nasce justamente deles.


Deploy manual

Nunca.

Sempre:

Git

Pipeline

Automação


GitOps

O Git torna-se a verdade absoluta.

Toda alteração passa por:

Commit

Review

Pipeline

Deploy

Rollback


É semelhante ao ChangeMan, ISPW ou Endevor.

Nada muda diretamente na produção.


Não testar recuperação

Backup sem restore não vale nada.

Todo DR precisa ser testado.

No IBM Z isso sempre foi obrigatório.

GDPS.

Recovery.

Image Copy.

Log Apply.


Não auditar segurança

Novas vulnerabilidades surgem diariamente.

Imagens precisam ser continuamente escaneadas.


Os "novos" erros 

Os últimos slides ampliam ainda mais a lista.

Entre eles destacam-se:

  • Não definir ResourceQuota.

  • Não usar LimitRange.

  • Ignorar Namespaces.

  • Expor aplicações diretamente.

  • Não realizar backup periódico do ETCD.

  • Não otimizar custos.

  • Não separar ambientes.

  • Não validar probes continuamente.

  • Não monitorar consumo financeiro do cluster.

Esses erros normalmente não derrubam o ambiente no primeiro dia, mas aumentam gradualmente a complexidade operacional e o risco de incidentes.


O grande paralelo com IBM Z

O aspecto mais interessante desse material é perceber que praticamente todos os "50 erros do Kubernetes" já possuem um equivalente consolidado no ecossistema IBM Z:

KubernetesIBM Z / Mainframe
RBACRACF
SchedulerWLM
Rolling UpdatePromoção controlada (Endevor/ISPW/ChangeMan)
ReplicaSetParallel Sysplex
ETCDCatálogos e repositórios críticos do sistema
ObservabilidadeRMF, SMF, OMEGAMON
Health ChecksSA z/OS, NetView
GitOpsGestão de configuração e promoção de software
SecretsRACF + ICSF + cofres corporativos
AutoscalingBalanceamento e classes de serviço do WLM

A tecnologia mudou, mas os princípios permanecem.


A maior lição para um Padawan COBOL

Quem está começando em Kubernetes costuma imaginar que dominar YAML, Pods e Deployments basta para operar um ambiente de produção. Na realidade, isso representa apenas uma pequena parte do trabalho.

Os profissionais mais experientes pensam primeiro em engenharia operacional. Antes de criar um único Deployment, eles definem como recuperar o cluster após uma falha, como limitar recursos para evitar que uma aplicação afete outra, como monitorar métricas, como proteger segredos, como automatizar implantações, como auditar mudanças e como garantir que qualquer alteração possa ser revertida rapidamente.

Essa é exatamente a mentalidade que sempre existiu no IBM Z. Durante décadas, bancos, seguradoras e governos construíram sistemas que precisavam permanecer disponíveis 24 horas por dia. Kubernetes não substitui esses princípios; ele os reapresenta em uma nova arquitetura baseada em containers.

No Bellacosa Mainframe, essa é talvez a maior mensagem deste material: um bom engenheiro de Kubernetes não é aquele que conhece mais comandos kubectl, mas aquele que projeta plataformas resilientes, observáveis, seguras e previsíveis. A verdadeira maturidade está menos na tecnologia utilizada e muito mais na disciplina de engenharia aplicada a ela.

quarta-feira, 8 de julho de 2026

DevOps no Mainframe: O Guia Definitivo para Quem Programa em COBOL e Quer Entrar no Mundo da Entrega Contínua

 

Bellacosa Mainframe e o guia do devops para mainframe

☕ Um Café no Bellacosa Mainframe

DevOps no Mainframe: O Guia Definitivo para Quem Programa em COBOL e Quer Entrar no Mundo da Entrega Contínua

"DevOps não é instalar uma ferramenta. É mudar a forma como pensamos sobre desenvolvimento, testes, implantação e operação. E sim... isso também vale para COBOL."

Se você trabalha com IBM Mainframe há alguns anos, provavelmente já ouviu alguém dizer:

"Mainframe não precisa de DevOps."

Ou então:

"DevOps é coisa de Java, Kubernetes e Cloud."

Nada poderia estar mais distante da realidade.

Hoje, os maiores bancos, seguradoras, empresas de cartão de crédito, telecomunicações e governos do mundo utilizam práticas de DevOps justamente nos ambientes mais críticos: os sistemas IBM Z.

A verdade é simples:

O código COBOL continua excelente. O processo de desenvolvimento é que evoluiu.

Neste café vamos entender, de maneira prática, o que é DevOps, como funciona, quais ferramentas existem, como começar do zero e como implantar esse modelo em uma fábrica de software Mainframe.

Pegue seu café.

Vamos conversar.


Antes de tudo: o que é DevOps?

A palavra DevOps vem da união de duas áreas:

  • Development (Desenvolvimento)

  • Operations (Operação)

Durante décadas essas equipes trabalharam separadas.

O desenvolvedor escrevia código.

O operador implantava.

O suporte resolvia problemas.

Quando dava errado...

Todo mundo culpava o outro.

DevOps nasceu justamente para eliminar esse conflito.

O objetivo é fazer todos trabalharem juntos durante todo o ciclo de vida do software.


O ciclo tradicional

Durante muitos anos o fluxo era parecido com isto:

Analista
      ↓
Programador COBOL
      ↓
Testes
      ↓
Homologação
      ↓
Mudança
      ↓
Produção

Tudo manual.

Muito e-mail.

Planilhas.

Checklist.

JCL executado manualmente.

Libraries copiadas.

Muitas chances de erro humano.


O ciclo DevOps

Agora imagine outro cenário.

Programador
      ↓
Git
      ↓
Build automático
      ↓
Testes automáticos
      ↓
Deploy automático
      ↓
Homologação
      ↓
Produção
      ↓
Monitoramento

Tudo rastreado.

Tudo versionado.

Tudo auditável.

Esse é o objetivo do DevOps.


DevOps não é uma ferramenta

Este talvez seja o maior erro dos iniciantes.

DevOps não é:

  • Jenkins

  • Git

  • GitHub

  • Azure DevOps

  • GitLab

Essas são ferramentas.

DevOps é uma cultura.

As ferramentas apenas ajudam.


Bellacosa Mainframe e o devops para iniciante mainframe

Os pilares do DevOps

Podemos resumir DevOps em seis grandes pilares.

1. Planejamento

Toda mudança começa aqui.

Exemplo:

  • Nova funcionalidade

  • Correção de bug

  • Mudança legal

  • Novo produto

Ferramentas:

  • Jira

  • Azure Boards

  • Trello

  • ServiceNow


2. Desenvolvimento

Aqui entra o programador COBOL.

Ele escreve código.

Exemplo:

Programa COBOL

+
JCL

+
PROC

+
Copybooks

+
DB2

+
CICS

Tudo precisa ficar versionado.


3. Integração Contínua (CI)

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

O sistema automaticamente:

  • compila

  • executa testes

  • verifica qualidade

  • gera relatórios

Sem intervenção humana.


4. Testes

Não basta compilar.

É necessário testar.

Tipos comuns:

  • teste unitário

  • teste funcional

  • teste integração

  • teste regressão

  • teste performance

No Mainframe isso pode envolver:

  • ZUnit

  • IBM Debug

  • File Manager

  • stubs

  • dados mascarados


5. Deploy

Depois da aprovação:

o sistema promove automaticamente os artefatos entre ambientes.

DEV

↓

QA

↓

HML

↓

PRD

Sem copiar datasets manualmente.


6. Monitoramento

Depois da implantação...

O trabalho continua.

Monitoramos:

  • CPU

  • tempo de resposta

  • erros

  • logs

  • abends

  • consumo

  • throughput


Bellacosa Mainframe e ferramentas para implementar o devops

O famoso CI/CD

Você verá muito essa sigla.

CI

Continuous Integration

CD

Continuous Delivery

ou

Continuous Deployment.

A diferença é simples.

Continuous Delivery

O deploy fica pronto.

Mas alguém aprova.

Continuous Deployment

O deploy acontece automaticamente.


Como isso funciona no Mainframe?

Imagine um programa COBOL.

Você altera uma linha.

Ao salvar:

Git

↓

Pipeline

↓

Compilação

↓

Link-edit

↓

Testes

↓

Deploy

↓

Homologação

Tudo automático.


Ferramentas mais usadas

Vamos conhecer as principais.

Git

O coração do DevOps.

Ele controla versões.

Permite:

  • histórico

  • branches

  • merge

  • rollback

Hoje praticamente todo projeto moderno usa Git.

Inclusive Mainframe.


GitHub

Hospeda repositórios Git.

Possui:

  • Pull Request

  • Code Review

  • Actions

  • Issues

Muito usado em projetos open source.


GitLab

Além do Git...

Possui pipeline integrada.

Muito utilizado em empresas.


Azure DevOps

Muito comum em bancos.

Possui:

  • Boards

  • Repos

  • Pipelines

  • Artifacts

  • Test Plans

Integra muito bem com ambientes corporativos.


Jenkins

Uma das ferramentas de automação mais famosas.

Ele executa:

  • compilação

  • testes

  • deploy

  • scripts

Tudo automaticamente.


IBM Dependency Based Build (DBB)

Ferramenta criada pela IBM para Mainframe.

Ela entende:

  • COBOL

  • PL/I

  • Assembler

  • JCL

  • Copybooks

Excelente para pipelines IBM Z.


IBM Developer for z/OS (IDz)

Substitui boa parte do ISPF.

Integra:

  • Git

  • Debug

  • Build

  • Pipeline


Zowe

Talvez a maior revolução dos últimos anos.

Permite acessar o Mainframe usando:

  • VS Code

  • APIs

  • CLI

  • Explorer

É praticamente uma ponte entre o mundo distribuído e o IBM Z.


VS Code

Hoje muitos programadores COBOL utilizam VS Code.

Com extensões adequadas é possível:

  • editar COBOL

  • enviar código

  • acessar datasets

  • executar comandos


Ansible

Automação de infraestrutura.

Pode automatizar:

  • configuração

  • deploy

  • instalação

  • tarefas repetitivas


SonarQube

Analisa qualidade do código.

Detecta:

  • duplicação

  • complexidade

  • bugs

  • vulnerabilidades

Inclusive existem plugins para COBOL.


JFrog Artifactory

Gerencia artefatos.

Armazena:

  • builds

  • binários

  • versões


Um pipeline simples

Imagine este fluxo.

Programador

↓

Git Commit

↓

Pipeline

↓

Compilar COBOL

↓

Executar testes

↓

Quality Gate

↓

Deploy DEV

↓

Deploy QA

↓

Deploy HML

↓

Produção

Sem copiar datasets manualmente.

Sem FTP.

Sem e-mail.


Como implantar DevOps em um sistema Mainframe?

Aqui está um roteiro simples.

Etapa 1

Mapeie o processo atual.

Pergunte:

Como o programa chega em produção?

Quem aprova?

Quem compila?

Quem faz bind?

Quem copia load modules?

Quem altera CICS?

Quem agenda o Job?


Etapa 2

Versione tudo.

Não apenas programas COBOL.

Também:

  • JCL

  • PROC

  • Copybooks

  • SQL

  • DDL

  • Scripts

  • Documentação


Etapa 3

Padronize.

Todos devem usar:

Mesmo padrão.

Mesmo fluxo.

Mesmo processo.


Etapa 4

Automatize a compilação.

Em vez de:

Editar

Compilar

Link

Testar

Faça:

Commit

↓

Pipeline

↓

Compilação automática

Etapa 5

Automatize testes.

Quanto mais testes...

Maior a confiança.


Etapa 6

Automatize deploy.

Reduza:

  • intervenção humana

  • erros

  • esquecimentos


Etapa 7

Monitore.

Depois do deploy acompanhe:

  • SMF

  • RMF

  • JES

  • SDSF

  • logs

  • CICS

  • DB2


Roadmap para quem está começando

Nível 1

Aprenda:

  • Git

  • GitHub

  • Branch

  • Merge

  • Pull Request


Nível 2

Aprenda:

  • Jenkins

  • Azure DevOps

  • GitLab CI


Nível 3

Aprenda:

  • Pipeline

  • YAML

  • Build


Nível 4

Aprenda:

  • Zowe CLI

  • VS Code

  • REST APIs


Nível 5

Aprenda:

  • DBB

  • IDz

  • SonarQube


Nível 6

Aprenda:

  • Docker (conceitos)

  • Kubernetes (conceitos)

  • OpenShift

Mesmo trabalhando apenas com Mainframe.


Nível 7

Aprenda observabilidade.

Conheça:

  • Grafana

  • Prometheus

  • Elastic

  • OpenTelemetry

Mesmo que parte do monitoramento do IBM Z utilize soluções específicas da IBM.


Quanto custa implantar?

A resposta depende do ambiente.

Há soluções gratuitas e corporativas.

Gratuitas

  • Git

  • GitHub (planos gratuitos)

  • VS Code

  • Jenkins

  • Zowe

  • SonarQube Community

O investimento principal será tempo de implantação, treinamento e adaptação dos processos.

Corporativas

Dependendo da empresa podem existir licenças para:

  • IBM Dependency Based Build

  • IBM Developer for z/OS

  • Azure DevOps

  • GitHub Enterprise

  • GitLab Enterprise

  • JFrog Artifactory

  • UrbanCode Deploy (ou soluções equivalentes)

  • ferramentas de testes automatizados

Além das licenças, considere:

  • infraestrutura

  • treinamento

  • consultoria

  • integração com RACF, CICS, DB2 e sistemas legados

  • manutenção contínua

Apesar do investimento inicial, a redução de retrabalho e de falhas costuma compensar em projetos de médio e grande porte.


Quais são os riscos?

Toda mudança traz desafios.

Os principais são:

Resistência cultural

O maior obstáculo raramente é técnico.

É comum ouvir:

"Sempre fizemos assim."

Sem apoio da liderança, a adoção perde força.

Automação mal planejada

Automatizar um processo ruim apenas faz o erro acontecer mais rápido.

Primeiro simplifique.

Depois automatize.

Falta de testes

Um pipeline sem testes é apenas um "copiador automático" de problemas.

Invista em testes desde o início.

Controle de acesso

Automações precisam respeitar políticas de segurança.

Integração com RACF, auditoria e segregação de funções são indispensáveis.

Dependência de poucas pessoas

Evite que apenas um especialista conheça o pipeline. Documente, treine a equipe e compartilhe conhecimento.


As grandes vantagens

Os benefícios aparecem rapidamente.

  • Menos erros manuais.

  • Entregas mais rápidas.

  • Maior rastreabilidade.

  • Rollback simplificado.

  • Melhor colaboração entre desenvolvimento e operações.

  • Qualidade de código mais alta.

  • Testes executados com frequência.

  • Auditoria facilitada.

  • Processos padronizados.

  • Redução do tempo de implantação.

  • Mais confiança para liberar novas versões.

  • Maior integração entre Mainframe e plataformas distribuídas.

Para ambientes regulados, como bancos e seguradoras, isso também significa maior conformidade e facilidade em auditorias.


E as desvantagens?

Nem tudo são flores.

  • Curva de aprendizado inicial.

  • Mudança cultural pode gerar resistência.

  • Necessidade de treinamento.

  • Tempo para configurar pipelines.

  • Investimento em ferramentas corporativas, quando necessário.

  • Ajustes em processos antigos.

  • Necessidade de governança para evitar pipelines desorganizados.

A boa notícia é que esses desafios diminuem à medida que a equipe ganha experiência.


Um exemplo prático

Imagine que uma alteração fiscal exige mudanças em um programa COBOL.

Sem DevOps:

  1. Desenvolvedor altera o código.

  2. Envia por e-mail.

  3. Outro profissional compila.

  4. Um terceiro faz o BIND.

  5. Alguém copia o módulo para homologação.

  6. Os testes são executados manualmente.

  7. A documentação é atualizada depois (ou esquecida).

  8. A implantação depende de uma janela operacional.

Com DevOps:

  1. O desenvolvedor cria uma branch.

  2. Implementa a alteração.

  3. Abre um Pull Request.

  4. O código passa por revisão.

  5. O pipeline compila automaticamente.

  6. Testes unitários e de integração são executados.

  7. A qualidade é validada pelo SonarQube.

  8. Após aprovação, o deploy é promovido para homologação.

  9. Com a autorização final, a mesma pipeline promove a versão para produção.

  10. Todo o processo fica registrado para auditoria.

Perceba que o COBOL continua sendo COBOL. O que mudou foi a forma de entregar software.


Conclusão

Durante muito tempo, DevOps foi visto como algo exclusivo do mundo Linux, Java e Cloud. Hoje sabemos que essa visão ficou no passado.

O IBM Z evoluiu. Ferramentas como Git, Zowe, IBM Dependency Based Build, Azure DevOps, Jenkins e pipelines de CI/CD permitem que aplicações COBOL participem do mesmo ciclo moderno de desenvolvimento utilizado nas demais plataformas da empresa.

Se você é um Padawan COBOL, não tente aprender tudo de uma vez. Comece pelo essencial: Git, versionamento, revisão de código e conceitos de integração contínua. Em seguida, avance para pipelines, automação de testes e deploy. Com essa base, ferramentas específicas do Mainframe farão muito mais sentido.

Lembre-se: DevOps não substitui o conhecimento de COBOL, JCL, CICS ou DB2. Ele potencializa esse conhecimento, reduzindo erros, aumentando a qualidade e permitindo que sistemas críticos evoluam com segurança.

No fim das contas, o maior legado do DevOps não é uma ferramenta nem um pipeline. É uma mudança de mentalidade: desenvolver, testar, implantar e operar como um único time, entregando valor continuamente para o negócio.

E esse, meu amigo Padawan, é um princípio que nunca ficará obsoleto.


terça-feira, 9 de junho de 2026

Neo COBOL : Como Git, VS Code, APIs, Zowe, DevOps e Inteligência Artificial Estão Transformando o Desenvolvimento Mainframe

Bellacosa Mainframe e o que há de mais moderno no COBOL

☕💣🚀 PADAWAN, O COBOL FUGIU DO TERMINAL VERDE!

Como Git, VS Code, APIs, Zowe, DevOps e Inteligência Artificial Estão Transformando o Desenvolvimento Mainframe

Existe uma pergunta que aparece em praticamente toda palestra sobre Mainframe.

Ela normalmente vem de alguém que nunca trabalhou com IBM Z.

Às vezes é um estudante.

Às vezes é um programador Java.

Às vezes é um gerente recém-chegado ao mundo corporativo.

A pergunta é sempre a mesma:

— Mas COBOL ainda existe?

E eu sempre respondo:

— Não apenas existe. Ele movimenta boa parte da economia mundial enquanto você dorme.

O mais curioso é que o COBOL de hoje não se parece nem um pouco com a imagem que muita gente guarda na cabeça.

Quando alguém fala em COBOL, normalmente imagina uma sala escura, um operador digitando comandos em uma tela verde, um terminal 3270 piscando e um monte de programas escritos há cinquenta anos.

Essa imagem até possui um fundo de verdade.

Mas ela representa apenas uma pequena parte da história.

A realidade é que o Mainframe passou por uma transformação silenciosa que poucas pessoas fora do mercado IBM perceberam.

E talvez essa seja uma das maiores revoluções tecnológicas dos últimos anos.


O Gigante Invisível Nunca Foi Embora

Enquanto o mundo discutia startups, aplicativos móveis e computação em nuvem, o Mainframe continuava fazendo aquilo que sempre fez melhor:

Processar volumes absurdos de dados com segurança, disponibilidade e confiabilidade.

Hoje ele continua presente em:

  • Bancos

  • Seguradoras

  • Bolsas de valores

  • Governos

  • Operadoras de cartão

  • Empresas aéreas

  • Sistemas de saúde

Bilhões de transações passam diariamente por sistemas COBOL.

Grande parte do dinheiro que circula pelo planeta toca algum programa COBOL em algum momento da jornada.

O curioso é que quase ninguém percebe isso.

Por isso costumo chamar o Mainframe de:

O Gigante Invisível da Computação.


O Dia em Que o Mainframe Conheceu o VS Code

Durante décadas o ambiente clássico de desenvolvimento foi dominado por ferramentas tradicionais como:

  • ISPF

  • TSO

  • SDSF

  • Editores 3270

Essas ferramentas continuam extremamente importantes.

Mas a nova geração de desenvolvedores cresceu usando interfaces gráficas, IDEs modernas e integração contínua.

A IBM percebeu isso.

O resultado foi uma mudança histórica.

Hoje um programador COBOL pode desenvolver utilizando:

  • Visual Studio Code

  • Git

  • GitHub

  • GitHub Actions

  • APIs REST

  • Zowe Explorer

Ou seja:

O desenvolvedor pode trabalhar em uma interface praticamente idêntica à utilizada por equipes Java, Python ou JavaScript.

A barreira psicológica que separava o Mainframe do restante da indústria começou a desaparecer.


Zowe: A Ponte Entre Dois Mundos

Talvez nenhuma ferramenta tenha simbolizado tanto essa transformação quanto o Zowe.

Criado sob o guarda-chuva do Open Mainframe Project, o Zowe funciona como uma ponte entre o universo moderno de desenvolvimento e o ambiente IBM Z.

Com ele é possível:

  • Navegar em datasets

  • Visualizar jobs

  • Consultar JES

  • Trabalhar com USS

  • Automatizar tarefas

  • Consumir APIs do z/OS

Tudo isso sem sair do VS Code.

Para quem cresceu usando ISPF, a experiência parece quase mágica.

Para quem veio do mundo distribuído, finalmente o Mainframe passa a parecer familiar.


Open Mainframe Project: O Movimento Que Mudou Tudo

Durante muitos anos existiu um mito.

O mito dizia que Mainframe era uma tecnologia fechada.

Que tudo era proprietário.

Que inovação só acontecia fora desse ambiente.

Então surgiu o Open Mainframe Project.

A iniciativa passou a reunir:

  • IBM

  • Bancos

  • Universidades

  • Comunidade Open Source

  • Grandes empresas globais

O objetivo era simples:

Modernizar o ecossistema sem destruir aquilo que o tornou confiável.

Foi dessa iniciativa que nasceram diversos projetos fundamentais.

Entre eles:

  • Zowe

  • COBOL Check

  • Z Open Editor

  • Mentorship Programs

  • Cursos gratuitos

O resultado foi um crescimento enorme da comunidade.


O Git Finalmente Chegou ao Mainframe

Antigamente o controle de versões era feito através de soluções corporativas específicas.

Hoje a realidade mudou.

Git tornou-se parte integrante do desenvolvimento Mainframe moderno.

Agora podemos:

  • Criar branches

  • Fazer merge

  • Abrir pull requests

  • Revisar código

  • Automatizar validações

Exatamente como acontece no restante da indústria.

O Mainframe deixou de ser uma ilha.

Ele tornou-se mais um participante do ecossistema DevOps.


DevOps Não É Apenas Moda

Existe quem pense que DevOps é apenas uma palavra bonita para colocar em apresentações.

Não é.

DevOps representa uma mudança cultural profunda.

No passado era comum ver equipes divididas:

Desenvolvimento de um lado.

Operação do outro.

Cada grupo trabalhando isoladamente.

Hoje o objetivo é integração.

Automação.

Colaboração.

Velocidade.

Qualidade.

E o IBM Z abraçou completamente essa filosofia.


CI/CD Também Chegou ao COBOL

Um dos maiores choques para quem está entrando no mercado Mainframe é descobrir que existem pipelines CI/CD para COBOL.

Sim.

Pipelines completos.

O fluxo pode ser algo como:

Commit → Build → Testes → Deploy → Produção

Ferramentas modernas como:

  • GitHub Actions

  • Jenkins

  • DBB

  • UrbanCode

  • Zowe CLI

permitem automatizar praticamente todo o ciclo de desenvolvimento.

O mesmo conceito utilizado em aplicações web agora pode ser aplicado a programas COBOL.


Testes Automatizados: O JUnit do Mainframe

Durante muito tempo existiu a falsa ideia de que COBOL não possuía testes unitários.

Hoje isso está completamente ultrapassado.

Ferramentas como COBOL Check permitem:

  • Criar testes automatizados

  • Validar regras de negócio

  • Executar regressões

  • Integrar com pipelines DevOps

O conceito é muito parecido com:

  • JUnit

  • NUnit

  • PyTest

A diferença é que agora estamos falando de COBOL.

Isso reduz riscos.

Melhora qualidade.

E aumenta a confiança durante mudanças em sistemas críticos.


APIs: O Mainframe Conversa Com Tudo

Outro mito clássico:

"O Mainframe é isolado."

Errado.

O Mainframe moderno conversa com praticamente qualquer tecnologia.

Hoje é comum encontrar:

  • APIs REST

  • Serviços Web

  • JSON

  • XML

  • Kafka

  • MQ

  • Cloud

Um programa COBOL pode ser chamado por:

  • Aplicativos móveis

  • Sites

  • Microserviços

  • Plataformas em nuvem

A integração tornou-se um dos pilares da modernização.


UTF-8: O COBOL Aprendeu Novos Idiomas

Durante décadas os sistemas corporativos lidaram principalmente com conjuntos de caracteres tradicionais.

Agora o mundo é global.

Precisamos lidar com:

  • Português

  • Japonês

  • Chinês

  • Árabe

  • Emojis

O Enterprise COBOL evoluiu para suportar:

  • UTF-8

  • NATIONAL

  • Dynamic-Length Items

Isso abre portas para aplicações verdadeiramente globais.


Multithreading e Performance

Outra área de enorme evolução foi a capacidade de execução paralela.

Recursos modernos permitem:

  • Multithreading

  • THREAD Compiler Option

  • LOCAL-STORAGE

  • THREADSAFE

Isso significa melhor aproveitamento dos recursos do hardware IBM Z.

E quando falamos de IBM Z, estamos falando de uma das plataformas mais poderosas já criadas para processamento transacional.


O Papel da Inteligência Artificial

Talvez estejamos entrando na fase mais interessante da história do Mainframe.

A Inteligência Artificial começou a chegar ao ambiente IBM Z.

Hoje já vemos:

  • Assistentes de código

  • Geração automática de documentação

  • Explicação de programas legados

  • Conversão de código

  • Análise de impacto

  • Apoio à modernização

Ferramentas como GitHub Copilot, Watsonx e soluções corporativas especializadas estão transformando a forma como trabalhamos.

O desenvolvedor deixa de gastar energia com tarefas repetitivas e passa a focar na lógica de negócio.


O Novo Programador Mainframe

O mercado mudou.

O profissional mais valorizado não é apenas aquele que conhece COBOL.

Nem apenas aquele que conhece DevOps.

O profissional mais procurado é aquele que consegue unir os dois mundos.

O desenvolvedor moderno entende:

  • COBOL

  • JCL

  • DB2

  • CICS

  • Git

  • APIs

  • VS Code

  • Zowe

  • DevOps

  • CI/CD

  • Testes automatizados

Ele compreende o legado.

Mas também compreende a inovação.

E essa combinação é extremamente rara.


O Futuro Já Chegou

Muitas pessoas continuam esperando o fim do Mainframe.

Esperam isso há décadas.

Enquanto isso, o IBM Z continua evoluindo.

Continua processando bilhões de transações.

Continua movimentando bancos.

Continua sustentando governos.

Continua integrando-se com nuvem, APIs, DevOps e Inteligência Artificial.

Talvez a maior surpresa não seja que o Mainframe tenha sobrevivido.

Talvez a maior surpresa seja perceber que ele nunca esteve tão moderno.

E aqui está a lição mais importante desta história.

☕💣🚀

OPERADOR, O COBOL NÃO FICOU PRESO NO PASSADO.

ELE SIMPLESMENTE ESPEROU O RESTO DA INDÚSTRIA ALCANÇÁ-LO.

Este texto já está pronto para publicação no Blogspot, LinkedIn Articles ou newsletter "Um Café no Bellacosa Mainframe".

domingo, 28 de dezembro de 2025

CI/CD no Mainframe: o que funciona, o que é mito e o que ninguém te contou

 

Bellacosa Mainframe e o ci/cd na otica mainframe

CI/CD no Mainframe: o que funciona, o que é mito e o que ninguém te contou

por El Jefe – Midnight Lunch

Durante anos, falar de CI/CD e mainframe na mesma frase era quase heresia.
De um lado, o discurso moderno: Git, pipelines, YAML, automação total.
Do outro, o mundo real: COBOL, JCL, CICS, batch crítico, auditoria, SLA e medo justificado de quebrar produção.

A boa notícia?
CI/CD é possível no mainframe.
A má notícia?
Não do jeito que a galera cloud imagina.

Este artigo não é evangelização. É sobrevivência técnica.



Antes de tudo: CI/CD não é ferramenta, é disciplina

O maior erro ao tentar “modernizar” o mainframe é achar que CI/CD é instalar Jenkins, Tekton ou OpenShift.

CI/CD é:

  • controle rigoroso de mudanças

  • builds reproduzíveis

  • rastreabilidade

  • automação com governança

  • rollback possível (e rápido)

Curiosamente, o mainframe sempre fez isso — só não chamava assim.

Endevor, ChangeMan, ISPW:

  • controlam versão

  • impõem fluxo

  • exigem aprovação

  • deixam rastro para auditoria

Ou seja:
o mainframe não está atrasado — ele só não usa camiseta preta escrito DevOps.



Onde o Git entra (e onde ele não manda)

Git é excelente para:

  • versionar código-fonte

  • colaboração entre times

  • automação de gatilhos (webhooks)

  • integração com pipelines modernos

Mas Git não substitui:

  • controle de promoção entre ambientes críticos

  • segregação de funções exigida por auditoria

  • governança de produção Z/OS

Por isso, o modelo que funciona não é Git versus Endevor.
É Git + Endevor.

Modelo realista (e profissional)

  • Git → source of collaboration

  • Endevor → source of control

  • Pipeline → ponte automatizada

Quem tenta matar o Endevor normalmente aprende da pior forma:
na auditoria… ou no incidente.


CI no mainframe: sim, dá — e dá bem

Integração Contínua em mainframe significa:

  1. Commit COBOL no Git

  2. Pipeline dispara:

    • análise estática (ex: Sonar, AppScan)

    • build automatizado (DBB)

    • compilação com dependências reais

  3. Geração de artefatos rastreáveis

  4. Publicação de evidências

Ferramentas comuns:

  • IBM Dependency Based Build (DBB)

  • Jenkins / Tekton

  • Scripts Z/OS

  • Analisadores estáticos

Nada mágico.
Nada “low-code milagroso”.
Só engenharia.


CD no mainframe: aqui mora o respeito

Entrega Contínua no mainframe não é deploy automático em produção.

É:

  • promoção controlada

  • aprovação explícita

  • janela operacional

  • rollback testado

O pipeline:

  • prepara

  • valida

  • evidencia

Quem promove para produção continua sendo:

  • o change

  • a operação

  • o processo

E isso não é atraso — é responsabilidade.


YAML no mainframe: vilão ou aliado?

YAML não é moda.
É apenas uma forma declarativa de dizer:

“este é o pipeline, nesta ordem, com estas regras”

Ele não substitui JCL.
Ele orquestra.

YAML:

  • define pipelines

  • descreve estágios

  • integra ferramentas

JCL:

  • executa trabalho pesado

  • fala direto com o Z

Quem confunde os dois costuma quebrar um ou outro.


GitOps: ótimo… com limites claros

GitOps funciona muito bem para:

  • Kubernetes

  • ambientes declarativos

  • infra elástica

No mainframe:

  • GitOps não governa produção

  • GitOps não substitui change

  • GitOps não remove segregação

Mas ele ajuda:

  • na camada distribuída

  • no controle de pipelines

  • na padronização

Argo CD conversa com OpenShift.
O OpenShift conversa com pipelines.
O pipeline conversa com o mainframe.

Esse é o desenho correto.


O anti-pattern clássico (e perigoso)

“Vamos colocar produção Z controlada direto por Git”

Tradução:

  • auditoria reprovada

  • operação em pânico

  • arquiteto desempregado

Modernizar não é destruir o que funciona.
É integrar com inteligência.


O verdadeiro estado da arte

Hoje, ambientes maduros fazem:

  • Git para código

  • Pipeline CI automatizado

  • DBB para build real

  • Endevor para promoção

  • Evidência para compliance

  • Observabilidade para melhoria contínua

Sem hype.
Sem discurso de palco.
Com produção estável.


Conclusão: CI/CD no mainframe é engenharia adulta

Mainframe não precisa virar cloud.
Precisa conversar com ela.

CI/CD no Z:

  • é possível

  • é poderoso

  • exige respeito ao contexto

Quem entende isso não briga com a plataforma.
E quem não entende… escreve post chamando o mainframe de legado morto.

Nós sabemos quem continua pagando o salário no fim do mês.


🕛 El Jefe – Midnight Lunch
Onde DevOps encontra o mundo real e sobrevive.

sexta-feira, 27 de dezembro de 2024

YAML na Prática : O guia do Programador COBOL Padawan para dominar configurações, automação e infraestrutura sem provocar um ABEND na indentação

 

Bellacosa Mainframe e o yaml na pratica e sem misterios

☕ Um Café no Bellacosa Mainframe

YAML na Prática sem Mistérios

O guia do Programador COBOL Padawan para dominar configurações, automação e infraestrutura sem provocar um ABEND na indentação

Imagine a seguinte cena.

Você passou anos navegando pelos corredores seguros do IBM Z. Conhece JCL, COBOL, CICS, Db2, VSAM, SDSF, RACF e talvez até tenha algumas cicatrizes de batalhas contra um S0C7 ocorrido às três da manhã.

Então, certo dia, alguém da equipe DevOps aparece e diz:

— Precisamos alterar o arquivo YAML do pipeline.

Você olha para a tela e encontra algo parecido com isto:

aplicacao:
  nome: CONTAS
  linguagem: COBOL
  ambiente: homologacao

Não há IDENTIFICATION DIVISION.

Não há ponto final obrigatório.

Não há colunas 7, 8 ou 72.

Não há //SYSIN DD *.

Mesmo assim, aqueles espaços aparentemente inocentes controlam aplicações, pipelines, containers, provisionamento de infraestrutura e processos automatizados.

Bem-vindo ao universo do YAML.

Para o programador mainframe, aprender YAML não significa abandonar COBOL, JCL ou o IBM Z. Significa construir uma ponte entre o processamento corporativo tradicional e o mundo de automação, APIs, Git, CI/CD, Ansible, Kubernetes, z/OSMF, Zowe e infraestrutura como código.

O YAML pode parecer simples, mas possui uma regra implacável:

A máquina não enxerga beleza estética. Ela enxerga estrutura.

Um espaço colocado no lugar errado pode alterar completamente o significado do documento.

Pegue sua caneca de café, ajuste os sensores da Enterprise e prepare-se. Vamos explorar YAML do básico ao laboratório prático.


1. Afinal, o que é YAML?

YAML é uma linguagem de serialização de dados legível por humanos, muito utilizada para representar configurações e estruturas de informação.

A versão oficial da especificação é a YAML 1.2.2, publicada para corrigir erros e esclarecer pontos da versão 1.2, sem introduzir mudanças normativas fundamentais.

Serializar dados significa representar informações estruturadas em um formato que possa ser:

  • gravado em arquivo;

  • transmitido entre sistemas;

  • interpretado por programas;

  • armazenado em repositórios;

  • usado para configurar ferramentas;

  • convertido para objetos em diferentes linguagens.

A sigla YAML significa:

YAML Ain’t Markup Language

Ou, em português:

YAML não é uma linguagem de marcação.

Trata-se de um acrônimo recursivo, uma brincadeira clássica da cultura da computação.

Isso procura deixar claro que YAML não foi criado para formatar páginas como HTML. Seu objetivo principal é representar dados.

Um arquivo YAML pode descrever:

  • servidores;

  • aplicações;

  • ambientes;

  • parâmetros de execução;

  • pipelines;

  • inventários;

  • jobs;

  • containers;

  • permissões;

  • tarefas de automação;

  • configurações de testes;

  • serviços e dependências.

No universo mainframe, ele pode representar:

  • nomes de datasets;

  • subsistemas CICS;

  • regiões IMS;

  • bibliotecas de carga;

  • parâmetros de compilação;

  • aplicações COBOL;

  • ambientes de desenvolvimento;

  • comandos TSO;

  • tarefas do Ansible;

  • definições de pipelines;

  • informações de deploy;

  • configurações do Zowe;

  • chamadas ao z/OSMF;

  • propriedades usadas pelo IBM Dependency Based Build.


2. YAML não é uma linguagem de programação

Esse ponto é essencial.

YAML não possui, por si só:

  • comandos executáveis;

  • estruturas de repetição;

  • processamento de arquivos;

  • cálculos;

  • acesso a banco de dados;

  • chamadas de subprogramas;

  • controle transacional;

  • gerenciamento de memória.

Ele apenas descreve dados.

Considere:

programa:
  nome: PGMPAG01
  linguagem: COBOL
  compilacao: obrigatoria

Esse documento não compila o programa.

Ele apenas declara informações.

Outra ferramenta poderá ler esse arquivo e decidir:

  1. localizar o fonte PGMPAG01;

  2. executar uma compilação;

  3. realizar o bind do programa;

  4. publicar o módulo de carga;

  5. iniciar os testes.

Portanto, pense no YAML como um SYSIN moderno e estruturado.

No mainframe, é comum entregar parâmetros para um utilitário:

//SYSIN DD *
  DELETE CLIENTES
  DEFINE CLUSTER(...)
  LISTCAT
/*

No mundo da automação, uma ferramenta pode receber parâmetros em YAML:

operacao: criar
dataset: USER01.TESTE.COBOL
tipo: biblioteca
formato:
  recfm: FB
  lrecl: 80

O princípio é parecido:

O arquivo descreve o que desejamos. Outra ferramenta interpreta e executa.


3. Onde um mainframer encontrará YAML?

YAML aparece com frequência crescente na modernização do IBM Z.

Ansible

Playbooks do Ansible são normalmente escritos em YAML.

- name: Verificar datasets
  hosts: zos
  tasks:
    - name: Consultar biblioteca COBOL
      ibm.ibm_zos_core.zos_data_set:
        name: USER01.COBOL
        state: present

Pipelines de CI/CD

GitHub Actions, GitLab CI, Azure DevOps e outras plataformas usam YAML para descrever pipelines.

jobs:
  compilar:
    steps:
      - name: Compilar COBOL
        run: python compilar.py

Kubernetes

Objetos como pods, deployments, services e configurações são frequentemente declarados em YAML.

Zowe

Arquivos de perfil e configurações de ferramentas do ecossistema Zowe podem envolver estruturas YAML.

IBM Dependency Based Build

Configurações de build e processos de automação podem utilizar YAML direta ou indiretamente, dependendo da arquitetura adotada.

Testes automatizados

Ferramentas podem usar YAML para definir:

  • massa de testes;

  • valores de entrada;

  • resultados esperados;

  • ambientes;

  • parâmetros de conexão.

Infraestrutura como código

YAML também aparece em ferramentas que provisionam, configuram ou descrevem ambientes de infraestrutura.

Por isso, conhecer YAML é como aprender a interpretar painéis de uma nave moderna. Você talvez não tenha construído o motor de dobra, mas precisa entender os controles.


4. O primeiro segredo: YAML é uma árvore

Um arquivo YAML deve ser imaginado como uma árvore hierárquica.

Veja:

aplicacao:
  nome: PAGAMENTOS
  plataforma: IBM Z
  componentes:
    - COBOL
    - CICS
    - Db2

A raiz possui uma chave chamada aplicacao.

Dentro dela existem:

  • nome;

  • plataforma;

  • componentes.

E componentes contém uma lista.

Podemos imaginar:

aplicacao
├── nome
├── plataforma
└── componentes
    ├── COBOL
    ├── CICS
    └── Db2

Essa visão ajuda muito o programador COBOL.

Pense em uma estrutura semelhante a uma área de dados:

01 WS-APLICACAO.
   05 WS-NOME          PIC X(20).
   05 WS-PLATAFORMA    PIC X(10).
   05 WS-COMPONENTES.
      10 WS-COMPONENTE OCCURS 3 TIMES PIC X(10).

Não é uma correspondência perfeita, mas a analogia é excelente para começar.


5. Os componentes fundamentais

5.1 Chave e valor

A estrutura mais comum é:

chave: valor

Exemplo:

programa: PGMCAD01
linguagem: COBOL

O espaço depois dos dois-pontos é importante.

Prefira:

programa: PGMCAD01

Evite:

programa:PGMCAD01

5.2 Mapas

Um mapa agrupa pares de chave e valor.

programa:
  nome: PGMCAD01
  tipo: batch
  linguagem: COBOL

programa contém um mapa com três propriedades.

Em COBOL, isso lembra um grupo de nível 01 com campos subordinados.

5.3 Listas

As listas são indicadas por hífens:

bibliotecas:
  - USER01.COBOL
  - USER01.COPYBOOK
  - USER01.JCL

Isso se aproxima conceitualmente de uma tabela OCCURS.

05 WS-BIBLIOTECA OCCURS 3 TIMES PIC X(44).

5.4 Lista de objetos

Podemos ter vários elementos complexos:

programas:
  - nome: PGMCAD01
    tipo: batch
    linguagem: COBOL

  - nome: PGMCIC01
    tipo: online
    linguagem: COBOL

Cada item da lista possui suas próprias propriedades.

5.5 Booleanos

ativo: true
compilar: false

Para arquivos modernos, prefira true e false.

Evite depender de palavras como yes, no, on e off, pois bibliotecas baseadas em versões ou esquemas diferentes do YAML podem tratá-las de formas distintas.

Quando houver dúvida sobre o tipo, use aspas:

resposta: "yes"
estado: "on"

5.6 Números

timeout: 30
quantidade_retentida: 10
percentual: 99.5

5.7 Valores nulos

responsavel: null

Isso representa ausência de valor.

5.8 Comentários

# Aplicação responsável pelo cadastro de clientes
aplicacao: CLIENTES

Comentários começam com #.

Eles são úteis, mas não devem substituir uma documentação adequada.


6. A Lei Suprema da Indentação

Em COBOL tradicional, a coluna sempre teve grande importância.

YAML também é profundamente sensível ao posicionamento, porém usa indentação para representar hierarquia.

Observe:

aplicacao:
  nome: FATURAMENTO
  ambiente: producao

Os campos nome e ambiente pertencem a aplicacao.

Agora veja:

aplicacao:
  nome: FATURAMENTO
ambiente: producao

Aqui, ambiente não pertence mais a aplicacao. Ele está no nível principal do documento.

O arquivo pode continuar sintaticamente válido, mas seu significado mudou.

Esse é um dos erros mais perigosos em YAML: o documento pode ser aceito pelo parser, mas representar outra estrutura.

Nunca use TAB para indentar

Use espaços.

A especificação do YAML trabalha com espaços na indentação, não com caracteres de tabulação.

Uma convenção segura é usar dois espaços por nível:

aplicacao:
  banco:
    nome: DB2P
    tabelas:
      - CLIENTES
      - CONTAS

Não existe obrigação universal de usar exatamente dois espaços, mas a consistência é obrigatória.

É como trabalhar com níveis COBOL:

01 REGISTRO.
   05 CLIENTE.
      10 NOME.
      10 CONTA.

O nível informa a estrutura. No YAML, a indentação cumpre esse papel.


7. Aspas: quando usar?

Muitos valores não precisam de aspas:

nome: FATURAMENTO
ambiente: producao

Entretanto, há situações nas quais as aspas evitam ambiguidades.

Strings que parecem números

codigo: "00123"

Sem aspas, um parser poderá tratar o valor como número e perder os zeros à esquerda.

Para um mainframer, isso é crítico. 00123 pode ser um código, não o número cento e vinte e três.

Datas

data_processamento: "2026-07-18"

Colocar datas entre aspas impede que determinadas bibliotecas façam conversões automáticas inesperadas.

Valores com caracteres especiais

descricao: "Processamento: fechamento mensal"

Valores semelhantes a booleanos

estado: "on"
resposta: "no"

Senhas ou tokens

Mesmo usando aspas, não grave segredos diretamente no YAML:

senha: "MinhaSenhaSecreta"

Isso continua sendo texto visível.

Aspas não criptografam.

O correto é usar:

  • gerenciadores de segredos;

  • variáveis de ambiente;

  • cofres de credenciais;

  • mecanismos protegidos pelo pipeline;

  • soluções corporativas integradas ao RACF ou à plataforma utilizada.


8. Textos com várias linhas

YAML possui recursos muito úteis para textos longos.

Preservando as quebras de linha com |

descricao: |
  Este processo executa o fechamento diário.
  Em caso de falha, consulte o runbook.
  Não reinicie sem verificar o checkpoint.

O | preserva as quebras de linha.

Dobrando as linhas com >

descricao: >
  Este processo executa o fechamento diário
  e deve ser acompanhado pela equipe
  responsável pela aplicação.

O > normalmente transforma as quebras em espaços, formando um parágrafo.

Isso pode ser útil para:

  • descrições;

  • comandos;

  • mensagens;

  • procedimentos operacionais;

  • instruções de deploy.


9. Laboratório no Windows

Vamos montar um ambiente prático.

Precisaremos de:

  • Windows 10 ou Windows 11;

  • Visual Studio Code;

  • extensão YAML;

  • Python;

  • biblioteca PyYAML;

  • Prompt de Comando ou PowerShell.

A documentação oficial do Python informa que o gerenciador de instalação para Windows pode ser obtido pela Microsoft Store ou pelos canais oficiais do Python.

A extensão YAML da Red Hat para Visual Studio Code oferece recursos como validação, detecção de erros, conclusão automática, visão estrutural do documento e suporte a esquemas.

Passo 1 — Criar a pasta do projeto

Abra o Prompt de Comando:

mkdir C:\yaml-mainframe
cd C:\yaml-mainframe

Essa será nossa USS local — uma pequena base de operações no Windows.

Passo 2 — Verificar o Python

Execute:

python --version

Em instalações mais novas do Windows, também poderá funcionar:

py --version

Depois, confirme o gerenciador de pacotes:

py -m pip --version

Passo 3 — Criar um ambiente virtual

No diretório do projeto:

py -m venv .venv

Ative o ambiente no Prompt de Comando:

.venv\Scripts\activate

No PowerShell:

.\.venv\Scripts\Activate.ps1

Quando o ambiente estiver ativo, o terminal normalmente exibirá algo semelhante a:

(.venv) C:\yaml-mainframe>

O ambiente virtual isola as dependências do projeto. Isso evita instalar bibliotecas globalmente sem necessidade.

Passo 4 — Instalar o PyYAML

python -m pip install pyyaml

PyYAML é uma biblioteca para ler e gerar YAML usando Python, e sua instalação pode ser realizada por meio do pip.

Passo 5 — Abrir o projeto no Visual Studio Code

code .

Caso o comando code não esteja disponível, abra o VS Code manualmente e selecione:

Arquivo → Abrir Pasta → C:\yaml-mainframe

Passo 6 — Instalar a extensão YAML

No VS Code:

  1. abra a área de extensões;

  2. pesquise por YAML;

  3. selecione a extensão publicada pela Red Hat;

  4. clique em instalar.

Agora teremos realce de sintaxe e auxílio na identificação de erros.


10. Nosso projeto: inventário de aplicações mainframe

Crie o arquivo:

inventario-mainframe.yaml

Digite:

---
empresa: Bellacosa Galactic Bank
ambiente: homologacao
responsavel: equipe-mainframe

zos:
  sistema: ZOS1
  versao: "3.1"
  sysplex: BELLAPLEX
  lpar: ZHML01

subsistemas:
  cics:
    ativo: true
    regioes:
      - nome: CICSHML1
        tipo: AOR
        porta: 30101

      - nome: CICSHML2
        tipo: TOR
        porta: 30102

  db2:
    ativo: true
    subsistema: DB2H
    versao: "13"
    databases:
      - CLIENTES
      - CONTAS
      - PAGAMENTOS

aplicacoes:
  - nome: CADASTRO-CLIENTES
    codigo: "APL001"
    tipo: online
    linguagem: COBOL
    transacao_cics: CCLI
    programa_principal: PGMCIC01
    bibliotecas:
      fonte: USER01.COBOL
      copybook: USER01.COPYLIB
      carga: USER01.LOAD
    dependencias:
      - Db2
      - CICS
      - VSAM
    compilacao:
      obrigatoria: true
      compilador: Enterprise COBOL
      opcoes:
        - RENT
        - SSRANGE
        - TEST

  - nome: FECHAMENTO-DIARIO
    codigo: "APL002"
    tipo: batch
    linguagem: COBOL
    programa_principal: PGMFEC01
    jcl: JOBFEC01
    bibliotecas:
      fonte: USER01.BATCH.COBOL
      copybook: USER01.COPYLIB
      carga: USER01.BATCH.LOAD
    dependencias:
      - Db2
      - DFSORT
    janela:
      inicio: "22:00"
      termino: "23:30"
    compilacao:
      obrigatoria: false
      compilador: Enterprise COBOL
      opcoes:
        - RENT
        - OPTFILE

politicas:
  permitir_deploy_manual: false
  exigir_aprovacao: true
  reter_backups: 10

mensagem_operacional: |
  Antes de executar qualquer deploy:
  1. verificar o resultado da compilação;
  2. conferir os testes automatizados;
  3. validar o plano de retorno;
  4. consultar o responsável pela mudança.

easter_egg:
  nave: USS Enterprise
  computador: LCARS-Z
  mensagem: "A lógica é apenas o começo da sabedoria."
...

Agora vamos entender o documento.


11. Explicando cada parte

Marcador inicial

---

Os três hífens indicam o início de um documento YAML.

Não são sempre obrigatórios, mas tornam o arquivo mais explícito, especialmente quando existe mais de um documento no mesmo fluxo.

Informações gerais

empresa: Bellacosa Galactic Bank
ambiente: homologacao
responsavel: equipe-mainframe

São propriedades simples no nível raiz.

Estrutura do z/OS

zos:
  sistema: ZOS1
  versao: "3.1"

zos é um mapa.

A versão foi colocada entre aspas para preservar seu significado como identificador textual, não como número para cálculos.

Subsistemas

subsistemas:
  cics:
  db2:

Temos um mapa chamado subsistemas, contendo outros mapas.

Regiões CICS

regioes:
  - nome: CICSHML1
    tipo: AOR

regioes é uma lista.

Cada item possui:

  • nome;

  • tipo;

  • porta.

Aplicações

aplicacoes:
  - nome: CADASTRO-CLIENTES

aplicacoes é uma lista de objetos complexos.

Cada aplicação contém propriedades próprias.

Bibliotecas

bibliotecas:
  fonte: USER01.COBOL
  copybook: USER01.COPYLIB
  carga: USER01.LOAD

Aqui usamos um mapa porque cada biblioteca possui uma função diferente.

Dependências

dependencias:
  - Db2
  - CICS
  - VSAM

É uma lista simples.

Opções de compilação

opcoes:
  - RENT
  - SSRANGE
  - TEST

Outro exemplo de lista.

Não estamos executando o compilador. Estamos documentando ou parametrizando quais opções uma automação deverá usar.

Mensagem operacional

mensagem_operacional: |

O símbolo | preserva as linhas, criando um pequeno runbook dentro do arquivo.

Final do documento

...

Os três pontos podem indicar o encerramento explícito do documento.

Assim como ---, são opcionais em muitos casos.


12. Criando o programa Python que lerá o YAML

Crie o arquivo:

ler_inventario.py

Digite:

from pathlib import Path
import sys

import yaml


ARQUIVO_YAML = Path("inventario-mainframe.yaml")


def carregar_yaml(caminho: Path) -> dict:
    """Carrega um arquivo YAML com tratamento básico de erros."""

    if not caminho.exists():
        raise FileNotFoundError(
            f"O arquivo {caminho} não foi encontrado."
        )

    with caminho.open("r", encoding="utf-8") as arquivo:
        dados = yaml.safe_load(arquivo)

    if not isinstance(dados, dict):
        raise ValueError(
            "O documento YAML deve possuir um mapa no nível principal."
        )

    return dados


def validar_inventario(dados: dict) -> list[str]:
    """Verifica a presença de campos obrigatórios."""

    erros = []

    campos_obrigatorios = [
        "empresa",
        "ambiente",
        "zos",
        "aplicacoes",
    ]

    for campo in campos_obrigatorios:
        if campo not in dados:
            erros.append(f"Campo obrigatório ausente: {campo}")

    aplicacoes = dados.get("aplicacoes", [])

    if not isinstance(aplicacoes, list):
        erros.append("O campo 'aplicacoes' deve ser uma lista.")
        return erros

    for indice, aplicacao in enumerate(aplicacoes, start=1):
        if not isinstance(aplicacao, dict):
            erros.append(
                f"A aplicação {indice} deve ser representada por um mapa."
            )
            continue

        for campo in ["nome", "codigo", "tipo", "linguagem"]:
            if campo not in aplicacao:
                erros.append(
                    f"Aplicação {indice}: campo '{campo}' ausente."
                )

    return erros


def exibir_relatorio(dados: dict) -> None:
    """Apresenta um resumo legível do inventário."""

    print("=" * 70)
    print("INVENTÁRIO GALÁCTICO DE APLICAÇÕES MAINFRAME")
    print("=" * 70)

    print(f"Empresa........: {dados['empresa']}")
    print(f"Ambiente.......: {dados['ambiente']}")
    print(f"Sistema z/OS...: {dados['zos']['sistema']}")
    print(f"Sysplex........: {dados['zos']['sysplex']}")
    print(f"LPAR...........: {dados['zos']['lpar']}")
    print()

    aplicacoes = dados["aplicacoes"]

    print(f"Aplicações encontradas: {len(aplicacoes)}")
    print("-" * 70)

    for aplicacao in aplicacoes:
        print(f"Nome...........: {aplicacao['nome']}")
        print(f"Código.........: {aplicacao['codigo']}")
        print(f"Tipo...........: {aplicacao['tipo']}")
        print(f"Linguagem......: {aplicacao['linguagem']}")
        print(f"Programa.......: {aplicacao['programa_principal']}")

        dependencias = aplicacao.get("dependencias", [])
        print(f"Dependências...: {', '.join(dependencias)}")

        opcoes = aplicacao.get("compilacao", {}).get("opcoes", [])
        print(f"Opções COBOL...: {', '.join(opcoes)}")
        print("-" * 70)


def main() -> int:
    try:
        dados = carregar_yaml(ARQUIVO_YAML)

        erros = validar_inventario(dados)

        if erros:
            print("O inventário possui inconsistências:")

            for erro in erros:
                print(f"- {erro}")

            return 8

        exibir_relatorio(dados)
        return 0

    except yaml.YAMLError as erro:
        print(f"Erro de sintaxe YAML: {erro}")
        return 12

    except (FileNotFoundError, ValueError, KeyError) as erro:
        print(f"Erro ao processar inventário: {erro}")
        return 16


if __name__ == "__main__":
    sys.exit(main())

13. Por que usamos safe_load?

No código temos:

dados = yaml.safe_load(arquivo)

Essa escolha é muito importante.

Evite usar indiscriminadamente:

yaml.load(arquivo)

Alguns carregadores YAML podem interpretar tags capazes de criar objetos específicos da linguagem ou executar comportamentos indesejados.

Quando o arquivo vem de origem externa ou não confiável, o risco aumenta.

safe_load limita o carregamento a tipos básicos e seguros, como:

  • mapas;

  • listas;

  • strings;

  • números;

  • booleanos;

  • valores nulos.

É o equivalente a aplicar o princípio de menor privilégio:

Não entregue autoridade de sistema a um arquivo de configuração apenas porque sua extensão termina em .yaml.


14. Executando o laboratório

No terminal, com o ambiente virtual ativo:

python ler_inventario.py

O resultado deverá ser semelhante a:

======================================================================
INVENTÁRIO GALÁCTICO DE APLICAÇÕES MAINFRAME
======================================================================
Empresa........: Bellacosa Galactic Bank
Ambiente.......: homologacao
Sistema z/OS...: ZOS1
Sysplex........: BELLAPLEX
LPAR...........: ZHML01

Aplicações encontradas: 2
----------------------------------------------------------------------
Nome...........: CADASTRO-CLIENTES
Código.........: APL001
Tipo...........: online
Linguagem......: COBOL
Programa.......: PGMCIC01
Dependências...: Db2, CICS, VSAM
Opções COBOL...: RENT, SSRANGE, TEST
----------------------------------------------------------------------
Nome...........: FECHAMENTO-DIARIO
Código.........: APL002
Tipo...........: batch
Linguagem......: COBOL
Programa.......: PGMFEC01
Dependências...: Db2, DFSORT
Opções COBOL...: RENT, OPTFILE
----------------------------------------------------------------------

Parabéns.

Você acabou de:

  1. criar um documento YAML;

  2. representar um ambiente mainframe;

  3. modelar aplicações batch e online;

  4. descrever bibliotecas e dependências;

  5. ler o documento com Python;

  6. validar campos obrigatórios;

  7. transformar dados declarativos em um relatório.

Isso já é a base de muitas automações reais.


15. Provocando um erro de propósito

Todo bom laboratório precisa de um Kobayashi Maru.

Altere:

aplicacoes:
  - nome: CADASTRO-CLIENTES

Para:

aplicacoes:
 - nome: CADASTRO-CLIENTES
     codigo: "APL001"

Execute novamente:

python ler_inventario.py

O parser deverá informar um erro de sintaxe ou estrutura.

Agora teste um erro mais perigoso.

Remova o campo codigo de uma aplicação, mas mantenha a sintaxe válida:

- nome: CADASTRO-CLIENTES
  tipo: online
  linguagem: COBOL

Nesse caso, o parser consegue ler o YAML, porém nossa validação retorna algo semelhante a:

Aplicação 1: campo 'codigo' ausente.

Isso ensina uma diferença essencial:

Validação sintática

Pergunta:

O documento está escrito de maneira compreensível para o parser?

Validação semântica

Pergunta:

O documento contém os dados corretos para nossa aplicação?

Um YAML pode ser sintaticamente perfeito e operacionalmente inútil.

Da mesma forma, um JCL pode passar por determinadas validações e ainda apontar para o dataset errado.


16. YAML Schema: o copybook do YAML

À medida que os documentos crescem, validar tudo manualmente torna-se difícil.

É aí que entram os esquemas.

Um schema pode definir:

  • quais campos são obrigatórios;

  • quais tipos são permitidos;

  • quais valores são aceitos;

  • qual estrutura deve ser seguida;

  • quais propriedades são proibidas;

  • quais listas podem ficar vazias.

Para o mainframer, um schema funciona conceitualmente como uma combinação de:

  • copybook;

  • layout de arquivo;

  • contrato de interface;

  • regras de validação.

Sem schema:

porta: banana

O YAML é válido, pois banana é uma string.

Mas, se o sistema espera uma porta TCP numérica, o conteúdo está errado.

Com um schema, o editor poderá avisar:

A propriedade porta deve ser um número inteiro.

Esse recurso é especialmente importante em:

  • pipelines;

  • Kubernetes;

  • APIs;

  • Ansible;

  • grandes inventários;

  • configurações corporativas.


17. Anchors e aliases: o COPY do YAML

YAML possui anchors e aliases, que permitem reutilizar blocos.

Exemplo:

configuracao_padrao: &padrao_cobol
  compilador: Enterprise COBOL
  opcoes:
    - RENT
    - SSRANGE
    - TEST

aplicacoes:
  - nome: CLIENTES
    compilacao: *padrao_cobol

  - nome: CONTAS
    compilacao: *padrao_cobol

O símbolo:

&padrao_cobol

cria uma âncora.

O símbolo:

*padrao_cobol

faz referência a ela.

É tentador pensar nisso como um COPY do COBOL.

Entretanto, tenha cuidado.

Anchors podem reduzir repetição, mas também tornar o documento mais difícil de entender. Algumas ferramentas possuem suporte parcial ou adotam comportamentos específicos.

Use anchors quando:

  • houver repetição significativa;

  • a equipe conhecer o recurso;

  • a ferramenta suportá-lo corretamente;

  • o ganho de manutenção superar a perda de clareza.

Não transforme seu YAML em um labirinto Klingon.


18. Boas práticas para mainframers

Use dois espaços por nível

aplicacao:
  nome: CLIENTES

A consistência vale mais que a preferência individual.

Nunca use TAB

Configure o editor para substituir TAB por espaços.

Prefira nomes claros

Evite:

apl:
  nm: CLI
  tp: O

Prefira:

aplicacao:
  nome: CLIENTES
  tipo: online

Use uma convenção de nomes

Escolha um padrão:

programa_principal

ou:

programa-principal

Evite misturar:

programa_principal:
programa-principal:
ProgramaPrincipal:

Coloque códigos entre aspas

codigo: "000123"

Coloque horários entre aspas

inicio: "08:00"

Coloque datas entre aspas quando desejar tratá-las como texto

data: "2026-07-18"

Não grave segredos

Nunca faça:

usuario: ADMIN
senha: SENHA123

Valide antes do commit

O fluxo ideal é:

editar → validar → revisar → testar → commit → pipeline

Mantenha arquivos pequenos

Um YAML com milhares de linhas torna-se difícil de revisar.

Considere separar por:

  • ambiente;

  • aplicação;

  • domínio;

  • equipe;

  • finalidade.

Documente a intenção

# Ativada somente em homologação para testes de integração
simular_falha_db2: true

O comentário explica o motivo, não apenas repete o nome do campo.

Use controle de versão

Arquivos YAML devem ser armazenados no Git sempre que fizer sentido.

Assim você consegue saber:

  • quem mudou;

  • o que mudou;

  • quando mudou;

  • por que mudou;

  • qual versão estava funcionando.


19. Cuidados que evitam desastres

Um espaço pode mudar a hierarquia

Revise sempre o diff antes do commit.

Valores podem ser interpretados automaticamente

Quando o tipo for importante, use aspas ou schemas.

YAML válido não significa configuração válida

Teste com a ferramenta que realmente consumirá o arquivo.

Ambientes não devem compartilhar segredos

Produção, homologação e desenvolvimento precisam de separação adequada.

Copiar da internet exige revisão

Um exemplo encontrado em um fórum pode:

  • usar outra versão;

  • depender de outra ferramenta;

  • conter parâmetros obsoletos;

  • assumir permissões inexistentes;

  • expor credenciais;

  • executar ações destrutivas.

IA também pode errar a indentação

Um YAML gerado por inteligência artificial deve passar por:

  • revisão humana;

  • lint;

  • schema;

  • teste em ambiente controlado;

  • análise de segurança.

Nunca envie um arquivo gerado automaticamente direto para produção.

Cuidado com comandos multilinha

Um comando embutido em YAML pode parecer correto, mas ser interpretado de forma diferente pelo shell.

Cuidado com duplicidade de chaves

Observe:

ambiente: teste
ambiente: producao

Dependendo da biblioteca, o segundo valor pode sobrescrever o primeiro sem o aviso esperado.

Para uma mudança de produção, isso pode ser desastroso.

Use validadores capazes de detectar chaves duplicadas.


20. Como evoluir depois deste laboratório

Depois de dominar este exemplo, o Programador COBOL Padawan pode avançar por uma trilha segura.

Nível 1 — Leitura

Aprenda a identificar:

  • mapas;

  • listas;

  • strings;

  • números;

  • booleanos;

  • valores nulos;

  • comentários;

  • hierarquia.

Nível 2 — Validação

Use:

  • extensão YAML no editor;

  • schemas;

  • linters;

  • scripts Python;

  • testes automatizados.

Nível 3 — Automação local

Crie scripts que leiam YAML para:

  • gerar JCL;

  • produzir relatórios;

  • montar parâmetros;

  • validar inventários;

  • criar documentação;

  • comparar ambientes.

Nível 4 — Git

Armazene arquivos em repositórios e pratique:

  • branch;

  • commit;

  • pull request;

  • diff;

  • revisão de código.

Nível 5 — CI/CD

Use YAML para criar pipelines de:

  • compilação;

  • testes;

  • análise estática;

  • empacotamento;

  • deploy;

  • rollback.

Nível 6 — Ansible para z/OS

Aprenda playbooks que possam:

  • criar datasets;

  • copiar arquivos;

  • submeter jobs;

  • consultar resultados;

  • executar comandos;

  • automatizar tarefas administrativas.

Nível 7 — Infraestrutura declarativa

Explore ferramentas que transformam YAML em estado operacional.

Aqui ocorre uma mudança importante de mentalidade.

Em vez de dizer apenas:

Execute este comando.

Você passa a declarar:

Quero que o ambiente permaneça neste estado.


21. Comparando YAML, JCL, JSON e XML

YAML

Excelente para arquivos legíveis e configurações hierárquicas.

programa:
  nome: PGMCAD01
  tipo: batch

JSON

Muito usado em APIs e comunicação entre aplicações.

{
  "programa": {
    "nome": "PGMCAD01",
    "tipo": "batch"
  }
}

A estrutura de dados é semelhante, mas JSON exige mais sinais de pontuação.

XML

Possui tags de abertura e fechamento.

<programa>
  <nome>PGMCAD01</nome>
  <tipo>batch</tipo>
</programa>

É mais verboso, porém muito utilizado em integrações corporativas e sistemas legados.

JCL

Descreve a execução de trabalhos no z/OS:

//STEP01 EXEC PGM=PGMCAD01
//STEPLIB DD DSN=USER01.LOAD,DISP=SHR

YAML não substitui automaticamente o JCL.

Uma automação poderá ler YAML e gerar ou submeter JCL, mas o JES continuará precisando compreender o trabalho no formato adequado.

A ponte pode ser:

YAML
  ↓
Pipeline ou script
  ↓
JCL
  ↓
JES2
  ↓
Programa COBOL

22. Curiosidades para a tripulação

YAML nasceu para ser legível

Seu desenho privilegia estruturas que humanos possam editar com relativa facilidade.

JSON pode ser visto como um subconjunto estrutural do YAML 1.2

A compatibilidade com o modelo de dados do JSON foi um dos objetivos importantes da linha YAML 1.2.

A extensão preferida é .yaml

Também é comum encontrar:

.yml

Porém, .yaml é mais explícita.

YAML não é automaticamente simples

Documentos pequenos são agradáveis.

Documentos gigantes, com anchors, merges, múltiplos documentos e regras implícitas, podem tornar-se difíceis de manter.

Indentação é estrutura, não decoração

No COBOL, uma indentação visual ruim pode dificultar a leitura.

No YAML, uma indentação errada pode mudar o significado.

A melhor configuração é aquela que pode ser validada

Quanto mais crítica for a automação, menos você deve depender apenas da leitura humana.


23. Easter egg: o arquivo de missão da Enterprise

Crie:

missao-enterprise.yaml
---
nave:
  nome: USS Enterprise
  registro: NCC-1701
  capitao: James T. Kirk

tripulacao:
  - nome: Spock
    funcao: ciencia
    linguagem_preferida: YAML

  - nome: Montgomery Scott
    funcao: engenharia
    linguagem_preferida: JCL

  - nome: Nyota Uhura
    funcao: comunicacoes
    linguagem_preferida: JSON

missao:
  destino: Sistema IBM Z
  objetivo: modernizar_sem_destruir
  diretriz_principal: |
    Integrar o novo ao legado.
    Preservar aquilo que funciona.
    Automatizar aquilo que se repete.
    Documentar aquilo que ninguém mais compreende.

alertas:
  tab_encontrado: vermelho
  segredo_no_repositorio: vermelho
  deploy_sem_teste: vermelho
  yaml_validado: verde

mensagem_final: >
  Vida longa ao COBOL,
  prosperidade ao mainframe
  e atenção absoluta à indentação.
...

Observe o detalhe:

objetivo: modernizar_sem_destruir

Essa talvez seja a missão mais importante de toda modernização mainframe.

Modernizar não significa jogar fora décadas de regras de negócio.

Significa:

  • entender;

  • proteger;

  • documentar;

  • integrar;

  • automatizar;

  • evoluir.


24. Conclusão: o YAML como nova ponte do mainframe

YAML não substituirá o COBOL.

Não substituirá o JCL.

Não substituirá o CICS, o Db2, o IMS ou o z/OS.

Sua função é diferente.

YAML permite descrever configurações e intenções de uma forma que ferramentas modernas conseguem interpretar.

Para o mainframer, ele representa uma nova camada de comunicação entre:

  • o código COBOL;

  • os pipelines;

  • os repositórios Git;

  • os processos de build;

  • as ferramentas de automação;

  • os ambientes distribuídos;

  • a infraestrutura;

  • as equipes modernas de desenvolvimento.

O veterano que conhece COBOL possui uma vantagem enorme.

Ele já entende:

  • estruturas hierárquicas;

  • contratos de dados;

  • processamento previsível;

  • validação;

  • disciplina operacional;

  • ambientes controlados;

  • importância da compatibilidade;

  • consequências de um erro em produção.

Aprender YAML não é começar do zero.

É traduzir conhecimentos antigos para uma nova interface.

O programador que entende um copybook consegue compreender um schema.

Quem entende um SYSIN consegue compreender um arquivo declarativo.

Quem entende JCL consegue compreender pipelines.

Quem conhece PROC e parâmetros consegue compreender templates.

Quem respeita produção aprende rapidamente a respeitar indentação.

A verdadeira transformação não ocorre quando o mainframer abandona sua experiência.

Ela ocorre quando usa essa experiência para dominar novas ferramentas.

Portanto, abra o editor, crie seus primeiros arquivos, provoque erros em ambiente controlado, valide cada estrutura e coloque o YAML para trabalhar ao lado do COBOL.

Porque, no fim das contas, seja dentro de uma LPAR, de um container ou da USS Enterprise, uma regra continua universal:

Configuração sem validação é apenas um futuro incidente esperando sua janela de produção.

Vida longa ao COBOL.

Prosperidade ao IBM Z.

E que nenhum TAB clandestino atravesse os escudos da sua indentação.