An open API service indexing awesome lists of open source software.

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)

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.

![Visão Geral do Fluxo CI/CD](https://docs.gitlab.com/ee/ci/img/get_started_cicd_v16_11.png)

---

## **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_repo

echo "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: staging

deploy-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)