# ============================================================================= # GitLab CI/CD Pipeline - PostgreSQL Container Factory # ============================================================================= # # Build de imagem PostgreSQL customizada em formato eStargz. # Push para registry.kube.quest com lazy pulling habilitado. # # Requisitos: # - GitLab Runner com Docker-in-Docker (aula-11) # - BuildKit habilitado # # Uso: # 1. Criar grupo 'factory' no GitLab # 2. Criar projeto 'postgresql' dentro do grupo # 3. Copiar Dockerfile, postgresql.conf e este .gitlab-ci.yml # 4. Push para main - pipeline roda automaticamente # # ============================================================================= stages: - build - test - push variables: # Registry do GitLab (aula-10) REGISTRY: ${CI_REGISTRY} IMAGE_NAME: ${CI_PROJECT_PATH} POSTGRES_VERSION: "17" # BuildKit para suporte a eStargz DOCKER_BUILDKIT: "1" BUILDKIT_PROGRESS: plain # Docker-in-Docker TLS connection DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_CERT_PATH: "/certs/client" DOCKER_TLS_VERIFY: "1" # ============================================================================= # BUILD - Construir imagem em formato eStargz # ============================================================================= build: stage: build image: docker:24 services: - docker:24-dind before_script: # Aguardar Docker daemon estar pronto - until docker info; do sleep 1; done # Login no registry - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} # Configurar buildx com driver docker (usa daemon existente) - docker buildx create --name estargz-builder --driver docker --use || true - docker buildx inspect --bootstrap script: - echo "Building ${IMAGE_NAME}:${POSTGRES_VERSION}-${CI_COMMIT_SHA:0:8} with eStargz compression" # Build com formato eStargz - | docker buildx build \ --output type=image,name=${REGISTRY}/${IMAGE_NAME}:${POSTGRES_VERSION}-${CI_COMMIT_SHA:0:8},push=true,compression=estargz,force-compression=true,oci-mediatypes=true \ --label "org.opencontainers.image.revision=${CI_COMMIT_SHA}" \ --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ --label "org.opencontainers.image.source=${CI_PROJECT_URL}" \ --build-arg POSTGRES_VERSION=${POSTGRES_VERSION} \ . rules: - if: $CI_COMMIT_BRANCH == "main" - if: $CI_COMMIT_TAG tags: - kubernetes - docker # ============================================================================= # TEST - Testar imagem construída # ============================================================================= test: stage: test image: docker:24 services: - docker:24-dind before_script: - until docker info; do sleep 1; done - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} script: - echo "Testing PostgreSQL image..." # Iniciar container de teste - | docker run -d --name pg-test \ -e POSTGRES_PASSWORD=testpassword \ -e POSTGRES_DB=testdb \ ${REGISTRY}/${IMAGE_NAME}:${POSTGRES_VERSION}-${CI_COMMIT_SHA:0:8} # Aguardar inicialização (30s max) - | for i in $(seq 1 30); do if docker exec pg-test pg_isready -U postgres -d testdb 2>/dev/null; then echo "PostgreSQL ready!" break fi echo "Waiting for PostgreSQL... ($i/30)" sleep 1 done # Verificar healthcheck - docker exec pg-test pg_isready -U postgres -d testdb # Testar conexão e queries básicas - docker exec pg-test psql -U postgres -d testdb -c "SELECT version();" - docker exec pg-test psql -U postgres -d testdb -c "SHOW shared_buffers;" - docker exec pg-test psql -U postgres -d testdb -c "SHOW max_connections;" # Testar criação de tabela - docker exec pg-test psql -U postgres -d testdb -c "CREATE TABLE test (id serial PRIMARY KEY, name text);" - docker exec pg-test psql -U postgres -d testdb -c "INSERT INTO test (name) VALUES ('test');" - docker exec pg-test psql -U postgres -d testdb -c "SELECT * FROM test;" - docker exec pg-test psql -U postgres -d testdb -c "DROP TABLE test;" # Cleanup - docker stop pg-test && docker rm pg-test - echo "All tests passed!" needs: - build rules: - if: $CI_COMMIT_BRANCH == "main" - if: $CI_COMMIT_TAG tags: - kubernetes - docker # ============================================================================= # PUSH - Tag como versão e latest # ============================================================================= push: stage: push image: docker:24 services: - docker:24-dind before_script: - until docker info; do sleep 1; done - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} - docker buildx create --name estargz-builder --driver docker --use || true - docker buildx inspect --bootstrap script: - echo "Tagging and pushing final images..." # Re-tag como versão (17) - | docker buildx build \ --output type=image,name=${REGISTRY}/${IMAGE_NAME}:${POSTGRES_VERSION},push=true,compression=estargz,force-compression=true,oci-mediatypes=true \ --label "org.opencontainers.image.revision=${CI_COMMIT_SHA}" \ --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ . # Re-tag como latest - | docker buildx build \ --output type=image,name=${REGISTRY}/${IMAGE_NAME}:latest,push=true,compression=estargz,force-compression=true,oci-mediatypes=true \ --label "org.opencontainers.image.revision=${CI_COMMIT_SHA}" \ --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ . # Build versão GZIP (para benchmark) - | docker buildx build \ --output type=image,name=${REGISTRY}/${IMAGE_NAME}:${POSTGRES_VERSION}-gzip,push=true,compression=gzip,oci-mediatypes=true \ --label "org.opencontainers.image.revision=${CI_COMMIT_SHA}" \ --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ . - echo "Images pushed:" - echo " - ${REGISTRY}/${IMAGE_NAME}:${POSTGRES_VERSION} (eStargz)" - echo " - ${REGISTRY}/${IMAGE_NAME}:${POSTGRES_VERSION}-gzip (tradicional)" - echo " - ${REGISTRY}/${IMAGE_NAME}:latest (eStargz)" needs: - test rules: - if: $CI_COMMIT_BRANCH == "main" tags: - kubernetes - docker