Junior
Fala sobre as principais etapas de CI/CD.
sobes.tech IA
Resposta da IA
Conceitualmente, o CI/CD divide-se em duas fases principais:
-
Integração Contínua (CI):
- Commit (Confirmação de alterações): Os desenvolvedores confirmam alterações num repositório de código comum (por exemplo, Git).
- Build (Construção): A construção da aplicação a partir do código fonte é iniciada automaticamente.
- Test (Testes): São executados testes automatizados (unitários, de integração, analisadores estáticos).
-
Entrega/Implantação Contínua (CD):
- Deploy em Staging: O artefato construído e testado com sucesso é implantado num ambiente intermédio (Stage), que simula produção.
- Testes de aceitação automatizados: São realizados testes de aceitação automatizados em Stage para verificar a lógica de negócio.
- Testes manuais/Exploratórios: São realizados testes manuais em Stage, se necessário.
- Deploy em Produção: Após passar por todas as etapas anteriores, o artefato é implantado em produção. Em Deployment Contínuo, esta etapa é totalmente automatizada. Em Entrega Contínua, pode ser necessária confirmação manual.
- Monitorização e feedback: Após o deploy, monitora-se o funcionamento em produção para identificar problemas e recolher feedback.
Aqui um exemplo de pipeline no Jenkinsfile:
// Jenkinsfile
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean install -DskipTests' // Exemplo de build Maven, pulando testes nesta fase
}
}
stage('Test') {
steps {
sh 'mvn test' // Execução de testes unitários e de integração
}
post {
always {
junit '**/TEST-*.xml' // Publicação dos resultados de testes
}
}
}
stage('Static Analysis') {
steps {
sh 'mvn sonar:sonar' // Exemplo de análise estática com SonarQube
}
}
stage('Build Docker Image') {
steps {
script {
docker.build("my-app:${env.BUILD_NUMBER}") // Construção da imagem Docker com a tag do número de build
}
}
}
stage('Deploy to Stage') {
steps {
sh 'ssh user@stage-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"' // Exemplo de deploy em Stage via SSH
}
}
stage('Acceptance Tests') {
steps {
sh 'run_acceptance_tests.sh' // Execução de testes de aceitação automáticos em Stage
}
}
stage('Deploy to Production') {
when {
environment name: 'CONTINUOUS_DEPLOYMENT', value: 'true' // Condição para deploy automático em Production
}
steps {
sh 'ssh user@prod-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"' // Deploy em Production
}
}
stage('Manual Approval for Production') { // Esta etapa pode ser incluída na Entrega Contínua
when {
environment name: 'CONTINUOUS_DEPLOYMENT', value: 'false'
}
steps {
input message: 'Deploy to Production?', ok: 'Deploy Now'
sh 'ssh user@prod-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"'
}
}
}
post {
failure {
mail to: 'devops@example.com', subject: "Build ${env.BUILD_NUMBER} Failed", body: "Build failed for ${env.JOB_NAME}" // Notificação de falha
}
success {
mail to: 'devops@example.com', subject: "Build ${env.BUILD_NUMBER} Succeeded", body: "Build succeeded for ${env.JOB_NAME}" // Notificação de sucesso
}
}
}
Principais diferenças entre Entrega Contínua e Implantação Contínua:
| Característica | Entrega Contínua | Implantação Contínua |
|---|---|---|
| Desploy em Produção | Requer confirmação manual | Totalmente automatizado |
| Frequência de deploys | Pode fazer deploy frequentemente | O deploy ocorre a cada mudança bem-sucedida |
| Estabilidade | Alta, mas com controlo manual | Máxima, com testes automatizados adequados |
| Riscos | Menores devido ao controlo manual | Maiores, mas reduzidos por testes abrangentes |
Cada etapa do pipeline deve ser automatizada e realizar sua tarefa específica.