https://github.com/erivandosena/pgd-petrvs-kubernetes
Pipeline CI/CD PGD Petrvs MGI em On-premises na Stack DevOps (GitLab CE, Kubernetes, Harbor, SonarQube, MinIO e Vault)
https://github.com/erivandosena/pgd-petrvs-kubernetes
ci-cd-pipeline gitlab-ce harbor kubernetes minio object on-premises pgd-petrvs s3-bucket sonarqube vault
Last synced: 7 months ago
JSON representation
Pipeline CI/CD PGD Petrvs MGI em On-premises na Stack DevOps (GitLab CE, Kubernetes, Harbor, SonarQube, MinIO e Vault)
- Host: GitHub
- URL: https://github.com/erivandosena/pgd-petrvs-kubernetes
- Owner: erivandosena
- License: mit
- Created: 2025-01-09T17:50:52.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2025-01-09T19:02:25.000Z (9 months ago)
- Last Synced: 2025-01-17T05:11:57.872Z (9 months ago)
- Topics: ci-cd-pipeline, gitlab-ce, harbor, kubernetes, minio, object, on-premises, pgd-petrvs, s3-bucket, sonarqube, vault
- Language: Shell
- Homepage:
- Size: 11.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# PGD-Petrvs com Kubernetes
Implementação de uma pipeline de CI/CD utilizando GitLab CE e Kubernetes em uma stack on-premises, usando o [PGD Petrvs MGI](https://github.com/gestaogovbr/pgd-petrvs-publico/releases/tag/2.3.3) como aplicação de referência. O projeto inclui integrações com Harbor, SonarQube, MinIO e Vault.

---
## **1. Estrutura do Repositório**
```
pgd-petrvs/
├── README.md
├── .gitlab-ci.yml # Pipeline CI/CD
├── k8s/ # Configurações Kubernetes
│ ├── production/
│ │ └── deployment-production.yaml
│ └── staging/
│ └── deployment-staging.yaml
├── scripts/ # Scripts auxiliares
│ ├── configure-vault.sh
│ ├── fetch-source-code.sh
│ └── minio-upload.sh
└── src/ # Código-fonte da aplicação
```---
## **2. Configuração do Ambiente**
1. **Kubernetes**
- Certifique-se de que o cluster Kubernetes está operacional e configurado corretamente no `kubeconfig.yaml`.
- Para acesso seguro ao cluster, utilize uma das opções abaixo:- **GitLab Agent para Kubernetes:** Configure o agente no cluster e no projeto do GitLab para uma comunicação segura. Veja mais em [GitLab Agent](https://docs.gitlab.com/ee/user/clusters/agent/).
- **HashiCorp Vault:** Armazene o arquivo `kubeconfig.yaml` no Vault e recupere-o dinamicamente durante o pipeline.
- **Variáveis Protegidas do GitLab:** Adicione o conteúdo do `kubeconfig.yaml` como uma variável protegida no GitLab.2. **Harbor**
- Configure as credenciais do Harbor no GitLab:
- `HARBOR_USERNAME`: Nome de usuário do Harbor.
- `HARBOR_PASSWORD`: Senha do Harbor.3. **MinIO**
- Configure as credenciais do MinIO no GitLab:
- `MINIO_ACCESS_KEY`: Chave de acesso do MinIO.
- `MINIO_SECRET_KEY`: Chave secreta do MinIO.4. **Vault**
- Configure o token do Vault:
- `VAULT_ROOT_TOKEN`: Token de root para interação inicial com o Vault.---
## **3. Fluxo CI/CD**
### **Etapas do Pipeline**
1. **Plan**:
- Valida dependências e configurações iniciais usando o script `configure-vault.sh`.2. **Create**:
- Clona o código-fonte do repositório utilizando `fetch-source-code.sh`.3. **Build**:
- Constrói as imagens Docker para staging e produção.
- Envia as imagens para o registro do Harbor.4. **Quality**:
- Executa análise de qualidade do código com SonarQube.5. **Secure**:
- Realiza escaneamento de vulnerabilidades nas imagens Docker.6. **Deploy**:
- Aplica os manifests Kubernetes para staging e produção.7. **Monitor**:
- Integração com ferramentas de monitoramento como Prometheus ou Grafana.---
## **4. Scripts Auxiliares**
### **4.1. fetch-source-code.sh**
Obter o código-fonte do repositório GitHub da aplicação conforme tag especificada.
Ele move o código-fonte para o diretório `src/` na estrutura do projeto.```bash
#!/bin/bash# Configurações
REPO_URL="https://github.com/gestaogovbr/pgd-petrvs-publico.git"
TAG="2.3.3"
DEST_DIR="pgd-petrvs/src"# Clonar o repositório
echo "Clonando o repositório..."
git clone $REPO_URL temp_repo
cd temp_repo || exit# Checkout da tag
echo "Obtendo o código-fonte da tag $TAG..."
git checkout tags/$TAG -b release-$TAG# Mover o código-fonte
echo "Movendo o código-fonte para $DEST_DIR..."
mkdir -p ../$DEST_DIR
cp -r . ../$DEST_DIR# Limpeza
cd ..
rm -rf temp_repoecho "Código-fonte movido com sucesso para $DEST_DIR."
```---
## **5. Implementação Segura no Pipeline CI/CD**
### **GitLab Agent para Kubernetes**
1. Instale o agente no cluster seguindo a [documentação oficial](https://docs.gitlab.com/ee/user/clusters/agent/).
2. Configure o agente no projeto GitLab.
3. Atualize o pipeline para usar o agente:```yaml
kubectl apply -f k8s/staging/deployment.yaml
kubectl apply -f k8s/staging/service.yaml
```### **HashiCorp Vault**
1. Armazene o `kubeconfig.yaml` no Vault.
2. Recupere-o durante o pipeline:```yaml
VAULT_TOKEN=$(vault login -token-only -method=approle -role-id="$VAULT_ROLE_ID" -secret-id="$VAULT_SECRET_ID")
vault kv get -format=json secret/k8s/kubeconfig > kubeconfig.yaml
```### **Opções de autenticação com Kubernetes On-premises**
No pipeline:```yaml
deploy-staging:
stage: deploy-staging
image: bitnami/kubectl:latest
script:
# Option 1: Use o agente GitLab para Kubernetes
- echo "Using GitLab Agent for Kubernetes"
- kubectl apply -f k8s/staging/deployment.yaml
- kubectl apply -f k8s/staging/service.yaml# Option 2: Recuperar kubeconfig do Vault (se necessário)
- echo "Retrieving kubeconfig from Vault"
- VAULT_TOKEN=$(vault login -token-only -method=approle -role-id="$VAULT_ROLE_ID" -secret-id="$VAULT_SECRET_ID")
- vault kv get -format=json secret/k8s/kubeconfig > kubeconfig.yaml# Option 3: Use variáveis protegidas por CI/CD do GitLab
- echo "$KUBECONFIG_CONTENT" > kubeconfig.yaml# Deploy with kubeconfig
- export KUBECONFIG=kubeconfig.yaml
- kubectl config use-context staging
- kubectl set image deployment/pgd-petrvs pgd-petrvs=dti-registro.domain.com/pgd-petrvs-publico-staging:$CI_COMMIT_SHORT_SHA
- kubectl apply -f k8s/staging/deployment.yaml
- kubectl apply -f k8s/staging/service.yaml
environment:
name: stagingdeploy-production:
stage: deploy-production
image: bitnami/kubectl:latest
script:
# Option 1: Use o agente GitLab para Kubernetes
- echo "Using GitLab Agent for Kubernetes"
- kubectl apply -f k8s/production/deployment.yaml
- kubectl apply -f k8s/production/service.yaml# Option 2: Recuperar kubeconfig do Vault (se necessário)
- echo "Retrieving kubeconfig from Vault"
- VAULT_TOKEN=$(vault login -token-only -method=approle -role-id="$VAULT_ROLE_ID" -secret-id="$VAULT_SECRET_ID")
- vault kv get -format=json secret/k8s/kubeconfig > kubeconfig.yaml# Option 3: Use variáveis protegidas por CI/CD do GitLab
- echo "$KUBECONFIG_CONTENT" > kubeconfig.yaml# Deploy com kubeconfig
- export KUBECONFIG=kubeconfig.yaml
- kubectl config use-context production
- kubectl set image deployment/pgd-petrvs pgd-petrvs=dti-registro.domain.com/pgd-petrvs-publico-production:$CI_COMMIT_SHORT_SHA
- kubectl apply -f k8s/production/deployment.yaml
- kubectl apply -f k8s/production/service.yaml
environment:
name: production
```---
## **6. Referências**
- [Documentação do GitLab CI/CD](https://docs.gitlab.com/ee/ci/)
- [Componentes do GitLab CI/CD](https://docs.gitlab.com/ee/ci/components/index.html)
- Consulte [documentação oficial relacionada](https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html) para referências adicionais.
- [Github PGD Petrvs e canais do MGI](https://github.com/gestaogovbr/pgd-petrvs-publico)