☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

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

quinta-feira, 2 de dezembro de 2021

🧪 RICK SANCHEZ E O JENKINSFILE DA DIMENSÃO C-137

Bellacosa Mainframe apresenta o jenkins

☕ Um Café no Bellacosa Mainframe

🧪 RICK SANCHEZ E O JENKINSFILE DA DIMENSÃO C-137

Jenkins Pipelines, Git, agentes, artefatos, containers, quality gates, rollback, observabilidade — e o dia em que Rick descobriu que o verdadeiro monstro da produção não era um alienígena, mas um deploy manual de sexta-feira.

Nota de estilo: este artigo usa Rick Sanchez como lente humorística e paródica. A explicação técnica, porém, é bem terrestre — e perigosamente aplicável à produção.



🎬 PRÓLOGO — MORTY, QUEM FEZ DEPLOY DIRETO EM PRODUÇÃO?

Imagine a cena.

03:17 da madrugada.

O celular toca.

Produção caiu.

CICS está respondendo.

Db2 está de pé.

MQ aparentemente está normal.

CPU está em 34%.

Nenhum LPAR está pegando fogo.

Mesmo assim, clientes não conseguem concluir transações.

Rick olha para Morty.

Morty... o que você mudou?

— Nada, Rick!

Morty, todo programador que diz "nada" às 03:17 acabou de alterar alguma coisa.

Cinco minutos depois descobrimos:

Mudança emergencial
      ↓
Compilação manual
      ↓
Load module copiado manualmente
      ↓
Produção
      ↓
"Funcionou aqui"

Rick pega a portal gun.

Não para fugir.

Para mandar o responsável para uma dimensão na qual toda implantação precisa ser feita manualmente pelo resto da eternidade.

E aqui começa nossa história.

Porque Jenkins Pipeline não é simplesmente uma ferramenta para "automatizar compilação".

Estamos falando de algo conceitualmente muito maior:

SOURCE
   ↓
BUILD
   ↓
TEST
   ↓
QUALITY
   ↓
SECURITY
   ↓
PACKAGE
   ↓
APPROVAL
   ↓
DEPLOY
   ↓
VERIFY
   ↓
OBSERVE

O Jenkins ajuda a transformar o processo de entrega do software em software.

A própria documentação do Jenkins define Pipeline como uma maneira de modelar o processo de entrega como código; um Jenkinsfile pode ficar junto ao código-fonte, permitindo revisão, histórico de auditoria e uma fonte comum da definição da pipeline. (Jenkins)

E para quem passou décadas no mainframe existe algo deliciosamente familiar nisso tudo.



🧪 CAPÍTULO 1 — RICK DESCOBRE QUE O JENKINS NÃO FAZ QUASE NADA

Esse é um dos primeiros conceitos que eu ensinaria para alguém começando em DevOps:

Jenkins não é a fábrica. Jenkins é o maestro da fábrica.

O Jenkins não precisa ser o compilador.

Não precisa ser o scanner de vulnerabilidades.

Não precisa ser o repositório Git.

Não precisa ser o repositório de artefatos.

Não precisa ser Kubernetes.

Ele coordena ferramentas que executam essas funções.

Pense:

                    ┌─────────────┐
                    │   JENKINS   │
                    │ ORCHESTRATOR│
                    └──────┬──────┘
                           │
        ┌──────────────────┼──────────────────┐
        ↓                  ↓                  ↓
       Git              Compiler          Tests
        │                  │                  │
        └──────────┬───────┴─────────┬────────┘
                   ↓                 ↓
             Security Scan      Artifact Repo
                   │                 │
                   └────────┬────────┘
                            ↓
                         Deploy
                            ↓
                       Production

Rick provavelmente resumiria:

"Morty, Jenkins não constrói a nave. Ele manda cada idiota da garagem fazer sua parte na ordem certa."

E isso é importante porque muita arquitetura ruim nasce quando Jenkins vira uma espécie de Deus DevOps.

Jenkins chama Docker.

Docker constrói uma imagem.

Jenkins publica a imagem em um registry.

Uma ferramenta de deployment ou Kubernetes executa essa imagem.

São responsabilidades diferentes.



🧠 CAPÍTULO 2 — O JENKINSFILE É O JCL DO DEVOPS?

Calma.

Antes que alguém arremesse um manual do JES2 na minha cabeça:

não tecnicamente.

Mas pedagogicamente a comparação é excelente.

Para um programador COBOL entrando em Jenkins, podemos imaginar:

Mundo mainframeJenkins/DevOps
JOBPipeline
STEPStage/Step
EXECexecução de ferramenta
RCexit status
SYSOUTlogs
load moduleartifact
PROCLIBlógica reutilizável/shared library
schedulerparte da orquestração

Não são equivalências arquitetônicas 1:1.

São pontes mentais.

Veja um JCL:

//BELLACOS JOB ...
//COMPILE EXEC PGM=IGYCRCTL
//LINK    EXEC PGM=IEWL
//TEST    EXEC PGM=TESTPGM

Agora uma pipeline extremamente simplificada:

pipeline {
    agent any

    stages {
        stage('Compile') {
            steps {
                sh './compile.sh'
            }
        }

        stage('Test') {
            steps {
                sh './test.sh'
            }
        }

        stage('Package') {
            steps {
                sh './package.sh'
            }
        }
    }
}

Um mainframer olha isso e pensa:

"Vocês inventaram STEP de novo."

😂

Mas existe uma evolução importantíssima.

O Jenkinsfile pode estar dentro do mesmo repositório Git da aplicação.

Portanto:

programa mudou
pipeline mudou
teste mudou
configuração mudou

Tudo isso pode passar pelo mesmo mecanismo de versionamento e revisão.

O Jenkins recomenda manter o Jenkinsfile no source control, justamente por benefícios como revisão, auditabilidade e uma fonte comum da definição da pipeline. (Jenkins)



🛸 CAPÍTULO 3 — CONTROLLER E AGENTS: RICK NÃO FAZ O TRABALHO PESADO

Imagine Rick administrando cem Mortys.

Rick recebe os pedidos.

Decide prioridades.

Escolhe quem executará cada tarefa.

Coordena tudo.

Mas seria absurdo Rick pessoalmente pegar cada programa, compilar, testar, empacotar e instalar.

No Jenkins existe uma ideia semelhante:

             JENKINS CONTROLLER
                    │
       ┌────────────┼────────────┐
       ↓            ↓            ↓
   AGENT-01     AGENT-02     AGENT-03
    Linux        z/OS         Docker

O controller administra a coordenação.

Os agents fornecem ambientes onde o trabalho efetivamente é executado.

Um agent poderia possuir:

Java
Maven
Git
Docker
Python
Node.js

Outro poderia possuir ferramentas específicas.

No universo IBM Z, podemos ter integração com ferramentas e processos executados no próprio z/OS.

E novamente surge uma analogia útil com mainframe.

JES2 recebe trabalho, gerencia filas e participa da seleção/execução conforme recursos e classes.

Não significa que Jenkins seja "um JES moderno".

Não é.

Mas o conceito de separar orquestração do trabalho de execução do trabalho certamente não provoca choque cultural em quem conhece mainframe.



🧬 CAPÍTULO 4 — O PIPELINE DE PRODUÇÃO NÃO É BUILD → DEPLOY

Essa simplificação é perigosa:

BUILD → DEPLOY

Uma pipeline de produção madura se parece muito mais com:

COMMIT
   ↓
CHECKOUT
   ↓
DEPENDENCY ANALYSIS
   ↓
BUILD
   ↓
UNIT TEST
   ↓
STATIC ANALYSIS
   ↓
SECURITY SCAN
   ↓
QUALITY GATE
   ↓
PACKAGE
   ↓
PUBLISH ARTIFACT
   ↓
DEPLOY DEV
   ↓
INTEGRATION TEST
   ↓
DEPLOY SIT
   ↓
DEPLOY UAT
   ↓
APPROVAL
   ↓
DEPLOY PROD
   ↓
VERIFY
   ↓
OBSERVE

Cada estágio deveria responder a uma pergunta.

Build: conseguimos construir?

Test: o comportamento conhecido continua correto?

Security: introduzimos riscos conhecidos?

Quality Gate: atingimos os critérios mínimos?

Deploy: conseguimos instalar?

Verify: o software realmente iniciou e responde?

Observe: continua saudável sob tráfego real?

É aí que aparece uma das frases mais importantes deste artigo:

🚨 DEPLOY SUCCESS ≠ SYSTEM HEALTHY

Morty vê isto:

DEPLOY ........ SUCCESS

e comemora.

Rick pergunta:

"E as transações?"

Silêncio.


💳 CAPÍTULO 5 — O SISTEMA ESTÁ VERDE, MAS O NEGÓCIO ESTÁ MORTO

Vamos trazer isso para Cards & Payments.

Imagine um programa COBOL:

AUTHORIZATION

Antes do deploy:

Approval Rate: 87%
CICS Response: 120 ms
CPU: 32%
Db2: NORMAL
MQ: NORMAL

Depois:

Approval Rate: 41%
CICS Response: 118 ms
CPU: 31%
Db2: NORMAL
MQ: NORMAL

Dashboard de infraestrutura:

🟢 CPU

🟢 Memória

🟢 CICS

🟢 Db2

🟢 MQ

Dashboard do negócio:

🔥🔥🔥🔥🔥🔥🔥

A aplicação está respondendo perfeitamente...

e recusando clientes perfeitamente.

Isso nos conduz a uma evolução importantíssima de observabilidade:

TECHNICAL HEALTH
        +
BUSINESS HEALTH
        =
PRODUCTION HEALTH

Para uma autorização de cartões poderíamos acompanhar:

approval rate
decline rate
timeout rate
reversal rate
duplicate transactions
average authorization latency
transactions/minute

Isso é infinitamente mais poderoso do que perguntar apenas:

"A JVM está viva?"

Ou:

"O CICS está UP?"


🧪 CAPÍTULO 6 — QUALITY GATES: RICK PROÍBE MORTY DE APERTAR O BOTÃO

Imagine:

Compile       OK
Unit Tests    OK
Coverage      42%
Security      CRITICAL
Quality       FAILED

Morty pergunta:

— Posso mandar para produção?

Rick:

Claro. E depois podemos testar se respirar no espaço sem capacete realmente mata.

Quality Gates transformam regras organizacionais em controles executáveis.

Podemos determinar:

IF compilation failed
    STOP

IF mandatory tests failed
    STOP

IF critical vulnerability exists
    STOP

IF artifact is invalid
    STOP

Isso é fail fast.

Descobriu cedo?

Pare cedo.

Porque existe uma matemática cruel:

erro descoberto no desenvolvimento
        ↓
barato

erro descoberto no teste
        ↓
mais caro

erro descoberto em produção
        ↓
War Room + pizza + café + 03:17

🔐 CAPÍTULO 7 — MORTY COLOCOU A SENHA NO JENKINSFILE

Rick abre o repositório:

environment {
    USER = "PRODADMIN"
    PASSWORD = "Morty123"
}

Silêncio.

Rick olha para Morty.

Morty olha para Rick.

Rick abre o portal.

😂

Segredos não devem ser hardcoded no código da pipeline.

Jenkins oferece mecanismos de credentials que permitem trabalhar com diferentes tipos de segredo e vinculá-los durante a execução. A documentação também alerta para os cuidados necessários com interpolação e exposição acidental em logs. (Jenkins)

Mas existe uma pegadinha.

Mascarar uma senha no log não transforma uma arquitetura insegura em arquitetura segura.

Precisamos combinar:

Secure storage
      +
Least privilege
      +
Credential scope
      +
Log hygiene
      +
Rotation
      +
Access control

Outra distinção importante:

ENVIRONMENT VARIABLE ≠ SECRET

Uma variável de ambiente pode conter um segredo.

Mas isso não significa que qualquer environment variable seja um mecanismo seguro para armazenamento de segredo.


📦 CAPÍTULO 8 — BUILD ONCE, PROMOTE MANY

Aqui aparece uma ideia maravilhosa.

Imagine:

DEV
 ↓
build A

TEST
 ↓
build B

UAT
 ↓
build C

PROD
 ↓
build D

Rick imediatamente perguntaria:

"Então exatamente o que vocês testaram?"

Essa pergunta destrói a arquitetura.

Porque se eu reconstruí o software entre ambientes, existe a possibilidade de diferenças em:

compiler
dependencies
configuration
timestamps
build environment
scripts
libraries

O modelo muito mais forte é:

SOURCE
   ↓
BUILD
   ↓
ARTIFACT X
   ↓
DEV
   ↓
TEST
   ↓
UAT
   ↓
PROD

O mesmo artefato vai sendo promovido.

A documentação atual da IBM para CI/CD em z/OS descreve explicitamente o artifact repository como peça que desacopla SCM dos ambientes de runtime e possibilita a prática de "Build once, deploy many". (IBM)

Agora conseguimos dizer:

APP       AUTHORIZATION
VERSION   4.7.2
COMMIT    a73fc91
BUILD     1842
ARTIFACT  auth-4.7.2-1842

Isso é rastreabilidade.


🧬 CAPÍTULO 9 — MAS COBOL TEM DEPENDÊNCIAS, RICK!

Exatamente.

Imagine:

COPY CARDREC.
COPY AUTHRESP.

O desenvolvedor altera:

CARDREC

Quem precisa ser recompilado?

É justamente aqui que o problema fica interessante no mainframe.

A IBM descreve o Dependency Based Build como solução para aplicações tradicionais z/OS, incluindo COBOL e PL/I, capaz de rastrear dependências e realizar builds integrados a workflows Git e ferramentas como Jenkins. (IBM)

Assim podemos imaginar:

Git commit
     ↓
Jenkins
     ↓
DBB
     ↓
Dependency Analysis
     ↓
Programs impacted
     ↓
Compile
     ↓
Link-edit
     ↓
Test

Em vez de:

"Alterou COPYBOOK? Compila tudo e reza."

A documentação IBM para DevOps em z/OS inclui no conceito de build justamente dependências, compilação, link-edit e testes unitários; ela posiciona DBB como ferramenta principal para essa parte específica do fluxo z/OS. (IBM)


🧙 CAPÍTULO 10 — O PIPELINE COBOL DA DIMENSÃO C-137

Agora podemos construir mentalmente algo muito interessante:

             DEVELOPER
                 │
                 ↓
                Git
                 │
              Webhook
                 │
                 ↓
              Jenkins
                 │
                 ↓
        Dependency Analysis
                 │
                 ↓
             IBM DBB
                 │
       ┌─────────┼─────────┐
       ↓         ↓         ↓
     COBOL      PL/I    Copybooks
       │
       ↓
    Compile
       │
       ↓
   Link-edit
       │
       ↓
   Unit Tests
       │
       ↓
 Static Analysis
       │
       ↓
 Security Gate
       │
       ↓
 Artifact Repository
       │
       ↓
       SIT
       │
       ↓
       UAT
       │
       ↓
 Approval Gate
       │
       ↓
  PRODUCTION
       │
       ↓
 Verification
       │
       ↓
 Observability

Isso não é "tirar o mainframe do passado".

É justamente o contrário.

É integrar IBM Z ao processo corporativo moderno.

A própria orientação IBM sobre DevOps para Z apresenta uma pipeline CI/CD baseada em componentes como serviço Git e DBB, buscando alinhar ferramentas, práticas e resultados com as demais plataformas da empresa. (IBM)


🛑 CAPÍTULO 11 — O BOTÃO VERMELHO CHAMADO APPROVAL

Automação não significa:

ninguém controla nada

Esse é outro mito.

Uma pipeline pode chegar até:

Deploy Production

e parar:

╔══════════════════════════════════════╗
║       PRODUCTION APPROVAL           ║
║                                    ║
║ Tests.................... PASSED    ║
║ Security................. PASSED    ║
║ Quality.................. PASSED    ║
║ Artifact................. SIGNED    ║
║ Change Ticket............ VALID     ║
║                                    ║
║       [ APPROVE ] [ REJECT ]        ║
╚══════════════════════════════════════╝

Isso é especialmente relevante em ambientes regulados.

Governança não precisa significar:

planilha
+
e-mail
+
telefonema
+
reunião
+
"quem tem a senha?"

Governança também pode virar código e evidência.


🚀 CAPÍTULO 12 — ROLLING, BLUE-GREEN E CANARY

Agora Rick abre três portais.

Rolling

Temos:

V1 V1 V1 V1

Vamos substituindo gradualmente:

V2 V1 V1 V1
V2 V2 V1 V1
V2 V2 V2 V1
V2 V2 V2 V2

Útil quando a arquitetura suporta substituição gradual.

Blue-Green

Temos dois ambientes:

BLUE  → V1 → ACTIVE

GREEN → V2 → READY

Testamos Green.

Depois:

TRAFFIC
   ↓
 GREEN

Se houver problema e as condições permitirem retorno:

TRAFFIC
   ↓
 BLUE

Canary

Liberamos V2 para pequena parcela:

95% → V1
 5% → V2

Observamos.

Depois:

75% → V1
25% → V2

Depois:

50 / 50

até eventualmente:

100% → V2

No mainframe, não devemos copiar esses modelos cegamente como se CICS fosse Kubernetes.

Mas princípios semelhantes podem ser implementados, dependendo da arquitetura, usando regiões, roteamento, APIs, gateways, feature flags, LPARs ou segmentação de tráfego.


💥 CAPÍTULO 13 — ROLLBACK NÃO É CTRL+Z

Aqui mora um monstro.

Aplicamos:

PROGRAM V1
       ↓
PROGRAM V2

Deu problema.

Então:

PROGRAM V1

Resolvido?

Talvez.

Agora imagine que V2 também mudou:

COPYBOOK
DB2 SCHEMA
MQ MESSAGE
CONFIGURATION
API CONTRACT
DATA

O programa antigo pode não entender mais o estado atual.

Por exemplo:

V1:
01 CUSTOMER.
   05 ID      PIC 9(08).
   05 STATUS  PIC X.

V2:

01 CUSTOMER.
   05 ID      PIC 9(08).
   05 STATUS  PIC X.
   05 RISK    PIC 9(03).

Dependendo de onde e como esse contrato é utilizado, voltar somente o executável pode criar outro problema.

Portanto:

Rollback é propriedade da arquitetura, não apenas comando da ferramenta de deployment.

Precisamos pensar em:

Code rollback
Data rollback
Schema rollback
Configuration rollback
Infrastructure rollback
Contract compatibility

Rick não inventaria o plano de fuga depois que a dimensão começasse a explodir.

Nós também não deveríamos.


🔥 CAPÍTULO 14 — RETRY NÃO É CURA UNIVERSAL

Pipeline falhou?

Alguém imediatamente propõe:

retry(5)

Rick pergunta:

"Por quê?"

Excelente pergunta.

Retry pode fazer sentido para uma falha transitória:

network timeout
temporary API failure
registry temporarily unavailable

Mas imagine:

COBOL COMPILATION ERROR

Retry.

Erro.

Retry.

Erro.

Retry.

Erro.

Você não criou resiliência.

Criou um computador extremamente persistente em provar cinco vezes que seu código está errado.

😂

Podemos pensar:

TRANSIENT FAILURE
      ↓
    RETRY

DETERMINISTIC FAILURE
      ↓
    INVESTIGATE

🕵️ CAPÍTULO 15 — RICK SANCHEZ VIRA ANALISTA DE ABEND

Pipeline:

FAILED

Isso é praticamente inútil sozinho.

Precisamos perguntar:

Onde?
Quando?
Qual stage?
Qual command?
Qual return code?
Qual agent?
Qual commit?
Qual artifact?
Qual dependency?

É exatamente a disciplina que o mainframer já conhece.

Imagine:

JOB FAILED

Tá.

E daí?

Queremos:

JOB
 ↓
STEP
 ↓
ABEND
 ↓
S0C7
 ↓
PROGRAM
 ↓
OFFSET
 ↓
FIELD
 ↓
RECORD
 ↓
ORIGIN

Ou seja:

SYMPTOM ≠ ROOT CAUSE

Um pipeline maduro precisa fornecer evidência suficiente para transformar:

"deu pau"

em:

Security stage failed
      ↓
dependency scan
      ↓
library X
      ↓
critical vulnerability
      ↓
version Y
      ↓
introduced by commit Z

Isso é investigação.


📊 CAPÍTULO 16 — OBSERVE A PRÓPRIA PIPELINE

Aqui existe um nível acima.

Não monitoramos apenas a aplicação.

Monitoramos a fábrica que produz a aplicação.

Podemos acompanhar:

Pipeline Success Rate
Build Duration
Queue Waiting Time
Deployment Frequency
Failure Rate
Rollback Rate
Mean Recovery Time
Flaky Tests
Agent Utilization
Approval Waiting Time

Imagine:

Checkout .......... 1 min
Build ............. 8 min
Tests ............ 14 min
Security .......... 5 min
Package ........... 2 min
Approval ..........32 min
Deploy ............ 7 min
Verify ............ 5 min

Tempo total:

74 minutos

Qual é o gargalo?

Compilador?

Não.

Jenkins?

Não.

Mainframe?

Não.

32 minutos esperando alguém aprovar.

Agora DevOps deixa de ser conversa sobre ferramenta e começa a revelar problemas do fluxo organizacional.

Isso é poderoso.


🧠 CAPÍTULO 17 — O QUE ESTAMOS REALMENTE VERSIONANDO?

Nos velhos tempos poderíamos pensar:

SOURCE CODE

Hoje estamos caminhando para algo muito maior:

Source Code
+
Build Definition
+
Tests
+
Infrastructure
+
Security Policies
+
Deployment Rules
+
Observability

Ou seja:

Não estamos versionando apenas o programa. Estamos tentando versionar o processo pelo qual esse programa nasce, é validado, autorizado, implantado e observado.

Esse é um dos aspectos mais interessantes de Pipeline as Code.

A documentação Jenkins trata o Jenkinsfile justamente como parte versionável do projeto, enquanto a IBM descreve pipelines z/OS combinando Git, DBB e outros componentes de CI/CD. (Jenkins)


🧓 CAPÍTULO 18 — O MAINFRAMER DE 1985 ENTRA NA GARAGEM DO RICK

Agora vem meu Easter Egg favorito.

Coloque um mainframer veterano diante destas expressões:

Pipeline as Code
Infrastructure as Code
Policy as Code
Immutable Artifact
Return Code
Dependency Management
Automated Scheduling
Audit Trail
Separation of Duties
Repeatable Build

Ele talvez fique alguns segundos em silêncio.

Tome um gole de café.

Olhe para Rick.

E diga:

"Então vocês passaram quarenta anos distribuindo tudo para finalmente descobrir que processos declarativos, controlados, auditáveis, repetíveis e cheios de return codes eram uma boa ideia?"

Rick olha para Morty.

Morty olha para Rick.

E ninguém responde.

☕😂

Naturalmente, mainframe tradicional e DevOps moderno são arquiteturas e ecossistemas profundamente diferentes.

Mas existe uma continuidade filosófica fascinante:

REPETIBILIDADE
CONTROLE
AUTOMAÇÃO
RASTREABILIDADE
EVIDÊNCIA

Isso sempre teve enorme valor em sistemas críticos.


🧪 EPÍLOGO — A PIPELINE NÃO TERMINA NO DEPLOY

Aqui está o erro que eu mais gostaria que um Junior Engineer evitasse.

Pensar:

DEPLOY SUCCESS

          FIM

Não.

Eu redesenharia mentalmente a última página do notebook assim:

                 SOURCE
                    ↓
                   GIT
                    ↓
                 JENKINS
                    ↓
             BUILD + TEST
                    ↓
                SECURITY
                    ↓
              QUALITY GATE
                    ↓
                ARTIFACT
                    ↓
              ENVIRONMENTS
                    ↓
                APPROVAL
                    ↓
               PRODUCTION
                    ↓
                 VERIFY
                    ↓
              OBSERVABILITY
                    ↓
          ┌───────────────────┐
          │ SYSTEM HEALTHY ?  │
          └─────────┬─────────┘
              YES   │   NO
               ↓    │    ↓
             DONE   │ RECOVERY
                    │    ↓
                    │ INVESTIGATION
                    │    ↓
                    │ ROOT CAUSE
                    │    ↓
                    └──→ FIX

Porque entregar software não significa apenas copiar um binário.

Significa conseguir demonstrar:

qual código foi utilizado, qual versão foi construída, quais testes foram executados, quais controles foram satisfeitos, qual artefato foi promovido, quem autorizou a mudança, onde ele foi implantado e o que aconteceu depois que usuários reais começaram a utilizá-lo.

É aí que Jenkins deixa de ser "aquele negócio que roda script".

Torna-se parte de uma cadeia de engenharia.

E quando trazemos isso para IBM Z, COBOL, CICS, Db2, MQ e sistemas de pagamentos, percebemos algo ainda mais interessante: não precisamos jogar fora décadas de disciplina operacional para adotar DevOps.

Podemos fazer justamente o contrário.

Podemos combinar:

DISCIPLINA DO MAINFRAME
          +
AUTOMAÇÃO DEVOPS
          +
PIPELINE AS CODE
          +
OBSERVABILIDADE
          =
ENTREGA MODERNA DE SISTEMAS CRÍTICOS

A documentação IBM atual recomenda uma abordagem CI/CD para z/OS que integra SCM baseado em Git, DBB e ferramentas corporativas de pipeline; DBB, inclusive, integra-se a Jenkins por CLI e suporta aplicações tradicionais COBOL e PL/I. (IBM)

E essa talvez seja a grande lição que Rick deixaria antes de desaparecer pelo portal:

"Morty, qualquer idiota consegue automatizar um deploy. Engenharia é automatizar as evidências de que aquilo deveria ter sido implantado — e saber exatamente como reagir quando não deveria."

☕🧪

No Bellacosa Mainframe, eu resumiria em uma frase ainda mais simples:

A PIPELINE NÃO TERMINA QUANDO O DEPLOY TERMINA.

Ela termina quando temos evidências suficientes de que a versão correta foi construída, testada, autorizada, implantada e continua funcionando corretamente em produção.

E se alguém discordar...

Rick já está carregando a portal gun. 🛸

terça-feira, 12 de maio de 2015

Como Não Se Perder no Mainframe (e Ainda Brilhar em Produção) ☕

 

Bellacosa Mainframe apresenta um manual de sobrevivencia para um padawan em mainframe

🔥 Manual de Sobrevivência do Programador COBOL Iniciante

Como Não Se Perder no Mainframe (e Ainda Brilhar em Produção) ☕

Entrar no mundo COBOL Mainframe é como desembarcar em uma usina nuclear em pleno funcionamento: tudo é estável, poderoso… e absolutamente implacável com erros.

Mas respire.

Milhões de profissionais passaram por isso antes — e sobreviveram muito bem 😄
Este é o guia que eu gostaria que todo iniciante recebesse no primeiro dia.


🧠 1) Entenda onde você está pisando

Você não está em um ambiente comum de desenvolvimento.

Aqui existem:

✔ Sistemas rodando há décadas
✔ Código crítico para negócios bilionários
✔ Processos batch noturnos gigantescos
✔ Auditoria pesada
✔ Zero tolerância para “gambiarras”

No Mainframe:

“Se funciona há 20 anos, mexa com extremo respeito.”


🖥️ 2) Domine o ecossistema antes da linguagem

COBOL sozinho não faz nada.
Você precisa entender o ambiente z/OS:

  • TSO/ISPF

  • JCL

  • Datasetes

  • JOBs batch

  • SDSF

  • Conceitos de spool

  • Bibliotecas PDS/PDSE

Sem isso, você fica perdido mesmo sabendo programar.


📜 3) Aprenda a ler código antigo (muito antigo)

Grande parte do seu trabalho inicial será manutenção.

Você verá:

😅 Variáveis com nomes estranhos
😅 GO TO espalhado
😅 Comentários de 1989
😅 Copybooks gigantes
😅 Lógica de negócio implícita

Dica de ouro:

👉 Comece pelo fluxo principal (MAIN-LOGIC)
👉 Siga os PERFORMs
👉 Ignore detalhes até entender o todo


🧱 4) Respeite os padrões da empresa

Cada organização tem seu próprio guia de estilo.

Nunca chegue “modernizando tudo”.

Faça primeiro:

✔ Entenda o padrão local
✔ Copie o estilo existente
✔ Siga nomenclaturas
✔ Use templates corporativos

No Mainframe, consistência vale mais que criatividade.


🧮 5) Entenda arquivos — eles são o coração do batch

Processamento batch gira em torno de datasets.

Você precisa dominar:

  • Sequential files

  • VSAM

  • Leitura e escrita

  • EOF (fim de arquivo)

  • Layouts de registro

  • Controle de erro

Um erro de layout pode destruir dados sem aviso.


🔁 6) PERFORM é seu melhor amigo

Evite ao máximo:

🚫 GO TO
🚫 Lógica confusa
🚫 Saltos imprevisíveis

Prefira fluxo estruturado:

✔ PERFORM UNTIL
✔ PERFORM VARYING
✔ Parágrafos bem nomeados

Código previsível é código seguro.


🧠 7) Use nomes que contam a história

Bons nomes reduzem metade do esforço de manutenção.

Compare:

❌ X1, X2, VARA
✔ WS-SALDO-CONTA
✔ FL-FIM-ARQUIVO
✔ CNT-REG-LIDOS

Se alguém entende sem perguntar, você venceu.


📦 8) COPYBOOKs são contratos

Copybooks definem layouts compartilhados.

Mexer neles pode impactar dezenas ou centenas de programas.

Antes de alterar:

⚠ Verifique dependências
⚠ Consulte responsáveis
⚠ Avalie impacto sistêmico

Alterar copybook sem análise é receita para incidente.


🛑 9) Teste como se produção dependesse disso

(porque depende)

Um JOB errado pode:

💸 Gerar pagamentos indevidos
📉 Corromper base de dados
📊 Produzir relatórios incorretos
🚨 Acionar auditoria

Teste cenários:

✔ Arquivo vazio
✔ Dados inválidos
✔ Limites máximos
✔ Exceções


📊 10) Leia o output do JOB — sempre

Após rodar, verifique:

  • Return codes

  • Mensagens

  • Contagem de registros

  • Warnings

  • Dumps

Nunca assuma que “deu certo”.


🧯 11) Aprenda a interpretar ABENDs

ABEND não é fracasso — é informação.

Códigos como:

  • S0C7 → erro numérico

  • S0C4 → acesso inválido de memória

  • S013 → problema de arquivo

Dominar isso acelera sua evolução absurdamente.


🤝 12) Faça amizade com operadores e analistas experientes

Mainframe é uma cultura colaborativa.

Operadores conhecem o comportamento real dos JOBs.
Veteranos conhecem os sistemas por dentro.

Uma conversa pode economizar dias de tentativa e erro.


⏳ 13) Tenha paciência — aprendizado é cumulativo

No início, tudo parece lento:

  • Compilar leva tempo

  • JOBs entram em fila

  • Ambientes são controlados

  • Mudanças passam por aprovação

Mas isso existe para garantir estabilidade.


☕ Filosofia final de sobrevivência

Ser programador COBOL não é apenas saber sintaxe.

É ser guardião de sistemas críticos.

Você está mantendo a infraestrutura invisível que faz o mundo financeiro e governamental funcionar.

“Se ninguém percebe seu trabalho, provavelmente está perfeito.”


⭐ Conclusão

O iniciante que sobrevive no Mainframe não é o mais brilhante — é o mais disciplinado.

Com o tempo, você descobrirá algo surpreendente:

👉 COBOL não é ultrapassado
👉 É simplesmente implacavelmente confiável

E dominar esse ambiente abre portas raras e valiosas.


quinta-feira, 17 de julho de 2014

🚀 CI/CD & DevOps

 

Bellacosa Mainframe apresenta CI CD e DEVOPS 

🚀 CI/CD & DevOps

Uma análise Bellacosa Mainframe (com história, bastidores e verdades inconvenientes)

“Automatize tudo. O que sobrar, automatize de novo.”
— Filosofia não oficial do DevOps

CI/CD não é moda, não é ferramenta, não é YAML bonito no GitHub.
É mudança cultural, redução de sofrimento humano e, principalmente, fim do deploy manual de sexta-feira às 18h.


🧠 CI e CD: irmãos, não gêmeos

🔁 Continuous Integration (CI)

CI nasceu para resolver um problema clássico:

“Funciona na minha máquina.”

CI é integração contínua de código, feita com:

  • branches curtas

  • commits frequentes

  • pull requests pequenos

  • testes automáticos

👉 Resultado?
Menos conflito, menos retrabalho e menos ódio entre desenvolvedores.

📌 Fases clássicas da CI

  • Plan – o que vamos fazer

  • Code – escrever o código

  • Build – compilar / empacotar

  • Test – validar automaticamente

💡 Dica Bellacosa:
Se seu pipeline de CI demora mais que um café passado na hora… algo está errado


🚚 Continuous Delivery (CD)

CD entra depois da CI, quando o código já funciona.

CD garante que:

  • o software esteja sempre pronto para produção

  • o deploy seja repetível, confiável e sem drama

  • humanos não fiquem clicando “Next, Next, Finish”

📌 Fases clássicas da CD

  • Release – versionamento

  • Deploy – entrega automatizada

  • Operate – operação e monitoramento

⚠️ Atenção:
CD ≠ Continuous Deployment

  • Delivery: pronto para produção

  • Deployment: vai direto para produção (sem pedir bênção)


🧬 CI/CD como código: o YAML que manda na sua vida

Quando pipelines viram código:

  • versionamento acontece

  • rollback fica fácil

  • auditoria fica feliz

🧾 GitHub Actions

📅 Lançamento: novembro de 2019

  • Já vem em todo repositório GitHub

  • Usa YAML

  • Marketplace recheado de actions prontas

📂 Estrutura clássica:

.github/ └── workflows/ └── pipeline.yml

💬 Comentário Bellacosa:
“Pipeline que não está versionado é script secreto de sysadmin disfarçado.”


🧑‍🤝‍🧑 Social Coding: menos ego, mais qualidade

CI/CD só funciona bem quando:

  • pull requests são pequenos

  • revisão é colaborativa

  • erro vira aprendizado, não caça às bruxas

📈 Benefícios reais:

  • código melhor

  • menos bugs em produção

  • mais confiança no deploy

🧠 Curiosidade:
Empresas que adotam CI de verdade fazem deploy dezenas de vezes por dia.
Quem não adota… faz change freeze 😬


🧱 Infraestrutura como Código (IaC)

📅 Conceito popularizado: ~2011 (com Puppet, Chef, depois Terraform)

IaC permite:

  • subir ambientes em minutos

  • destruir tudo e recriar sem chorar

  • versionar infraestrutura

💡 Dica de ouro:
Se você não consegue recriar seu ambiente do zero… você não controla seu ambiente.


⚙️ Tekton: CI/CD raiz, Kubernetes feelings

📅 Lançamento: 2018 (Knative Build → Tekton)

Tekton é:

  • CI/CD nativo Kubernetes

  • Declarativo

  • Baseado em CRDs

🧩 Conceitos-chave

  • Task – unidade de trabalho

  • Pipeline – encadeamento

  • Step – comando

  • Trigger – evento externo

  • PipelineRun – execução real

💬 Fofoquinha técnica:
Tekton é poderoso, mas não é para iniciantes.
Quem aprende… vira referência. Quem não aprende… chama de “complicado demais”.


🔄 GitOps & Argo CD: Git manda, cluster obedece

📅 Argo CD: 2018

GitOps segue um princípio simples:

“Se não está no Git, não existe.”

Argo CD:

  • observa o Git

  • compara com o cluster

  • reconcilia automaticamente

🔥 Easter Egg GitOps:
Deletou algo no cluster manualmente?
O Argo recria… sem pedir desculpa 😈


☁️ OpenShift Pipelines & GitOps

OpenShift:

  • integra Tekton nativamente

  • facilita CI/CD corporativo

  • conversa bem com Argo CD

📌 Padrões GitOps suportados:

  • On-Cluster Reconciler

  • External Reconciler

💬 Comentário Bellacosa:
Mainframe tinha controle, rastreabilidade e auditoria antes de ser cool.
DevOps só deu nome bonito.


🔐 Compliance contínua: segurança sem freio de mão

Pipeline moderno inclui:

  • scan de código

  • scan de imagem

  • gestão de segredos

  • trilha de auditoria

💡 Dica de sobrevivência:
Segurança manual não escala.
Compliance contínua sim.


🧨 Verdades inconvenientes (Bellacosa Edition)

  • Ferramenta não salva cultura ruim

  • CI quebrado diariamente não é CI

  • Pipeline lento é gargalo oculto

  • Deploy manual é dívida técnica

  • YAML sem comentário é armadilha futura


🧠 Conclusão Bellacosa Mainframe

CI/CD não é sobre:
❌ Jenkins
❌ GitHub Actions
❌ Tekton
❌ Argo CD

É sobre:
✅ previsibilidade
✅ automação
✅ qualidade
✅ confiança
✅ dormir tranquilo após o deploy

“O melhor deploy é aquele que ninguém percebe.”



segunda-feira, 3 de agosto de 2009

🔄 COBOL Batch no Mainframe: Checkpoint, Reprise e o Restart que salva a madrugada

 

Bellacosa Mainframe fala sobre restart em programa cobol mainframe

🔄 COBOL Batch no Mainframe: Checkpoint, Reprise e o Restart que salva a madrugada

“Batch não cai. Batch desmaia… e você tem que acordar ele do jeito certo.” ☕🧾🕒

No mundo distribuído, o povo reinicia “do zero” e chama isso de solução.
No Mainframe, isso é quase uma confissão de pecado técnico.

Quando dá ruim em batch, a pergunta não é “por que parou?” — isso é assunto pro pós-mortem.
A pergunta certa, ainda na especificação, é:

👉 Como eu reinicio?
👉 De onde eu reinicio?
👉 E o que eu garanto que não vai duplicar / corromper / relançar?

Bem-vindo ao trio de respeito:
checkpoint
reprise (restart)
reposicionamento (arquivo/DB2)


🧠 Checkpoint: o “save game” do batch (só que aqui vale dinheiro)

Checkpoint não é “vamos salvar porque sim”. É um ponto de consistência.

Ele serve pra:

  • memorizar onde o processamento estava (fase/etapa)

  • guardar posições de leitura (arquivos sequenciais, VSAM, cursores/chaves DB2)

  • fechar uma unidade lógica consistente (commit/rollback bem amarrado)

  • permitir retomada sem retrabalho e sem “efeito duplicado”

📌 Tradução Bellacosa:

Checkpoint é onde você consegue provar pro auditor que não inventou saldo no escuro.

⚠️ O pecado mortal: checkpoint mal posicionado

Checkpoint ruim é pior que nada, porque ele te dá uma falsa sensação de segurança.

Não coloque checkpoint:

  • no meio de uma atualização crítica

  • antes de terminar uma consistência lógica

  • em cada registro “porque sim” (CPU chorando, log estourando, IRLM te olhando feio)

Coloque checkpoint:

  • depois de um bloco lógico fechado (ex.: lote de N registros com commit)

  • quando “o mundo faz sentido” (estado consistente)

  • antes de uma parte custosa, mas não no meio da cirurgia


♻️ Reprise (Restart): o batch voltando “com memória”

Reprise é o batch saber voltar sem refazer o que já foi feito e sem duplicar o que não pode duplicar.

Ela é necessária especialmente quando:

  • o batch é longo (madrugada inteira)

  • tem DB2 update (conta, saldo, lançamento, baixa, contabilização)

  • o negócio não aceita “roda de novo e vê no que dá”

  • existe risco de duplicidade (dois lançamentos iguais = fogo no parquinho)

📌 Restart não é só “rodar outra vez”.
Restart é retomar a transação do negócio, com rastreabilidade.


🧷 Reposicionamento: o detalhe que separa homem de menino

Restart sem reposicionamento é “restart de brincadeira”.

Você precisa voltar exatamente:

  • no registro correto do arquivo

  • na chave correta do VSAM

  • no ponto certo do cursor DB2 (na prática: reiniciar lógica por chave/estado salvo)

🎯 O batch tem que saber:

  • qual fase estava executando

  • qual registro/chave estava sendo processado

  • qual unidade de commit já foi confirmada

  • qual parte não pode repetir


🧩 Arquitetura clássica de batch com reprise “de respeito”

Um ciclo bem resolvido (a operação agradece):

  1. Inicialização / parâmetros

  2. Validações

  3. Detecta reprise (rodada normal ou restart?)

  4. Carrega checkpoint (fase + posição + chaves)

  5. Reposiciona entradas (arquivo/DB2)

  6. Loop principal

    • regra de negócio

    • atualização (DB2/arquivos)

    • commit por unidade lógica

    • checkpoint em pontos definidos

  7. Finalização

  8. “Checkpoint final” (término normal)

📌 Easter egg de produção:

Se você não tem “checkpoint final de sucesso”, vai ter madrugada com restart de batch que já terminou — e ninguém acredita até acontecer.


🧨 O vilão silencioso: duplicidade

O inferno do batch não é “parar”.
O inferno é parar depois de atualizar metade.

Por isso, todo batch com reprise tem que decidir:

  • vou garantir idempotência? (rodar de novo não duplica)

  • vou garantir commit controlado? (unidades fechadas)

  • vou guardar marcador de processado? (chave/flag/tabela de controle)

✅ Padrões usados:

  • Tabela de controle com status por chave/lote

  • Commit a cada N registros (N definido por volume, log, tempo)

  • Chave de negócio + verificação (“já processei isso?”)

  • Writes “safe” (criar saída nova e só no final fazer swap/rename)


📂 “Nem todo batch precisa de reprise” (mas todo batch precisa de juízo)

Batch que só:

  • lê arquivo

  • gera relatório

  • faz sorting

  • produz uma saída recriável

…muitas vezes reexecutar resolve.

Só que:

  • nunca reexecute “por cima” de saída velha sem estratégia

  • garanta limpeza/geração atômica (work datasets → output final)

📌 Dica prática:

Use datasets temporários e só “promova” pro nome final no fim. Batch que morre não deixa meia saída fingindo que tá certa.


🧾 Dicas Bellacosa de restart que evitam velório

  • Checkpoint = fase + posição + contexto. Não guarde só o número do registro; guarde o porquê.

  • Mensagem clara no log: “RESTART AT STEP X / KEY Y / FILE POS Z”. Operação ama isso.

  • Commit e checkpoint têm que conversar: checkpoint sem commit consistente é cilada.

  • Se atualiza DB2, trate o restart como requisito de negócio, não “extra”.

  • Testar restart é obrigatório: simule abend no meio e valide se volta certo.


☕ Fechando no estilo madrugada

No Mainframe, reprise é arquitetura, checkpoint é disciplina, e restart é respeito.

Batch sem reprise em processo crítico é igual:

“depois eu vejo”
só que o “depois” geralmente é 03:17 com telefone tocando e gente jurando que “nunca aconteceu antes”.


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...